一、基本要求
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 {
sum = 0;
for (j = 0; 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滤波后输出波形。