[DSP编程] 请教一下关于FIR滤波器的程序问题

[复制链接]
2309|10
 楼主| jasonhjkl 发表于 2013-9-17 22:36 | 显示全部楼层 |阅读模式
我参照网上盛传的FIR滤波器程序,通过调整参数修改了模拟信号和模拟噪声的频率,生成了一个350Hz sin信号含50Hz cos噪声的信号源。通过以下程序进行处理。抽头系数为FDAT计算得出。FDAT设计时,采用blackman窗函数型设计的25阶带通滤波,通频带为100~1000Hz。
结果发现,50Hz低频信号滤除不掉,但修改噪声为4KHz时,可完全滤除。
请高手帮忙指点一下为什么会这样。谢谢。
  1. #include<math.h>

  2. #define FIRNUMBER 25
  3. #define SIGNAL1F 1000
  4. #define SIGNAL2F 4500
  5. #define SAMPLEF  10000
  6. #define PI 3.1415926

  7. float InputWave();
  8. float FIR();

  9. //float fHn[FIRNUMBER]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,
  10. //                       -0.018,0.049,-0.02,0.11,0.28,0.64,0.28,
  11. //                       -0.11,-0.02,0.049,-0.018,-0.009,0.01,
  12. //                       -0.002,-0.002,0.001,0.0,0.0
  13. //                     };
  14. float fHn[FIRNUMBER]={0.0,0.0,-0.001,-0.003,-0.009,-0.017,-0.022,
  15.                       -0.012,0.021,0.079,0.147,0.204,0.226,0.204,
  16.                       0.147,0.079,0.021,-0.012,-0.022,-0.017,-0.009,
  17.                       -0.003,-0.001,0.0,0.0
  18.                       };
  19. float fXn[FIRNUMBER]={ 0.0 };
  20. float fInput,fOutput;
  21. float fSignal1,fSignal2;
  22. float fStepSignal1,fStepSignal2;
  23. float f2PI;
  24. int i;
  25. float fIn[256],fOut[256];
  26. int nIn,nOut;

  27. main()
  28. {
  29.         nIn=0; nOut=0;
  30.         f2PI=2*PI;
  31.         fSignal1=0.0;
  32.         fSignal2=PI*0.1;
  33.         fStepSignal1=2*PI/30;
  34. //        fStepSignal2=2*PI*1.4;
  35.         fStepSignal2=2*PI/200;  /*1.4;*/
  36.         while ( 1 )
  37.         {
  38.                 fInput=InputWave();
  39.                 fIn[nIn]=fInput;
  40.                 nIn++; nIn%=256;
  41.                 fOutput=FIR();
  42.                 fOut[nOut]=fOutput;
  43.                 nOut++;                                /* 请在此句上设置软件断点 */
  44.                 if ( nOut>=256 )
  45.                 {
  46.                         nOut=0;               
  47.                 }
  48.         }
  49. }

  50. float InputWave()
  51. {
  52.         for ( i=FIRNUMBER-1;i>0;i-- )
  53.                 fXn[i]=fXn[i-1];
  54.         fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;
  55.         fSignal1+=fStepSignal1;
  56.         if ( fSignal1>=f2PI )        fSignal1-=f2PI;
  57.         fSignal2+=fStepSignal2;
  58.         if ( fSignal2>=f2PI )        fSignal2-=f2PI;
  59.         return(fXn[0]);
  60. }

  61. float FIR()
  62. {
  63.         float fSum;
  64.         fSum=0;
  65.         for ( i=0;i<FIRNUMBER;i++ )
  66.         {
  67.                 fSum+=(fXn[i]*fHn[i]);
  68.         }
  69.         return(fSum);
  70. }
 楼主| jasonhjkl 发表于 2013-9-17 22:37 | 显示全部楼层
fStepSignal1=2*PI/30;
fStepSignal2=2*PI/200;

通过以上两句代码修改了Sin和Cos的频率分别为350Hz及50Hz。
zhangmangui 发表于 2013-9-17 22:43 | 显示全部楼层
阶数在高一点呢
 楼主| jasonhjkl 发表于 2013-9-18 09:02 | 显示全部楼层
增加阶数感觉没有什么变化
 楼主| jasonhjkl 发表于 2013-9-18 13:31 | 显示全部楼层
请问有没有做过这方面的专家能给指点一下迷经?谢谢
zhangmangui 发表于 2013-9-20 12:22 | 显示全部楼层
FIR高手进来解答
拿起书本 发表于 2014-9-10 15:55 | 显示全部楼层
看一下滤波器的通带响应频谱,或者在调一下滤波参数。
846150568 发表于 2014-9-14 16:07 | 显示全部楼层
原程序就是一个低通滤波器,你改带通,设置合适的采样频率,阶数得自己再算,然后再求滤波器的脉冲响应
weqsd 发表于 2014-9-26 08:00 | 显示全部楼层
846150568 发表于 2014-9-14 16:07
原程序就是一个低通滤波器,你改带通,设置合适的采样频率,阶数得自己再算,然后再求滤波器的脉冲响应 ...

目前我也遇到这个问题,那带通的程序应该是什么样的?
七颗咖啡豆 发表于 2014-9-30 09:08 | 显示全部楼层
1.低通高通带通,理论上都是这个算法,,阶数用MATLAB自己生成的阶数,如果不用,你得看下你定的阶数的  幅频曲线在50HZ处是否很低。
2.两个频率信号需要加一个系数,把那个需要滤除的信号弄小点,在加一个直流分量比如3试试。
fXn[0]=3t+4*sin(2π*50*t/n)+8*cos(2π*350*t/n);n为采样率。n至少要大于2倍fXn[0]里面所含的最大信号


fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;这句话表达有错误,根本不是50HZ和350HZ的信号

七颗咖啡豆 发表于 2014-9-30 09:11 | 显示全部楼层
顺便求个N个2阶IIR级联的算法,上次弄了个一级联就出了问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部