离散信号的FFT
- 我们知道一个信号的傅里叶变换就可以得到该信号的频谱,下面我们就通过matlab具体代码来感受这个过程。
实验分析
信号输入
t=0:0.01:2;
x=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)
plot(x);
- 通过上述代码我们画出一个频率f为50hz(相角-30度)和频率f=100hz(相角90度)叠加的信号。
下面我们对这个信号进行采样:
fs=256;N=256; %采样频率和数据点数 n=0:1:N-1;t=n/fs; %时间序列 x=1 + 2*cos(2*pi*50*t-pi*30/180) + 3*cos(2*pi*100*t + pi*60/180); %信号 figure, plot(t, x);
我们在这里设定采样频率为256hz, 选取256个采样点(方便计算机进行fft运算) 。我们把时间轴(横坐标)压缩到0到255/256这个范围之类。采样呢,就是相当于在连续函数y = 1 + 2*cos(2*pi*50*t-pi*30/180) + 3*cos(2*pi*100*t + pi*60/180)上, 从0秒开始,每隔1/256秒采集一个点,直到255/256秒结束,总共采集256个点的信息。
经过上述的采样后,一个连续的信号就被我们弄成了离散信号啦。相比较于原信号来说,经采样后的信息肯定有一点失真了,如果失真比较严重的话,自然要增加采样频率。
下面我们来对上面离散的信号做256点的fft
y=fft(x,N); %对信号进行快速Fourier变换
mag=abs(y); %求得Fourier变换后的振幅
f=n*fs/N; %频率序列
figure, plot(f,mag); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
这里我解释一下为什么频谱的横坐标设置成f=n*fs/N:我们要保证频谱的横坐标的单位是hz。试想采样频率是fs(hz),一共有N个采样点,那么每一点对应的采样频率的自然是fs/N(hz)啦。
- 上图是信号的幅频响应图,可见在频率为50和100赫兹时有很大的值,而其余接近为0。也就验证了信号的频率成分。
采样定理
- 这里的幅频响应为什么是对称的呢?离散信号的傅里叶变换时周期的,信号经过离散化(也就是采样)后,其频谱是原来信号频谱沿着采样频率左右搬移的结果,而这个搬移量就是采样频率fs,下面我们作图说明这点。
- 在这里我们不光能得到其频谱是周期的,同时观察其正半轴的频谱,还可以得到其第一个对称中心是采样频率的一半。结合之前信号的幅频响应图,由于我们设置的采样频率是256,所以对称中心就是128。
- 也许你会想到,如果采样频率过小。经过搬移后,和原信号的频谱不就会有重合吗?没错,下面我们画出经过不重叠且是最小的采样频率搬移的结果。
- 上图的采样频率确实是在不重叠的情况下最小的了,因为再小就重叠了。这里我们可以算出fs=2fmax。所以,要使采样后信号不重叠,其采样频率必须>=2fmax,这就是著名的采样定理。
ifft
回到我们对刚才的信号1 + 2*cos(2*pi*50*t-pi*30/180) + 3*cos(2*pi*100*t + pi*60/180)做fft的结果上去。我们知道其幅频响应会在50和100hz达到一个较大的值。我们观察经过fft后的第50个点的值:221.702503368816 - 128.000000000000i。
我们求得这个复数值的幅值为:√(221.7平方+128平方)=256
相角为:arctg(-128/221.7) = -30°
直流分量是fft后的值是256。
第100个点的复数算出的幅值是:384
像角是:180°直流分量的就是N,50hz对应的幅值为2*N/2,100hz对应的幅值为3*N/2。再根据相位信息我们就可以反推出原始信号啦。