kalex 发表于 2008-4-2 10:10

问个关于MATLAB中FFT的问题

最近在用MATLAB中FFT的时候,看帮助文件,fft(x)实际上是做的是DFT,但据说内核还是用FFT的快速算法,当x为非2的整次幂的时候,比如说是6点,fft(x)的值与我补零操作后的fft(x,8)的值的前六点的值并不一样啊,照理讲,前六点的值不是一样的吗?

       虽然问题很傻,还是希望各位高手不吝赐教,万谢了

[ 本帖最后由 zhangnan3509 于 2008-4-2 22:20 编辑 ]

hcharlie 发表于 2008-4-2 15:35

本帖最后由 wdhd 于 2016-9-9 13:44 编辑

原帖由 kalex 于 2008-4-2 10:10 发表
最近在用MATLAB中FFT的时候,看帮助文件,fft(x)实际上是做的是DFT,但据说内核还是用FFT的快速算法,当x为非2的整次幂的时候,比如说是6点,fft(x)的值与我补零操作后的fft(x,8)的值的前六点的值并不一样啊,

把你的数据打出来比比看。
用别人的程序,哪怕是最经典的软件,也必须自己经过验证了解清楚以后才能正式使用。

[ 本帖最后由 hcharlie 于 2008-4-2 15:39 编辑 ]

kalex 发表于 2008-4-2 16:26

我比对过了,甚至手算过了,确实不一样,但我现在的困惑是为什么会不一样

hcharlie 发表于 2008-4-2 17:27

我认为6个点的DFT与补0以后8点的FFT结果不能一样,没有结果一样的理论。
先用手算或别的工具算出你的6点数据的标准DFT结果,再与你选用的经典软件的计算结果比较,一致了才能使用。
8点FFT结果也是这样。先看看标准数据是什么,然后再看你使用的工具计算结果。
”6点fft(x)的值与我补零操作后的fft(x,8)的值的前六点的值一样“这个结论至少有点冒失。

[ 本帖最后由 hcharlie 于 2008-4-2 17:29 编辑 ]

xray 发表于 2008-4-2 18:44

回复 楼主 的帖子

对于一个6点的序列 x(n),和将其补0以后形成的8点序列 x'(n),它们的DFT的结果在任何频点上都是一样的,这一点可以根据DFT的公式直接推导出来,要证明这个结论也很简单,直接根据DFT的公式编程计算即可。但是,x(n)的FFT的结果和x'(n)的FFT结果是不同的,原因是6点FFT计算的频率点是2pi*k/6 (k=0,1,...5),而8点FFT计算的频率点是2pi*k/8 (k=0,1,...7),它们计算的频率点不同,得到的结果自然不会相同。

kalex 发表于 2008-4-2 20:14

回复 5楼 的帖子

那我就不懂了,不是说FFT算法是DFT的快速算法吗,那既然结果不同,怎么可以用来做DFT的替代快速计算呢?

songzy41 发表于 2008-4-3 08:51

FFT算法是DFT的快速算法,所以可以先把FFT放一下。在4楼实际上已说得很清楚了,6点的DFT和8点的DFT是不同的,6点的DFT是计算2pi*k/6 (k=0,1,...5)这样6个频率,而8点的DFT是计算2pi*k/8 (k=0,1,...7)这样8个频率,计算的频率不同,对应的幅值当然不同(只有笫1点两者都对应0频率,数值相同)。

eguang8116 发表于 2008-4-3 11:00

2者的点数不一样,计算结果应该也不一样的
频率分辨率是不同的,即使相同了也是碰巧

kalex 发表于 2008-4-3 15:40

有点明白了,怪自己学习不精,谢谢各位帮我解惑了

dailiangren 发表于 2008-4-4 13:06

本帖最后由 wdhd 于 2016-9-9 13:44 编辑

原帖由 kalex 于 2008-4-3 15:40 发表
有点明白了,怪自己学习不精,谢谢各位帮我解惑了
fft(快速傅立叶变换)是dft(离散傅立叶变换)的快速算法
dft是dtft(离散时间傅立叶变换)的抽样(以2*pi/N为间隔)。

这样你可以发现,添零与不添零的序列的DTFT是一样的,
但是,dft却是不一样的,不一样的就是对dtft的采样间隔变窄了(因为添零后序列变长,N增大)
页: [1]
查看完整版本: 问个关于MATLAB中FFT的问题