FFT变换时,为什么不同的采样点数会导致不同的振幅?
对一组离散数据进行FFT变换,采样频率一定(满足采样定理),当采样点数不同时,得到的幅频曲线中的幅值是不同的,这是为什么?如何理解呢?如下例:j将由两个频率为60HZ和150HZ的时域正玄叠加信号进行FFT变换。
fs=1000; %采样频率
N=500; %采样点数
t=(0:N-1)/fs;
f1=60;
f2=150;
s1=sin(2*pi*f1*t)+sin(2*pi*f2*t);
x=s1;
subplot(2,1,1);
plot(t,x);
y=fft(x);
z=abs(y);
f=(0:N/2-1)*fs/N;
subplot(2,1,2);
plot(f(1:N/2),z(1:N/2));
得到的幅频图为
若程序中采样点数N=1000;则幅频图为:
对于不同的采样点数N,为什么振幅不一样了?请赐教 当FFT结果表示频谱时,要除以N/2。
使用任何别人的程序,哪怕是最经典的软件,也要经过验证了才能用。
[ 本帖最后由 hcharlie 于 2008-4-25 14:38 编辑 ] fft得到的并不是实际幅值,只是一个相对值 这个问题非常的好!!!,这就是能量泄漏
这就是我们常说的能量泄漏,如果用于 fft 分析的数据段没有是所要分析频率的整数倍,那么就会产生能量泄漏,对这种信号请加平顶窗,加窗之后会有改善。
我曾今做过一个试验,分别对一个5.5个周期的正弦函数以及一个5个整周期的正弦函数进行福利叶变换,会发现5.5倍整周期做出的幅值要比整周期函数做出的幅值要小得多,这就是能量泄漏。 这个问题其实2楼和3楼的解释是正确的,当FFT结果表示频谱时要除以2/N才能得到正确的幅值(单边谱)。
程序只要修改一点就可以了z=abs(y)*2/N;
当N=500时候得到的图形如下:
当N=1000时得到的图形如下:
可以看出频域的图形基本相同,由于这个例子里的信号频率60和150是频率分辨率(fs/N)的整数倍所以是整数采样。因此我认为不是能量的泄漏。
[ 本帖最后由 gh688 于 2008-5-25 21:25 编辑 ] 请问为什么需要除个N/2,还有就是直流分量除的是N??
回复 6楼 的帖子
请问为什么需要除个N/2,http://forum.vibunion.com/forum/viewthread.php?tid=43583&highlight=FFT
还有就是直流分量除的是N??
这个有问题吗?/N是为了得到正确的幅值,不除N也可以。
回复 7楼 的帖子
请问为什么要除呢,能不能从原理上说一下呢?fft不就是变换成幅频函数吗?如果除的话有没有前提条件呢?谢谢回复 8楼 的帖子
你看看这个帖子吧http://forum.vibunion.com/forum/viewthread.php?tid=58673&highlight=FFT 原帖由 vampire101 于 2008-6-1 21:05 发表 http://www.chinavib.com/forum/images/common/back.gif
请问为什么要除呢,能不能从原理上说一下呢?fft不就是变换成幅频函数吗?如果除的话有没有前提条件呢?谢谢
程序是人编的,matlab的作者就是这样编的。
FFT以后除N变成数学谱,再IFFT不除N直接还原。
FFT以后除以N/2得物理谱。
你可以编一套软件,在软件里除好了N或N/2也可。
富氏变换原始公式中是要除2PI的,或许就是除N的原理吧,只不过软件中没有除要你自己去做而已。
抄一段书,大家自己体会吧。
[ 本帖最后由 hcharlie 于 2008-6-2 07:20 编辑 ] 温故而知新:lol
对于FFT变换,又有新的认识了! 谢谢各位的热情指教,受益匪浅啊!
回复 5楼 的帖子
我怎么觉得5楼的解释和图对应不起来,明显两个图都是N=1000的,看时域图就知道!这是笔误?还有,在对信号进行FFT时,matlab帮助上说:
1Calculate the magnitude of the FFT of a sequence. m = abs(y); % Magnitude
2 A common use of Fourier transforms is to find the frequency components of a signal buried in a noisy time domain signal.
The power spectrum, a measurement of the power at various frequencies, is
Pyy = Y.* conj(Y) / 512;
我想知道,在abs()和conjunction()两函数有什么区别?到底哪个方法是频谱分析呢? 真巧, 前几天公司里小伙子刚问过类似问题
今天逛论坛即看到此主题
我会介绍小伙子看看学习
回复 13楼 的帖子
abs ( ) 是求绝对值conj( ) 是求共轭复数与原序列乘积后得到功率值
页:
[1]
2