看了一篇讲理解离散傅立叶变换(二. 实数形式离散傅立叶变换)的文章(本博客“文章”中有转载,点击该链接可以直接进入作者的博客),可是一直不大好理解。所以想用matlab验证一下,增强理解,顺便把验证的东西分享一下:
首先,FFT(快速傅里叶变换)是一种实现DFT(离散傅里叶变换)的快速算法,是利用复数形式的离散傅里叶变换来计算实数形式的离散傅里叶变换)。matlab中的fft函数是实现该算法的实现(所以其实这个实验的内容是帮助理解复数形式的离散傅里叶变换与实数形式的离散傅里叶变换之间的关系的)。
废话不多说,先用matlab计算一个信号x的fft:
>> x=[1 2 3 4];
>> y=fft(x)
y =
10.0000 -2.0000 + 2.0000i -2.0000 -2.0000 - 2.0000i
前面说的文章中提到DFT的合成等式:
但是,如何将fft得到的结果和公式中的内容对应起来?
文章还提到:
那fft中得到的y的复数结果究竟是ReX还是ReXbar?(其实是ReX)根据上面的公式,cos和sin的系数都是N/2+1个,可y中却有N个系数,其中的系数如何对应?
于是做了以下的验证:
我们知道,式中N=4;频率w=2π/N=1.5708;
>> rey=real(y)
rey =
10 -2 -2 -2
>> imy=imag(y)
imy =
0 2 0 -2
我们只取前(N/2+1=3)个系数,舍弃后面的系数,根据上面的转换公式,求出对应的系数:
>> reybar=[10/4 -2/2 -2/4]
reybar =
2.5000 -1.0000 -0.5000
同样求出imybar=[0 1 0],这样我们通过合成公式尝试着获得原来的x
x(0)的值为
>> 2.5*cos(w*0*0)-1*cos(w*0*1)-0.5*cos(w*0*2)+0*sin(w*0*0)-1*sin(w*0*1)+0*sin(w*0*2)
ans =
1
x(1)的值为
>> 2.5*cos(w*1*0)-1*cos(w*1*1)-0.5*cos(w*1*2)+0*sin(w*1*0)-1*sin(w*1*1)+0*sin(w*1*2)
ans =
2
同样求出,x(2),X(3)的值,恰好为 3和4,说明了上面的验证是正确的。
也就是说:
1.matlab中的fft是根据复数形式的DFT来计算的,求出来的值其实是对应的频率密度;
2.在已知输入信号x的周期N的条件下,只需fft结果中的前(N/2+1)个值就可以正确还原出原信号x。