libobo2000 发表于 2007-11-6 22:05

FFT加hanning窗的问题

本帖最后由 wdhd 于 2016-9-8 14:46 编辑

  用Matlab的库函数,可以这样写
  w=hanning(512);
  但是最后读到的数据,和用C编程出来的是不一样的,我的C程序就是按书上公式编写的。
  W(n)=0.5*(1-cos(2*pi*n/N)) n=0,1,.......N-1
  大家看看有什么问题,最后求FFT的幅值,怎样去消除hanning的影响?

yangzj 发表于 2007-11-6 22:16

matlab里改成 w=hanning(512,'periodic')看看

firecat_2 发表于 2007-11-6 22:26

回复 #2 yangzj 的帖子

请问 PREODIC 模式和对称模式什么区别?

yangzj 发表于 2007-11-6 22:50

回复 #3 firecat_2 的帖子

呵呵,顾名思义就行。
其是就是离散化的方式不一样,
W(n)=0.5*(1-cos(2*pi*n/N))      n=0,1,.......N-1,就是周期的。
W(n)=0.5*(1-cos(2*pi*n/(N+1)))      n=1,2,.......N

一般来说我都会用周期模式,它会有比较好的特性。因为经周期延拓后它与实际的Hanning窗完全一样

[ 本帖最后由 yangzj 于 2007-11-6 22:53 编辑 ]

libobo2000 发表于 2007-11-7 07:48

W(n)=0.5*(1-cos(2*pi*(n+1)/N))      n=0,1,2,.......N-1

libobo2000 发表于 2007-11-7 07:51

最后求FFT的幅值,怎样去消除hanning的影响?

yangzj 发表于 2007-11-7 08:03

回复 #6 libobo2000 的帖子

什么影响,是幅值减半了吗?乘上2就行了.

yangzj 发表于 2007-11-7 08:10

本帖最后由 wdhd 于 2016-9-8 14:47 编辑

原帖由 libobo2000 于 2007-11-7 07:48 发表
W(n)=0.5*(1-cos(2*pi*(n+1)/N))      n=0,1,2,.......N-1
你是说对称hanning窗用的是这个式子吗?这个不是对称窗,只是把周期Hanning窗住后移了一点而已.matlab里的对称hanning窗我昨天仔细看了下,用的是W(n)=0.5*(1-cos(2*pi*n/(N+1)))      n=1,2,.......N,实际上是取了长度为(N+1)/fs的hanning窗的中间N点 (fs为采样频率),舍掉了两端为0的点.而周期hanning窗是对长度为N/fs的窗取了前N点,舍掉了末端为0的点

libobo2000 发表于 2007-11-7 08:26

我看到一个程序上是这样写的,后来看下也不对,误差太大。我按照楼上的做了,乘2,也是不对
for(i=0;i<N;i++)
    {
    han_win=han_win*han_win;
    han_win_sum=han_win_sum+han_win;
    }
    han_win_sum=1/han_win_sum;
    //printf("han_win_sum:%f",han_win_sum);
    for(i=0;i<N;i++)//消除窗的影响
    {
   magnitude=magnitude*han_win_sum;//short fft output
    }

yangzj 发表于 2007-11-7 08:42

回复 #9 libobo2000 的帖子

这个求的应该是能量恢复系数。
把FFT的结果除以N再乘以4就是单边谱。这样幅值不对那是由于非整周期采样引起的频谱泄露造成的

witty01 发表于 2008-1-10 13:56

加hanning窗之后为什么fft的结果要乘4,不是乘2的吗

songzy41 发表于 2008-1-10 17:05

本帖最后由 wdhd 于 2016-9-8 14:47 编辑

原帖由 witty01 于 2008-1-10 13:56 发表
加hanning窗之后为什么fft的结果要乘4,不是乘2的吗
在加窗和FFT后单边谱的幅值(除N),矩形窗乘2,hanning窗乘4。
页: [1]
查看完整版本: FFT加hanning窗的问题