zhoutianyue 发表于 2008-4-25 14:26

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,为什么振幅不一样了?请赐教

hcharlie 发表于 2008-4-25 14:36

当FFT结果表示频谱时,要除以N/2。
使用任何别人的程序,哪怕是最经典的软件,也要经过验证了才能用。

[ 本帖最后由 hcharlie 于 2008-4-25 14:38 编辑 ]

咕噜噜 发表于 2008-4-25 15:14

fft得到的并不是实际幅值,只是一个相对值

mayongtao 发表于 2008-5-25 20:09

这个问题非常的好!!!,这就是能量泄漏
这就是我们常说的能量泄漏,如果用于 fft 分析的数据段没有是所要分析频率的整数倍,那么就会产生能量泄漏,对这种信号请加平顶窗,加窗之后会有改善。

我曾今做过一个试验,分别对一个5.5个周期的正弦函数以及一个5个整周期的正弦函数进行福利叶变换,会发现5.5倍整周期做出的幅值要比整周期函数做出的幅值要小得多,这就是能量泄漏。

gh688 发表于 2008-5-25 21:07

这个问题其实2楼和3楼的解释是正确的,当FFT结果表示频谱时要除以2/N才能得到正确的幅值(单边谱)。
程序只要修改一点就可以了z=abs(y)*2/N;
当N=500时候得到的图形如下:

当N=1000时得到的图形如下:

可以看出频域的图形基本相同,由于这个例子里的信号频率60和150是频率分辨率(fs/N)的整数倍所以是整数采样。因此我认为不是能量的泄漏。

[ 本帖最后由 gh688 于 2008-5-25 21:25 编辑 ]

gzhy1986 发表于 2008-6-1 18:30

请问为什么需要除个N/2,还有就是直流分量除的是N??

gh688 发表于 2008-6-1 18:46

回复 6楼 的帖子

请问为什么需要除个N/2,
http://forum.vibunion.com/forum/viewthread.php?tid=43583&highlight=FFT
还有就是直流分量除的是N??
这个有问题吗?/N是为了得到正确的幅值,不除N也可以。

vampire101 发表于 2008-6-1 21:05

回复 7楼 的帖子

请问为什么要除呢,能不能从原理上说一下呢?fft不就是变换成幅频函数吗?如果除的话有没有前提条件呢?谢谢

gh688 发表于 2008-6-1 21:37

回复 8楼 的帖子

你看看这个帖子吧
http://forum.vibunion.com/forum/viewthread.php?tid=58673&highlight=FFT

hcharlie 发表于 2008-6-2 06:30

原帖由 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 编辑 ]

Skyboy 发表于 2008-6-2 10:59

温故而知新:lol

对于FFT变换,又有新的认识了!

vampire101 发表于 2008-6-2 11:32

谢谢各位的热情指教,受益匪浅啊!

forest23 发表于 2008-6-28 16:30

回复 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()两函数有什么区别?到底哪个方法是频谱分析呢?

ChaChing 发表于 2008-6-30 12:29

真巧, 前几天公司里小伙子刚问过类似问题
今天逛论坛即看到此主题
我会介绍小伙子看看学习

9527A 发表于 2008-7-4 20:44

回复 13楼 的帖子

abs ( ) 是求绝对值
conj( )   是求共轭复数与原序列乘积后得到功率值
页: [1] 2
查看完整版本: FFT变换时,为什么不同的采样点数会导致不同的振幅?