内容发布更新时间 : 2024/11/18 13:25:53星期一 下面是文章的全部内容请认真阅读。
实验四.数字信号处理算法实验
实验4.1 :有限脉冲响应滤波器(FIR)算法实验
一.实验目的
1.掌握窗函数法设计FIR滤波器的Matlab实现,为CCS提供滤波系数。 2.掌握采用C语言在VC5509开发板上实现混频信号的FIR滤波。
二.实验设备
计算机,ICETEK-VC5509-A实验箱及电源。
三.实验原理
1. 窗函数法设计FIR滤波器(详细理论请看《数字信号处理》原理书籍) 本实验要求:
设计一个低通滤波器,通带截止频率fp=10kHz,阻带截止频率fs1=22kHz,阻带衰减ap=75dB,采样频率fs=50kHz,计算出滤波系数fHn,并对混频信号(高频+低频正弦波)fIn进行滤波,得输出波形fOut。
解:过渡带宽度=fs1-fp=12kHz;截止频率:f1=fp+(过渡带宽度)/2=16kHz f1对应的数字频率:Ω1=2πf1/fs=0.64π(rad) -理想低通滤波器单位脉冲响应:
hd[n]=sin(0.64π(n-a))/(π(n-a)) 其中a=(N-1)/2 (n=0~N-1)
-根据阻带衰减要求选择布莱克曼窗,窗函数长度N为: N=5.98fs/过渡带宽度≈25
则窗函数为:w[n]=0.42-0.5cos(2πn/24)+0.08cos(4πn/24) 滤波器脉冲响应为:
h[n]=hd[n]w[n] (n=0~N-1) <1>
-根据上面各式计算出h[n]。 2. FIR滤波
FIR滤波器的差分方程为:y(n)??hx(n?i) <2>
ii?0N?1其中,hi----滤波器系数;x(n)---滤波器的输入;y(n)--- 滤波输出。 根据公式<1><2>,得本例对应FIR滤波器的差分方程为: y[n]=-0.001x[n-2]-0.002x[n-3]-0.002x[n-4]+0.01x[n-5]
-0.009x[n-6]-0.018x[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.11x[n-14]-0.02x[n-15]
+0.049x[n-16]-0.018x[n-17]-0.009x[n-18]+0.01x[n-19] -0.002x[n-20]-0.002x[n-21]+0.001x[n-22] (n=0,1,2,...)
采用线性缓冲区法(原理见备课笔记)解此差分方程,得FIR滤波结果y(n)。 3.程序流程图:
四.实验内容
1.实验准备
2.利用Matlab编程计算滤波系数fHn。 %程序:FIRditong.m clear clc
N=25; %滤波器的阶数 n=[0:1:N-1];
wc=0.64*pi; %理想低通滤波器的截止频率 m=n-(N-1)/2+eps;
hd=sin(wc*m)./(pi*m); %理想低通滤波器hd(n) wn=0.42-0.5*cos(2*pi*n/24)+0.08*cos(4*pi*n/24); %布拉克曼窗
fHn=hd.*wn %滤波系数fHn 实验要求:
(1)在matlab软件中运行该程序,在命令窗口下显示滤波系数fHn。 则 fHn =
Columns 1 through 6 0.0000 -0.0000 0.0008 -0.0016 -0.0019 0.0100 Columns 7 through 12 -0.0087 -0.0180 0.0492 -0.0204 -0.1095 0.2800 Columns 13 through 18 0.6400 0.2800 -0.1095 -0.0204 0.0492 -0.0180 Columns 19 through 24 -0.0087 0.0100 -0.0019 -0.0016 0.0008 -0.0000 Column 25 0.0000 将此fHn与三.2部分的fHn相比,体会FIR滤波器设计原理。 3.打开工程:
C:\\ICETEK\\VC5509Ae\\VC5509Ae\\Lab0501-FIR\\Fir.pjt。 //主程序:FIR.c #include \
#include \#include \#include
#define FIRNUMBER 25 //滤波器阶数
#define SIGNAL1F 1000 //输入信号1的频率 #define SIGNAL2F 4500 //输入信号2的频率 #define SAMPLEF 10000 //采样频率 #define PI 3.1415926
float InputWave(); // 输入信号产生子程序声明
float FIR(); // 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]; // 输入信号fIn和滤波输出信号fOut int nIn,nOut; //输入和输出信号的下标变量 main() { 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(); //调入输入信号的1个值,存入fIn[nIn] fIn[nIn]=fInput; nIn++; nIn%=256; // nIn=nIn+1;nIn除256取余 fOutput=FIR(); fOut[nOut]=fOutput;
//调用FIR滤波子程序,将本次滤波输出存入fOut[nOut]
nOut++; /* break point */
// nOut=nOut+1 if ( nOut>=256 ) { nOut=0; } } }
float InputWave() {