天天看點

fir數字濾波器設計與軟體實作_基于DSP的FIR濾波器設計與實作

fir數字濾波器設計與軟體實作_基于DSP的FIR濾波器設計與實作

一、摘要

  采用DSP做FIR算法

二、實驗平台

  Matlab7.1 + CCS3.1

三、實驗内容

  根據要求設計低通FIR濾波器。

  要求:通帶邊緣頻率10KHz,阻帶邊緣頻率22KHz,阻帶衰減75dB,采樣頻率50KHz。

四、實驗步驟

3.1 參數計算

窗函數標明:阻帶衰減75dB,選擇blackman窗

截止頻率:2pi*(10+(22-10)/2)/50 = 0.64pi

窗函數長度:blackman窗的過渡帶寬為5.98,機關為2pi/N,而要設計的低通濾波器的過渡帶寬為2pi*12/50=0.48pi,二者相等,得N=24.9,取25。

3.2 濾波器的脈沖響應

理想低通濾波器脈沖響應:

h1[n] = sin(nΩ1)/n/pi = sin(0.64pi*n)/n/pi

窗函數為:

w[n] = 0.42 - 0.5cos(2pi*n/24) + 0.8cos(4pi*n/24)

則濾波器脈沖響應為:

h[n] = h1*w[n] |n|<=12

h[n] = 0 |n|>12

3.3 濾波器的差分方程

根據濾波器的脈沖響應計算出h[n],然後将脈沖響應值移位為因果序列

這裡計算h[n]的值,采用Matlab計算,有2種方法。

一種是用程式,代碼如下:

Window=blackman(25);

b=fir1(24,0.64,Window);

freqz(b,1)

系數如下:

h1 =

Columns 1 through 8

0.000 0.000 0.001 -0.002 -0.002 0.010 -0.009 -0.018

Columns 9 through 16

0.049 -0.020 -0.110 0.280 0.640 0.280 -0.110 -0.020

Columns 17 through 24

0.049 -0.018 -0.009 0.010 -0.002 -0.002 0.001 0.000

Columns 25

0.000

另外一種是通過FDATool工具箱設定參數之後生成濾波器(這裡設定濾波器的階數時,設定為24),之後得到濾波器的系數。系數值同上。

最後,得到濾波器的差分方程:

y[n] = 0.001x[n-2] - 0.002x[n-3] - 0.002x[n-4] + 0.01x[n-5] - 0.009x[n-6] - 0.018[n-7]

    + 0.049x[n-8] -0.02x[n-9] - 0.11x[n-10] + 0.28x[n-11] + 0.64x[n-12] + 0.28x[n-13]

    - 0.11[n-14] - 0.02x[n-15] + 0.049x[n-16] - 0.018x[n-17] - 0.009x[n-18] + 0.1x[n-19]

    - 0.002x[n-20] - 0.002x[n-21] + 0.001x[n-22]

3.4 DSP實作

根據濾波器系數,編寫DSP實作的程式,下面是采用CCS軟體仿真的形式,驗證FIR濾波器的效果。

//#include "DSP281x_Device.h" // DSP281x Headerfile Include File

//#include "DSP281x_Examples.h" // DSP281x Examples Include File

#include "f2812a.h"

#include"math.h"

#define FIRNUMBER 25

#define SIGNAL1F 1000

#define SIGNAL2F 4500

#define SAMPLEF 10000

#define PI 3.1415926

float InputWave();

float FIR();

float fHn[FIRNUMBER]={ 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

};

float fXn[FIRNUMBER]={ 0.0 };

float fInput,fOutput;

float fSignal1,fSignal2;

float fStepSignal1,fStepSignal2;

float f2PI;

int i;

float fIn[256],fOut[256];

int nIn,nOut;

main(void)

{

nIn=0; nOut=0;

f2PI=2*PI;

fSignal1=0.0;

fSignal2=PI*0.1;

fStepSignal1=2*PI/30;

fStepSignal2=2*PI*1.4;

while ( 1 )

{

fInput=InputWave();

fIn[nIn]=fInput;

nIn++; nIn%=256;

fOutput=FIR();

fOut[nOut]=fOutput;

nOut++;

if ( nOut>=256 )

{

nOut=0;

}

}

}

float InputWave()

{

for ( i=FIRNUMBER-1;i>0;i-- )

fXn[i]=fXn[i-1];

fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;

fSignal1+=fStepSignal1;

if ( fSignal1>=f2PI ) fSignal1-=f2PI;

fSignal2+=fStepSignal2;

if ( fSignal2>=f2PI ) fSignal2-=f2PI;

return(fXn[0]);

}

float FIR()

{

float fSum;

fSum=0;

for ( i=0;i<FIRNUMBER;i++ )

{

fSum+=(fXn[i]*fHn[i]);

}

return(fSum);

}

3.5 仿真結果

fir數字濾波器設計與軟體實作_基于DSP的FIR濾波器設計與實作

  左上角的波形,為混疊有高頻噪聲的輸入波形;右上角的是該波形的頻譜。

  左下角的波形,為經過FIR低通濾波器之後的輸出波形;右下角的是該波形的頻譜。

由實驗結果可知,FIR濾波器能起到很好的濾波效果。

Linux-C語言學習交流群【721709245】在學的進群一起交流,資料自己群檔案下載下傳

相關資料:

必備Linux指令和C語言基礎_C語言_嵌入式開發工程師​www.makeru.com.cn

繼續閱讀