基於DSP的FIR濾波器的設計

一、基本要求

1 設計FIR濾波器,其中 N=10、Fs = 8000Hz、Fc = 2500Hz;

2 定點實現,不允許使用float、double;

二、FIR濾波器基本知識介紹

        FIR(Finite Impulse Response)濾波器:有限長單位衝激響應濾波器,又稱爲非遞歸型濾波器,是數字信號處理系統中最基本的元件,它可以在保證任意幅頻特性的同時具有嚴格的線性相頻特性,同時其單位抽樣響應是有限長的,因而濾波器是穩定的系統。

        我們下面使用橫截型來設計FIR濾波器橫截型FIR濾波器的基本結構如下:

                                                                                             

            上面式子就是線性移不變系統的卷積。

三、DSP程序設計

#include "math.h"

#define MCA_LENGTHDATA  256
#define MCA_firLength 11
#define N 8
#define MCA_F1 1000;
#define MCA_F2 3500;
#define MCA_Fs 8000;
#define PI 3.1415926


float MCA_coef_fir[MCA_firLength]=
{  
     -0.0225337632,  0.07526988536, -0.03907361254,  -0.1096294075,   0.2885734141,
     0.6147869825,   0.2885734141,  -0.1096294075, -0.03907361254,  0.07526988536,
      -0.0225337632
};

long long  MCA_coef_firNom[MCA_firLength];
float MCA_tepInDataS1[MCA_LENGTHDATA];

long long MCA_inData[MCA_LENGTHDATA];
float MCA_outData[MCA_LENGTHDATA];
long long Qn =  0;
float MCA_tepInData[MCA_LENGTHDATA];
int f1 = MCA_F1;
int f2 = MCA_F2;
int fs = MCA_Fs;

/***********************************************************
* 正弦波合成測試數據,並且轉換爲整型,同時乘以2的N次方
************************************************************/
void MCA_readVoiceData()
{
     int i = 0;

     for(i = 0; i < MCA_LENGTHDATA; i++)
     {
         MCA_tepInData[i] = 0;
     }
    for(i = 0; i < MCA_LENGTHDATA; i++)
    {
        MCA_tepInDataS1[i] = sin(2*PI*i*f1/fs);
        MCA_tepInData[i] = sin(2*PI*i*f1/fs) +sin(2*PI*i*f2/fs) ;
        MCA_inData[i] = (int)(MCA_tepInData[i] * Qn);
    }
}


/***********************************************************
* fir濾波器係數變爲整型,同時乘以2的N次方
************************************************************/
void MAC_normalizedFirCoeff()
{
     int i = 0;
     for(i = 0; i < MCA_firLength; i++)
     {
         MCA_coef_firNom[i] = (int)(MCA_coef_fir[i] * Qn);
     }
}

void MAC_fir()
{
     int i = 0;
     int j = 0;
     long long int sum = 0;
     for (i=0; i<MCA_LENGTHDATA; i++)
     {
     sum = 0;
     for (j = 0; j<MCA_firLength; j++)
     {
          sum += MCA_inData[i + MCA_firLength - j]*MCA_coef_firNom[j];
     }

     MCA_outData[i] = (sum>>N)*1.0/Qn;
     }
}

void MCA_write()
{
     FILE *fidOut = NULL;
     fidOut = fopen("soundoutsignal.dat", "wb");
     fwrite(MCA_outData, sizeof(float), MCA_LENGTHDATA, fidOut);
     fclose(fidOut);
}

void main()
{
     Qn = pow(2,N);
     MCA_readVoiceData();
     MAC_normalizedFirCoeff();

     MAC_fir();
     MCA_write();
     while(1);
}

四、實驗結果

下圖上面爲正弦波合成的波形,下面爲FIR濾波後輸出波形。


發佈了21 篇原創文章 · 獲贊 11 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章