当前位置:   article > 正文

常见窗函数C 实现_c语言有hann函数

c语言有hann函数

窗函数的作用

信号处理中,我们通常对信号进行截断分析,如果信号截断为非周期截断,那么频谱将发生泄露。通过加窗,可以减少频谱的泄露。我们可以这么想象,窗函数可以将一个非周期的信号,强行变成一个周期的信号。

1.blackman 窗函数实现

  1. void dsps_wind_blackman_f32(float *window, int len)
  2. {
  3. const float a0 = 0.42;
  4. const float a1 = 0.5;
  5. const float a2 = 0.08;
  6. float len_mult = 1/(float)(len-1);
  7. for (int i = 0; i < len; i++) {
  8. window[i] = a0 - a1 * cosf(i * 2 * M_PI * len_mult) + a2 * cosf(i * 4 * M_PI * len_mult);
  9. }
  10. }

2.Blackman-Harris window

  1. void dsps_wind_blackman_harris_f32(float *window, int len)
  2. {
  3. const float a0=0.35875;
  4. const float a1=0.48829;
  5. const float a2=0.14128;
  6. const float a3=0.01168;
  7. float len_mult = 1/(float)(len-1);
  8. for (int i = 0; i < len; i++) {
  9. window[i] = a0
  10. - a1 * cosf(i * 2 * M_PI * len_mult)
  11. + a2 * cosf(i * 4 * M_PI * len_mult)
  12. - a3 * cosf(i * 6 * M_PI * len_mult);
  13. }
  14. }

3.Blackman-Nuttall window

  1. void dsps_wind_blackman_nuttall_f32(float *window, int len)
  2. {
  3. const float a0=0.3635819;
  4. const float a1=0.4891775;
  5. const float a2=0.1365995;
  6. const float a3=0.0106411;
  7. float len_mult = 1/(float)(len-1);
  8. for (int i = 0; i < len; i++) {
  9. window[i] = a0
  10. - a1 * cosf(i * 2 * M_PI * len_mult)
  11. + a2 * cosf(i * 4 * M_PI * len_mult)
  12. - a3 * cosf(i * 6 * M_PI * len_mult);
  13. }
  14. }

4.Flat-Top window

  1. void dsps_wind_flat_top_f32(float *window, int len)
  2. {
  3. const float a0=0.21557895;
  4. const float a1=0.41663158;
  5. const float a2=0.277263158;
  6. const float a3=0.083578947;
  7. const float a4=0.006947368;
  8. float len_mult = 1/(float)(len-1);
  9. for (int i = 0; i < len; i++) {
  10. window[i] = a0
  11. - a1 * cosf(i * 2 * M_PI * len_mult)
  12. + a2 * cosf(i * 4 * M_PI * len_mult)
  13. - a3 * cosf(i * 6 * M_PI * len_mult)
  14. + a4 * cosf(i * 8 * M_PI * len_mult);
  15. }
  16. }

5.Hann window

  1. void dsps_wind_hann_f32(float *window, int len)
  2. {
  3. float len_mult = 1/(float)(len-1);
  4. for (int i = 0; i < len; i++) {
  5. window[i] = 0.5 * (1 - cosf(i * 2 * M_PI * len_mult));
  6. }
  7. }

6. Nuttall window

  1. void dsps_wind_nuttall_f32(float *window, int len)
  2. {
  3. const float a0=0.355768;
  4. const float a1=0.487396;
  5. const float a2=0.144232;
  6. const float a3=0.012604;
  7. float len_mult = 1/(float)(len-1);
  8. for (int i = 0; i < len; i++) {
  9. window[i] = a0
  10. - a1 * cosf(i * 2 * M_PI * len_mult)
  11. + a2 * cosf(i * 4 * M_PI * len_mult)
  12. - a3 * cosf(i * 6 * M_PI * len_mult);
  13. }
  14. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/104922
推荐阅读
相关标签
  

闽ICP备14008679号