待解决问题
关于matlab中FFT函数的一些讨论 (进入论坛模式)
离问题结束还有0天0小时 |
提问者:popcorn_thomas
|
提问时间:2013-4-23 21:25
关于FFT变换后X(K)序列的值,于对应的真实频谱幅度之间的关系。
好容易在书上找到这么一小段话,再通过仿真验证,发现做FFT分析时,幅值大小与FFT选择的点数有关,一般来说,点数越多,对应的X(K)序列值越大。
A:对于非周期信号
用DFT计算非周期信号的傅氏变换时,用DFT计算所得的频谱分量乘以Ts, 就等于频谱的正常幅度电平;
用IDFT计算非周期信号的傅氏反变换,再乘以fs就得到所需信号的正常幅度电平。
所以,从时间到频率, 再从频率到时间,整个过程总共乘了Ts*fs=1。幅度电平未受到影响。
B:对于周期信号
用DFT计算周期信号的傅氏级数时,用DFT计算出的频谱分量乘以 1/N等于周期信号的频谱的正常幅度电平。
而用IDFT的计算结果乘以N才等于周期信号。
通过仿真,发现一个现象,比如说数据有效长度为NData, 做N点FFT变换。
如果NData<<N, 即需要补N-NData个零才能做运算时,得到的频谱的振幅值为大幅减小。
如果NData接近于N,即不需要补零,或者只需要补少量的0,频谱振幅值与真实值较为接近。
一般来看,做完FFT,x(K)*2/N后,与真实的频谱振幅值相比,都要小一点,不知道是为什么。
给原序列补0以后,相当于改变了原序列,可能会给原序列的频谱带来一些额外的频率成分。
大牛们快来指点一下,这些现象背后的真正原因是什么?对fft不熟哇!
好容易在书上找到这么一小段话,再通过仿真验证,发现做FFT分析时,幅值大小与FFT选择的点数有关,一般来说,点数越多,对应的X(K)序列值越大。
A:对于非周期信号
用DFT计算非周期信号的傅氏变换时,用DFT计算所得的频谱分量乘以Ts, 就等于频谱的正常幅度电平;
用IDFT计算非周期信号的傅氏反变换,再乘以fs就得到所需信号的正常幅度电平。
所以,从时间到频率, 再从频率到时间,整个过程总共乘了Ts*fs=1。幅度电平未受到影响。
B:对于周期信号
用DFT计算周期信号的傅氏级数时,用DFT计算出的频谱分量乘以 1/N等于周期信号的频谱的正常幅度电平。
而用IDFT的计算结果乘以N才等于周期信号。
通过仿真,发现一个现象,比如说数据有效长度为NData, 做N点FFT变换。
如果NData<<N, 即需要补N-NData个零才能做运算时,得到的频谱的振幅值为大幅减小。
如果NData接近于N,即不需要补零,或者只需要补少量的0,频谱振幅值与真实值较为接近。
一般来看,做完FFT,x(K)*2/N后,与真实的频谱振幅值相比,都要小一点,不知道是为什么。
给原序列补0以后,相当于改变了原序列,可能会给原序列的频谱带来一些额外的频率成分。
大牛们快来指点一下,这些现象背后的真正原因是什么?对fft不熟哇!
问题答案 ( 7 条 )
补0为什么会改变原序列呢?没有数据的地方不是原本就相当于0吗?
给原序列补0后做FFT相当于在频率域做了过采样。如果按所有点的能量总和来计算,补0后,虽然幅度降低了,但能量总和是不变的。 在实际的工程实现中,都不是按书上写的办法做,无论IFFT还是FFT都乘以1/sqrt(N)的系数。
看过陈大侠的《深入浅出通信原理》关于DFT的一相章节后,我感觉可以这么解释这个问题。所谓对一个序列做DFT,其物理意义的本质是对一个序列进行周期扩展,扩展成周期信号号,再求该离散周期信号的傅里叶系数。当然,该系数也是离散而周期的,取其主值区间,就是X(k)。
那么,如果对一个序列补0,相当于将一个信号后面加了多个零,然后再对这个新的“0拖尾”信号进行周期扩展。这个新的信号的频谱当然不同于原信号。
所以,这也就解释了为什么补零后,原信号的频谱会变的原因。
工程与理论确实有很大差距啊。问题是只思考理论问题的话,怎么也想得不太深入,如果有切实要解决的问题才能促进人进行深入思考。这也是为什么工程技术人员对某些细节特别熟悉的原因吧。
朋友说工程上做IFFT和FFT都会乘以sqrt(N),很奇妙。
在工程实现中,FFT和IFFT采用的是相同的电路或代码,只是配置参数不同而已。如果分别采用1/N或1为系数,也无法用。重点是,在数字实现时,主要都是整数定点实现的,只有数值的动态范围,基本上已经没有数值绝对大小的概念了。
我今天才想明白,如果正负变换都乘以1/sqrt(N),那么两次变换都成为酉变换,即一个序列的能量可以保持不变。如果书上的理论也全按这样来定义,那么帕斯瓦尔定理中,频域前面乘的1/N也可以去掉了,形式更简洁。
:victory: