This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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
};