matlab中fft函数的一点理解

 

   看了一篇讲理解离散傅立叶变换(二. 实数形式离散傅立叶变换)的文章(本博客“文章”中有转载,点击该链接可以直接进入作者的博客),可是一直不大好理解。所以想用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的合成等式:

                        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。

 

 

 

posted @   木lin木  阅读(31618)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示