一、基本要求
1 設計FIR濾波器,其中 N=10、Fs = 8000Hz、Fc = 2500Hz;
2 定點實現,不允許使用float、double;
二、FIR濾波器基本知識介紹
FIR(Finite Impulse Response)濾波器:有限長單位衝激響應濾波器,又稱爲非遞歸型濾波器,是數字信號處理系統中最基本的元件,它可以在保證任意幅頻特性的同時具有嚴格的線性相頻特性,同時其單位抽樣響應是有限長的,因而濾波器是穩定的系統。
我們下面使用橫截型來設計FIR濾波器,橫截型FIR濾波器的基本結構如下:
上面式子就是線性移不變系統的卷積。
三、DSP程序設計
#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濾波後輸出波形。