DSP

基于DSP的FIR滤波器的设计

2019-07-13 09:58发布

一、基本要求

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滤波后输出波形。