# 傅立叶转换
非周期性函数的频率成份是连续的,我们可使用傅立叶转换来计算其频率密度函数,假设时域函数为 ,其傅立叶转换公式如下:
一般在信号处理时,我们多使用快速傅立叶转换 (FFT) 来计算其频谱,使用快速傅立叶转换时,应牢记以下几个重点:
假设用来分析的信号段有 个点,且其取样间隔为 ,则此信号段总长为 ,且取样速度为 。
根据取样定理,可以观察的频率范围为 ,。
个时域点做 FFT 之后变成 个频域点,故频率解析度,亦即相邻频率点的间隔为 。
简单说,取样时间总长的倒数就是频率取样点之间的距离,也就是频率解析度。要记得取样速度的一半,是可观察的最大频率;取样总长的倒数是频率解析度。
如果是实函数的话,做完 FFT 之后,其正频率和负频率相对的值会是共轭复数。
我们现在来观察帽子函数的频谱,定义帽子函数 rect(t) 如下:
使用 MATLAB 观察其频谱步骤如下:
- 假设取样范围从-1.5到1.5,每隔0.1取一点,先计算时域信号:
t1 = -1.5:0.1:-0.6;
t2 = -0.4:0.1:0.4;
t3 = 0.6:0.1:1.5;
t = [t1 -0.5 t2 0.5 t3];
s = [zeros(size(t1)) 0.5 ones(size(t2)) 0.5 zeros(size(t3))];
plot(t, s);
1
2
3
4
5
6
2
3
4
5
6
这个程式片段写得有点繁琐,不过很容易理解,看一下结果是否正确。
- 计算频谱,直接使用 fft 函数将上面的时域信号转到频域,应注意转出来的结果为复数,我们先观察其振幅。
sf = fft(s);
plot(abs(sf));
1
2
2
注意在上面的程式中,画图时只给了y轴,横轴会是点数,得到的结果如下:
- 上面提过实函数的 FFT,其正频率和负频率相对的值是共轭复数。实际上我们现在看到的图形中,图的右半边应该移到负的那边去才对。MATLAB 里面有一个 fftshift 就做这事。另外,最大频率为取样率一半=5,间隔为总长倒数=1/3,我们要把横轴 (频率) 加上去。
sf = fft(s);
sf = abs(fftshift(sf));
f = -5:1/3:5;
plot(f, sf);
grid on;
1
2
3
4
5
2
3
4
5
最后得到修正的图如下,这个图形就是 sinc 函数的振幅。
完整程式码如下:
t1 = -1.5:0.1:-0.6;
t2 = -0.4:0.1:0.4;
t3 = 0.6:0.1:1.5;
t = [t1 -0.5 t2 0.5 t3];
s = [zeros(size(t1)) 0.5 ones(size(t2)) 0.5 zeros(size(t3))];
sf = fft(s);
sf = abs(fftshift(sf));
f = -5:1/3:5;
plot(f, sf);
grid on;
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
練習 4
请分析时域函数 rect 的频谱。