IGO_AVR 发表于 2011-12-21 21:06:12

谁能说说DSPLIB里的FIR2函数

据我所知,FIR的实现就是卷积,我用卷积的方法做的FIR滤波器也确实可以用,但是用DSPLIB里的FIR2函数却不行,应该是我用法不多,可是我不知道怎么用,有人用过么?能否给个例程,谢谢!

IGO_AVR 发表于 2011-12-21 21:07:05

以下是利用卷积方式的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);
}

IGO_AVR 发表于 2011-12-21 21:08:54

以下是我按照上述程序改的调用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);
}

IGO_AVR 发表于 2011-12-21 21:10:28

回复【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

IGO_AVR 发表于 2011-12-21 21:12:35

请用过的朋友帮忙看看,麻烦了,再次谢过~

IGO_AVR 发表于 2011-12-21 21:16:57

按照我的理解,fir2函数应该是把输入数据x和系数h做卷积,结果放在r里面,和我前面的卷积法的区别只是一个采用Q15格式数据,一个采用浮点数,可是貌似调用结果完全不一致。。。
页: [1]
查看完整版本: 谁能说说DSPLIB里的FIR2函数