zyy_ChinaVib 发表于 2012-3-1 17:05

如何用C语言实现汉宁窗

各位大侠,我需要在对时域数据x(n)做FFT变换之前如何实现汉宁窗的加窗操作,已知汉宁窗的表达式是0.5+0.5*cos(2*PI*n/(N-1)),在matlab中实现方法是:w=hanning(1024);
y=x.*w;(注:点数N=1024);上述两步用C代码实现如何办? 谢谢!

firecat_2 发表于 2012-3-5 15:58

回复 1 # zyy_ChinaVib 的帖子

首先 遇到这种问题第一步就是去CSDN等网站上找例子 可能不是hanning窗 其他窗都行 学习加窗的编程方法
第二部 对比matlab结果 测试C程序的结果是否正确。

zyy_ChinaVib 发表于 2012-3-6 08:01

回复 2 # firecat_2 的帖子

多谢大侠赐教!您提供了一个很好的思路。网上搜集了一个用C语言实现加窗操作时的汉宁窗表达式为:0.5*],其中 0<= n <=N-1; 通过一个循环语句实现1024点的汉宁窗,与matlab通过hanning(1024)生成的数据对比,发现二者之间有个误差,此误差呈正弦变化,幅值为0.002,不知原因为何?望赐教,多谢!

firecat_2 发表于 2012-3-6 09:03

回复 3 # zyy_ChinaVib 的帖子

你用matlab 不使用hanning函数试试 直接也用0.5*]在matlab中算一下
对比一下与谁相同如果是与matlab中的hanning函数相同那么可能就是编程语言带来的误差
要是与c得到的结果一样 那么就好好看看matlabhelp中对hanning的描述 或者看看hanning函数是怎么定义的

VibrationMaster 发表于 2012-3-6 21:02

建议用0.5*] 而不是0.5*]形式.
在MATLAB中, 这两种形式可选,但本人喜欢前者

zyy_ChinaVib 发表于 2012-3-7 07:50

回复 4 # firecat_2 的帖子

多谢!您不仅授人以鱼还授人以渔,我收获颇丰,谢谢!

zyy_ChinaVib 发表于 2012-3-7 07:53

回复 5 # VibrationMaster 的帖子

谢谢您的赐教。请问加窗操作是否就是窗中的每一个数和对应的原始采样数据做乘积运算?谢谢!

fnj1023 发表于 2012-3-7 09:31

回复 7 # zyy_ChinaVib 的帖子

你好,我现在在想做一个全相位FFT也碰到了这个问题,可以向您请教一下,可以加Q吗,836635149,不胜感激~~

VibrationMaster 发表于 2012-3-7 12:41

回复 7 # zyy_ChinaVib 的帖子

就是这样子

fnj1023 发表于 2012-3-7 15:11

回复 5 # VibrationMaster 的帖子

建议用0.5*] 而不是0.5*]形式.
在MATLAB中, 这两种形式可选,但本人喜欢前者

这个可以选择吗,matlab中直接用w=hanning(32)就可以产生32点汉宁窗了,现在我用C编的函数0.5*[1-cos[2*PI*n/N,N=32,和用matlab得到的点都不一样,这是怎么回事呢??

VibrationMaster 发表于 2012-3-7 18:30

MATLAB中help hanning
hanning()中可以带其它参数

gongyuan073 发表于 2019-1-18 13:30

本帖最后由 gongyuan073 于 2019-1-18 13:33 编辑

fnj1023 发表于 2012-3-7 15:11
回复 5 # VibrationMaster 的帖子

建议用0.5*] 而不是0.5*]形式.

/*
*函数名:hannWin
*说明:计算hannWin窗函数
*输入:
*其它:用过以后,需要手动释放掉*w的内存空间
*      调用示例:ret = hannWin(99, &w);
*/
dspErrorStatus    hannWin(dspUint_16 N, dspDouble **w)
{
   dspUint_16 n;
   dspDouble *ret;
   ret = (dspDouble *)malloc(N * sizeof(dspDouble));
   if(ret == NULL)
         return DSP_ERROR;

   for(n = 0; n < N; n++)
   {
         *(ret + n) = 0.5 * ( 1 - cos( 2 * PI * (dspDouble)n / (N - 1)));
   }

   *w = ret;

   return DSP_SUCESS;
}
https://www.cnblogs.com/mildsim/p/4067374.html
就是上边人家写的这个,可以在matlab里测试生成的结果,你看到matlab和人家写的函数有差别是因为matlab从1开始计数,更改一下就能看到是一样的,测试代码如下:
close all ;clc;clear all;

N = 64;
y1 = hann(N);

x1 = (0:N-1);
y2 = 0.5 * ( 1 - cos( 2 * pi * x1 / (N - 1)));

plot (x1, y1);
hold on;
plot(x1, y2);

legend('matlab','testHann')
页: [1]
查看完整版本: 如何用C语言实现汉宁窗