请教一下关于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);
}
fStepSignal1=2*PI/30;
fStepSignal2=2*PI/200;
通过以上两句代码修改了Sin和Cos的频率分别为350Hz及50Hz。 阶数在高一点呢 增加阶数感觉没有什么变化 请问有没有做过这方面的专家能给指点一下迷经?谢谢 FIR高手进来解答 看一下滤波器的通带响应频谱,或者在调一下滤波参数。 原程序就是一个低通滤波器,你改带通,设置合适的采样频率,阶数得自己再算,然后再求滤波器的脉冲响应 846150568 发表于 2014-9-14 16:07 static/image/common/back.gif
原程序就是一个低通滤波器,你改带通,设置合适的采样频率,阶数得自己再算,然后再求滤波器的脉冲响应 ...
目前我也遇到这个问题,那带通的程序应该是什么样的? 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的信号
顺便求个N个2阶IIR级联的算法,上次弄了个一级联就出了问题。
页:
[1]