TI中文支持网
TI专业的中文技术问题搜集分享网站

FIR滤波器程序

因项目需要,我需要做个FIR滤波器程序,可是根据参考程序,自己设计的还是不行,今天实在没有办法了,把程序重要部分贴上来,大家帮我解答一下吧,谢谢了!!

#include "DSP28_Device.h"

#include"math.h"

//FIR相关参数初始化

#define Pi          3.1415926    //圆周率系数

#define  SampleNum   200       //AD采样个数

#define WindowNum   25         //窗函数长度为25    τ(延迟时间)=(25-1)/2

#define DelayTime   WindowNum/2       //即专业术语   τ(延迟时间)

 

//下面这个函数就是求FIR系数的函数,我定义是25阶的滤波(WindowNum),加汉明窗了

void firdes(int DelayTime1,int WindowNum1, double npass1)

  {

      int n;

     for (n=0; n<WindowNum1; n++)

      {

  H[n]= sin((n-DelayTime1)*npass1*2*Pi)*(0.54-0.46*cos(2*n*Pi/(WindowNum1-1)))
/(Pi*(n-DelayTime1));         

 

//此处即是冲击响应函数公式,(汉明窗), npass是数字截止频率=截止频率/采样频率

  

  if (n==WindowNum1/2) H[n]=npass1*2;

      }

   }

 

//主函数(简化后)

void main(void)

{

   int i,j,p;

   double fs,fstop,npass;

   fs=100000;       //采样频率为100KHZ  

   fstop=4000;       //截止频率为4KHZ

   npass=fstop*1.0/fs; //根据课本npass是数字截止频率=截止频率*2*Pi / 采样频率

      

for(;;)          //这个函数是FIR滤波函数,将接收到数据与FIR低通系数相乘

       {

              for (i=0; i<SampleNum; i++)

              {

                x1 =   a1;        //数组a1表示从AD接收到的数据

                x2 = x1*3.0/4096.0;  

//此处x2为了进行滤波乘积运算,将接收数据变小(因F2812参考电压为3V,采样位数为12位,故这样处理,此处是否需要修改?有资料为x2=x1/1024  

          

for (p=1; p<WindowNum; p++)

        {

               Wind[WindowNum-p] = Wind[WindowNum-p-1];

          }

    Wind[0] =x2;       

         r1 = 0;

         rm1= 0;      

           for (j=0; j<WindowNum; j++)   //做卷积相乘

                { 

                   r1  =Wind[j] * fHn[j];

                     rm1 = rm1 + r1;     

             }    

             a2[i]= rm1*4096.0/3;//此数组a2里面放的是对该信号进行FIR滤波的结果          

           }           

       }

}    

输入波形是经过F2812的AD进入到DSP中,然后我想通过FIR滤波程序,将输入波形4KHZ以上的噪音去掉。我设计的采样频率fs是100KHZ(就是说我控制F2812的AD,每隔1/100KHZ采集一次数据,截止频率fstop是4KHZ)。根据ccs软件自带图形显示,我做的FIR滤波图形很不稳定,低频信号有时没问题,可是高频的不但没有滤掉,还在图形上显示为前移了(即本来单独10KHZ信号,可是滤掉后10KHZ图形上没有数据,8KHZ处却有图形,实际上我觉得就是没有滤掉)
自己有很多不太懂,现在对FIR有些混淆,看书也没看出出路,下面是自己重点疑点,请大家帮我解答一下吧,谢谢啦!!
1、 项目需要滤掉4KHZ以上的波,我打算做一个低通滤波,请问首先我将滤波阶数设为多少合适? (本打算设计WindowNum=101阶,此处WindowNum=25)
2、 程序中x2那样处理合适吗?我使用F2812自带的AD接收模块(参考电压为3V,12位)
3、 滤波函数我使用的是汉明窗函数,各位感觉应该使用哪种更好?

4、采样频率100KHZ,截止频率是4KHZ,这样合适吗?是不是采样频率不能太大?我这样求出来的系数见图形(系数没有负的,全是正的,请问这是怎么回事?)

//此处是FIR参考系数 ,这个系数表没有公式,所以我不知道怎么求的,带进我的程序中也不怎么正确,不过它的系数很明显有正负
Float fHn[25]={ 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
};

Liu bingsheng:

回复 deyisupport:

好的,谢谢

因项目需要,我需要做个FIR滤波器程序,可是根据参考程序,自己设计的还是不行,今天实在没有办法了,把程序重要部分贴上来,大家帮我解答一下吧,谢谢了!!

#include "DSP28_Device.h"

#include"math.h"

//FIR相关参数初始化

#define Pi          3.1415926    //圆周率系数

#define  SampleNum   200       //AD采样个数

#define WindowNum   25         //窗函数长度为25    τ(延迟时间)=(25-1)/2

#define DelayTime   WindowNum/2       //即专业术语   τ(延迟时间)

 

//下面这个函数就是求FIR系数的函数,我定义是25阶的滤波(WindowNum),加汉明窗了

void firdes(int DelayTime1,int WindowNum1, double npass1)

  {

      int n;

     for (n=0; n<WindowNum1; n++)

      {

  H[n]= sin((n-DelayTime1)*npass1*2*Pi)*(0.54-0.46*cos(2*n*Pi/(WindowNum1-1)))
/(Pi*(n-DelayTime1));         

 

//此处即是冲击响应函数公式,(汉明窗), npass是数字截止频率=截止频率/采样频率

  

  if (n==WindowNum1/2) H[n]=npass1*2;

      }

   }

 

//主函数(简化后)

void main(void)

{

   int i,j,p;

   double fs,fstop,npass;

   fs=100000;       //采样频率为100KHZ  

   fstop=4000;       //截止频率为4KHZ

   npass=fstop*1.0/fs; //根据课本npass是数字截止频率=截止频率*2*Pi / 采样频率

      

for(;;)          //这个函数是FIR滤波函数,将接收到数据与FIR低通系数相乘

       {

              for (i=0; i<SampleNum; i++)

              {

                x1 =   a1;        //数组a1表示从AD接收到的数据

                x2 = x1*3.0/4096.0;  

//此处x2为了进行滤波乘积运算,将接收数据变小(因F2812参考电压为3V,采样位数为12位,故这样处理,此处是否需要修改?有资料为x2=x1/1024  

          

for (p=1; p<WindowNum; p++)

        {

               Wind[WindowNum-p] = Wind[WindowNum-p-1];

          }

    Wind[0] =x2;       

         r1 = 0;

         rm1= 0;      

           for (j=0; j<WindowNum; j++)   //做卷积相乘

                { 

                   r1  =Wind[j] * fHn[j];

                     rm1 = rm1 + r1;     

             }    

             a2[i]= rm1*4096.0/3;//此数组a2里面放的是对该信号进行FIR滤波的结果          

           }           

       }

}    

输入波形是经过F2812的AD进入到DSP中,然后我想通过FIR滤波程序,将输入波形4KHZ以上的噪音去掉。我设计的采样频率fs是100KHZ(就是说我控制F2812的AD,每隔1/100KHZ采集一次数据,截止频率fstop是4KHZ)。根据ccs软件自带图形显示,我做的FIR滤波图形很不稳定,低频信号有时没问题,可是高频的不但没有滤掉,还在图形上显示为前移了(即本来单独10KHZ信号,可是滤掉后10KHZ图形上没有数据,8KHZ处却有图形,实际上我觉得就是没有滤掉)
自己有很多不太懂,现在对FIR有些混淆,看书也没看出出路,下面是自己重点疑点,请大家帮我解答一下吧,谢谢啦!!
1、 项目需要滤掉4KHZ以上的波,我打算做一个低通滤波,请问首先我将滤波阶数设为多少合适? (本打算设计WindowNum=101阶,此处WindowNum=25)
2、 程序中x2那样处理合适吗?我使用F2812自带的AD接收模块(参考电压为3V,12位)
3、 滤波函数我使用的是汉明窗函数,各位感觉应该使用哪种更好?

4、采样频率100KHZ,截止频率是4KHZ,这样合适吗?是不是采样频率不能太大?我这样求出来的系数见图形(系数没有负的,全是正的,请问这是怎么回事?)

//此处是FIR参考系数 ,这个系数表没有公式,所以我不知道怎么求的,带进我的程序中也不怎么正确,不过它的系数很明显有正负
Float fHn[25]={ 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
};

Liu bingsheng:

回复 deyisupport:

好的,谢谢

赞(0)
未经允许不得转载:TI中文支持网 » FIR滤波器程序
分享到: 更多 (0)