jasonhjkl 发表于 2013-9-17 22:36

请教一下关于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 SAMPLEF10000
#define PI 3.1415926

float InputWave();
float FIR();

//float fHn={ 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={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={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn,fOut;
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=fInput;
                nIn++; nIn%=256;
                fOutput=FIR();
                fOut=fOutput;
                nOut++;                                /* 请在此句上设置软件断点 */
                if ( nOut>=256 )
                {
                        nOut=0;               
                }
        }
}

float InputWave()
{
        for ( i=FIRNUMBER-1;i>0;i-- )
                fXn=fXn;
        fXn=sin(fSignal1)+cos(fSignal2)/6.0;
        fSignal1+=fStepSignal1;
        if ( fSignal1>=f2PI )        fSignal1-=f2PI;
        fSignal2+=fStepSignal2;
        if ( fSignal2>=f2PI )        fSignal2-=f2PI;
        return(fXn);
}

float FIR()
{
        float fSum;
        fSum=0;
        for ( i=0;i<FIRNUMBER;i++ )
        {
                fSum+=(fXn*fHn);
        }
        return(fSum);
}

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 static/image/common/back.gif
原程序就是一个低通滤波器,你改带通,设置合适的采样频率,阶数得自己再算,然后再求滤波器的脉冲响应 ...

目前我也遇到这个问题,那带通的程序应该是什么样的?

七颗咖啡豆 发表于 2014-9-30 09:08

1.低通高通带通,理论上都是这个算法,,阶数用MATLAB自己生成的阶数,如果不用,你得看下你定的阶数的幅频曲线在50HZ处是否很低。
2.两个频率信号需要加一个系数,把那个需要滤除的信号弄小点,在加一个直流分量比如3试试。
fXn=3t+4*sin(2π*50*t/n)+8*cos(2π*350*t/n);n为采样率。n至少要大于2倍fXn里面所含的最大信号


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

七颗咖啡豆 发表于 2014-9-30 09:11

顺便求个N个2阶IIR级联的算法,上次弄了个一级联就出了问题。
页: [1]
查看完整版本: 请教一下关于FIR滤波器的程序问题