搜索
bottom↓
回复: 5

谁能说说DSPLIB里的FIR2函数

[复制链接]

出0入0汤圆

发表于 2011-12-21 21:06:12 | 显示全部楼层 |阅读模式
据我所知,FIR的实现就是卷积,我用卷积的方法做的FIR滤波器也确实可以用,但是用DSPLIB里的FIR2函数却不行,应该是我用法不多,可是我不知道怎么用,有人用过么?能否给个例程,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-12-21 21:07:05 | 显示全部楼层
以下是利用卷积方式的FIR滤波器

#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF  10000
#define PI 3.1415926

float InputWave();
float FIR();

float fHn[FIRNUMBER]={
-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[FIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[256]={0.0},fOut[256]={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[nIn]=0.0 ;
        while ( 1 )
        {
                fInput=InputWave();
                fIn[nIn]=fInput;
                nIn++; nIn%=256;
                fOutput=FIR();
                fOut[nOut]=fOutput;
                nOut++;                                /* break point */
                if ( nOut>=256 )
                {
                        nOut=0;               
                }
        }
}

float InputWave()
{
        for ( i=FIRNUMBER-1;i>0;i-- )
                fXn=fXn[i-1];
        fXn[0]=cos((double)fSignal1)+cos((double)fSignal2);
        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*fHn);
        }
        return(fSum);
}

出0入0汤圆

 楼主| 发表于 2011-12-21 21:08:54 | 显示全部楼层
以下是我按照上述程序改的调用FIR2函数滤波器:
#include <dsplib.h>
#include "fir.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.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[FIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[256]={0.0},fOut[256]={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[nIn]=0.0 ;
       
        for(j=0;j<64;j++)
        {   
             x[NX-1]=InputWave()*32768;                       
         fir2(x, h, r, db, NX, NH);
                                for ( i=0;i<NX-1;i++ )                       
                                {
                                        x=x[i+1];
                                }
        }
}

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

出0入0汤圆

 楼主| 发表于 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[NH]={
-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[NH+2] ;

#pragma DATA_SECTION(x,".dbuffer")
#pragma DATA_SECTION(r,".dbuffer")
DATA x[NX],r[NX];



#endif

出0入0汤圆

 楼主| 发表于 2011-12-21 21:12:35 | 显示全部楼层
请用过的朋友帮忙看看,麻烦了,再次谢过~

出0入0汤圆

 楼主| 发表于 2011-12-21 21:16:57 | 显示全部楼层
按照我的理解,fir2函数应该是把输入数据x和系数h做卷积,结果放在r里面,和我前面的卷积法的区别只是一个采用Q15格式数据,一个采用浮点数,可是貌似调用结果完全不一致。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 02:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表