打印
[DSP编程]

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

[复制链接]
1982|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jasonhjkl|  楼主 | 2013-9-17 22:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我参照网上盛传的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.1415926

float 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[i]=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[i]*fHn[i]);
        }
        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 | 只看该作者
增加阶数感觉没有什么变化

使用特权

评论回复
5
jasonhjkl|  楼主 | 2013-9-18 13:31 | 只看该作者
请问有没有做过这方面的专家能给指点一下迷经?谢谢

使用特权

评论回复
6
zhangmangui| | 2013-9-20 12:22 | 只看该作者
FIR高手进来解答

使用特权

评论回复
7
拿起书本| | 2014-9-10 15:55 | 只看该作者
看一下滤波器的通带响应频谱,或者在调一下滤波参数。

使用特权

评论回复
8
846150568| | 2014-9-14 16:07 | 只看该作者
原程序就是一个低通滤波器,你改带通,设置合适的采样频率,阶数得自己再算,然后再求滤波器的脉冲响应

使用特权

评论回复
9
weqsd| | 2014-9-26 08:00 | 只看该作者
846150568 发表于 2014-9-14 16:07
原程序就是一个低通滤波器,你改带通,设置合适的采样频率,阶数得自己再算,然后再求滤波器的脉冲响应 ...

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

使用特权

评论回复
10
七颗咖啡豆| | 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的信号

使用特权

评论回复
11
七颗咖啡豆| | 2014-9-30 09:11 | 只看该作者
顺便求个N个2阶IIR级联的算法,上次弄了个一级联就出了问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝