首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教一下关于FIR滤波器的程序问题

请教一下关于FIR滤波器的程序问题

我参照网上盛传的FIR滤波器程序,通过调整参数修改了模拟信号和模拟噪声的频率,生成了一个350Hz sin信号含50Hz cos噪声的信号源。通过以下程序进行处理。抽头系数为FDAT计算得出。FDAT设计时,采用blackman窗函数型设计的25阶带通滤波,通频带为100~1000Hz。
结果发现,50Hz低频信号滤除不掉,但修改噪声为4KHz时,可完全滤除。
请高手帮忙指点一下为什么会这样。谢谢。#include<math.h>#define FIRNUMBER 25#define SIGNAL1F 1000#define SIGNAL2F 4500#define SAMPLEF  10000#define PI 3.1415926float InputWave();float FIR();//float fHn[FIRNUMBER]={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,//                       -0.018,0.049,-0.02,0.11,0.28,0.64,0.28,//                       -0.11,-0.02,0.049,-0.018,-0.009,0.01,//                       -0.002,-0.002,0.001,0.0,0.0//                     };float fHn[FIRNUMBER]={0.0,0.0,-0.001,-0.003,-0.009,-0.017,-0.022,                      -0.012,0.021,0.079,0.147,0.204,0.226,0.204,                      0.147,0.079,0.021,-0.012,-0.022,-0.017,-0.009,                      -0.003,-0.001,0.0,0.0                      };float fXn[FIRNUMBER]={ 0.0 };float fInput,fOutput;float fSignal1,fSignal2;float fStepSignal1,fStepSignal2;float f2PI;int i;float fIn[256],fOut[256];int nIn,nOut;main(){        nIn=0; nOut=0;        f2PI=2*PI;        fSignal1=0.0;        fSignal2=PI*0.1;        fStepSignal1=2*PI/30;//        fStepSignal2=2*PI*1.4;        fStepSignal2=2*PI/200;  /*1.4;*/        while ( 1 )        {                fInput=InputWave();                fIn[nIn]=fInput;                nIn++; nIn%=256;                fOutput=FIR();                fOut[nOut]=fOutput;                nOut++;                                /* 请在此句上设置软件断点 */                if ( nOut>=256 )                {                        nOut=0;                                }        }}float InputWave(){        for ( i=FIRNUMBER-1;i>0;i-- )                fXn=fXn[i-1];        fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;        fSignal1+=fStepSignal1;         if ( fSignal1>=f2PI )        fSignal1-=f2PI;        fSignal2+=fStepSignal2;        if ( fSignal2>=f2PI )        fSignal2-=f2PI;        return(fXn[0]);}float FIR(){        float fSum;        fSum=0;        for ( i=0;i<FIRNUMBER;i++ )        {                fSum+=(fXn*fHn);        }        return(fSum);}
返回列表