谁能说说DSPLIB里的FIR2函数
据我所知,FIR的实现就是卷积,我用卷积的方法做的FIR滤波器也确实可以用,但是用DSPLIB里的FIR2函数却不行,应该是我用法不多,可是我不知道怎么用,有人用过么?能否给个例程,谢谢! 以下是利用卷积方式的FIR滤波器#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF10000
#define PI 3.1415926
float InputWave();
float FIR();
float fHn={
-0.00078303
,0.002611
,0.0013964
,-0.0073102
,-0.0030747
,0.018725
,0.0053807
,-0.041538
,-0.0076979
,0.091616
,0.0093997
,-0.3139
,0.49116
,-0.3139
,0.0093997
,0.091616
,-0.0076979
,-0.041538
,0.0053807
,0.018725
,-0.0030747
,-0.0073102
,0.0013964
,0.002611
,-0.00078303
};
float fXn={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn={0.0},fOut={0.0};
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/4;
for(nIn=0;nIn<25;nIn++)
fXn=0.0 ;
while ( 1 )
{
fInput=InputWave();
fIn=fInput;
nIn++; nIn%=256;
fOutput=FIR();
fOut=fOutput;
nOut++; /* break point */
if ( nOut>=256 )
{
nOut=0;
}
}
}
float InputWave()
{
for ( i=FIRNUMBER-1;i>0;i-- )
fXn=fXn;
fXn=cos((double)fSignal1)+cos((double)fSignal2);
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);
} 以下是我按照上述程序改的调用FIR2函数滤波器:
#include <dsplib.h>
#include "fir.h"
#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF10000
#define PI 3.1415926
float InputWave();
float FIR();
float fHn={
-0.00078303
,0.002611
,0.0013964
,-0.0073102
,-0.0030747
,0.018725
,0.0053807
,-0.041538
,-0.0076979
,0.091616
,0.0093997
,-0.3139
,0.49116
,-0.3139
,0.0093997
,0.091616
,-0.0076979
,-0.041538
,0.0053807
,0.018725
,-0.0030747
,-0.0073102
,0.0013964
,0.002611
,-0.00078303
};
float fXn={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn={0.0},fOut={0.0};
int nIn,nOut;
main()
{
int i,j;
nIn=0; nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI/8;
for(nIn=0;nIn<25;nIn++)
fXn=0.0 ;
for(j=0;j<64;j++)
{
x=InputWave()*32768;
fir2(x, h, r, db, NX, NH);
for ( i=0;i<NX-1;i++ )
{
x=x;
}
}
}
float InputWave()
{
for ( i=FIRNUMBER-1;i>0;i-- )
fXn=fXn;
fXn=(cos((double)fSignal1)+cos((double)fSignal2))/2;
fSignal1+=fStepSignal1;
if ( fSignal1>=f2PI ) fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if ( fSignal2>=f2PI ) fSignal2-=f2PI;
return(fXn);
} 回复【2楼】IGO_AVR
-----------------------------------------------------------------------
h系数在头文件里定义,fft.h文件内容如下:
#ifndef fir_h
#define fir_h
#include <math.h>
#include "tms320.h"
#include "dsplib.h"
#define NX 64
#define NH 64
#pragma DATA_SECTION(h,".coeffs")
DATA h={
-42,
-131,
-238,
-374,
-546,
-757,
-1004,
-1275,
-1550,
-1801,
-1992,
-2082,
-2024,
-1770,
-1277,
-502,
583,
2000,
3751,
5827,
8198,
10817,
13621,
16534,
19467,
22325,
25009,
27421,
29474,
31088,
32200,
32767,
32767,
32200,
31088,
29474,
27421,
25009,
22325,
19467,
16534,
13621,
10817,
8198,
5827,
3751,
2000,
583,
-502,
-1277,
-1770,
-2024,
-2082,
-1992,
-1801,
-1550,
-1275,
-1004,
-757,
-546,
-374,
-238,
-131,
-42
};
#pragma DATA_SECTION(db,".dbuffer")
DATA db ;
#pragma DATA_SECTION(x,".dbuffer")
#pragma DATA_SECTION(r,".dbuffer")
DATA x,r;
#endif 请用过的朋友帮忙看看,麻烦了,再次谢过~ 按照我的理解,fir2函数应该是把输入数据x和系数h做卷积,结果放在r里面,和我前面的卷积法的区别只是一个采用Q15格式数据,一个采用浮点数,可是貌似调用结果完全不一致。。。
页:
[1]