声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 11002|回复: 11

[健康监测] 如何用C语言实现汉宁窗

[复制链接]
发表于 2012-3-1 17:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2012-3-5 15:58 | 显示全部楼层
回复 1 # zyy_ChinaVib 的帖子

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

 楼主| 发表于 2012-3-6 08:01 | 显示全部楼层
回复 2 # firecat_2 的帖子

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

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

评分

1

查看全部评分

发表于 2012-3-6 21:02 | 显示全部楼层
建议用0.5*[1-cos[2*PI*n/N]] 而不是0.5*[1-cos[2*PI*n/(N-1)]]形式.
在MATLAB中, 这两种形式可选,但本人喜欢前者
 楼主| 发表于 2012-3-7 07:50 | 显示全部楼层
回复 4 # firecat_2 的帖子

多谢!您不仅授人以鱼还授人以渔,我收获颇丰,谢谢!
 楼主| 发表于 2012-3-7 07:53 | 显示全部楼层
回复 5 # VibrationMaster 的帖子

谢谢您的赐教。请问加窗操作是否就是窗中的每一个数和对应的原始采样数据做乘积运算?谢谢!
发表于 2012-3-7 09:31 | 显示全部楼层
回复 7 # zyy_ChinaVib 的帖子

你好,我现在在想做一个全相位FFT也碰到了这个问题,可以向您请教一下,可以加Q吗,836635149,不胜感激~~
发表于 2012-3-7 12:41 | 显示全部楼层
回复 7 # zyy_ChinaVib 的帖子

就是这样子
发表于 2012-3-7 15:11 | 显示全部楼层
回复 5 # VibrationMaster 的帖子

建议用0.5*[1-cos[2*PI*n/N]] 而不是0.5*[1-cos[2*PI*n/(N-1)]]形式.
在MATLAB中, 这两种形式可选,但本人喜欢前者

这个可以选择吗,matlab中直接用w=hanning(32)就可以产生32点汉宁窗了,现在我用C编的函数0.5*[1-cos[2*PI*n/N,N=32,和用matlab得到的点都不一样,这是怎么回事呢??
发表于 2012-3-7 18:30 | 显示全部楼层
MATLAB中help hanning
hanning()中可以带其它参数
发表于 2019-1-18 13:30 | 显示全部楼层
本帖最后由 gongyuan073 于 2019-1-18 13:33 编辑
fnj1023 发表于 2012-3-7 15:11
回复 5 # VibrationMaster 的帖子

建议用0.5*[1-cos[2*PI*n/N]] 而不是0.5*[1-cos[2*PI*n/(N-1)]]形式.
  1. /*
  2.   *函数名:hannWin
  3.   *说明:计算hannWin窗函数
  4.   *输入:
  5.   *其它:用过以后,需要手动释放掉*w的内存空间
  6.   *        调用示例:ret = hannWin(99, &w);
  7.   */
  8. dspErrorStatus    hannWin(dspUint_16 N, dspDouble **w)
  9. {
  10.      dspUint_16 n;
  11.      dspDouble *ret;
  12.      ret = (dspDouble *)malloc(N * sizeof(dspDouble));
  13.      if(ret == NULL)
  14.          return DSP_ERROR;

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

  19.      *w = ret;

  20.      return DSP_SUCESS;
  21. }
复制代码

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

  2. N = 64;
  3. y1 = hann(N);

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

  6. plot (x1, y1);
  7. hold on;
  8. plot(x1, y2);

  9. legend('matlab','testHann')
复制代码
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-3-29 19:11 , Processed in 0.414057 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表