1、 DSP 原理与技术 实 验 报 告 姓 名: XXX 学 号: XXXX 院 系:航天学院控制科学与工程系 指导老师: XXX 2011 年 5 月 25 日 1 FIR 滤波器的设计与 DSP 实现 1.1 FIR 滤波器的理论基础 FIR 滤波器 即有限长冲击响应滤波器的单位冲击响应 ()hn 是有限长的( 01nN ) ,其 Z 变换为 10( ) ( )N nnH z h n z 在有限 Z 平面( 0 z )内有( 1N )个零点,在 Z 平面的原点 0z 处有( 1N )阶极点。 ()hn 的频率响应 ()jHe 为 10( ) ( )Nj j nnH e h n e 当单位冲击
2、响应序列 ()hn 为实序列时, ()jHe 表示成 ()( ) ( )jjH e H e 当具有 线性相位即 () 或 () 当满足条件 () 可得出 12N ( ) ( 1 )h n h N n 上式即为 FIR 滤波器具有线性相位条件的充要条件,它要求单位冲击响 应序列 ()hn 是以12Nn 为对称中心的偶对称序列。当满足条件 () 可得出 2 12N ( ) ( 1 )h n h N n 此时要求单位冲击响应序列 ()hn 是以 12Nn 为对称中心的奇对称序列。 鉴于工程实际应用,具有线性相位的 FIR 滤波器具有更加广阔的应用。对于非线性相位的 FIR 滤波器,一般可以用 IIR
3、 滤波器来代替。同样幅度特性, IIR 滤波器所需阶数比 FIR滤波器所需阶数少得多。 1.2 FIR 滤波器的设计 常见的 FIR 滤波器设计方法包括窗函数设 计法和频率采样设计法。这里讨论用窗函数设计方法设计数字低通滤波器。 理想的数字低通滤波器的频率响应如图 1.2.1 所示。根据傅立叶逆变换,由图 1.2.1 可得其单位脉冲响应 ()hn 为 0() sin ( )0ccnhn nnn 此时 ()hn 是一个无限长的偶对称序列。 窗函数的设计即是用有限长度的窗去截断 ()hn ,使之变成有限长度序列。假设长度为M 的窗函数的单位冲击响应为 ()wn,则截断后的序列为 ( ) ( ) (
4、 ) , 2 1Nh n w n h n M n M N M 为保证系统的因果性,须将序列 ()Nhn右移 M 个采样周期即得到物理可实现的实际数字滤波器的单位脉冲响应。 下面以借助于 Matlab 的滤波 器设计工具 FDATool 设计一个截至频率为 30KHz、系统采样频率为 300KHz 的数字低通滤波器为例来说明数字滤波器的一般设计步骤。 在 Matlab 命令行输入位置输入 fdatool 即进入 FDATool 对话框界面,如图 1.2.2 所示。 图 1.2.2 FDATool 设计界面 在滤波器响应类型 Response Type 栏选择 Lowpass,设计方法 Desig
5、n Method 选择 FIR和 Window,在 Options 一栏选择汉宁窗 Hann,然后在频率设置一栏中 Fs 代表系统采样频率 ,这里填入 300000, Fc 代表截止频率填入 30000 后点击 Designed Filter 按钮即完成设计。图 1.2.3 即为设计的滤波器的幅频响应。 0 20 40 60 80 100 120 140- 7 0- 6 0- 5 0- 4 0- 3 0- 2 0- 1 00F r e q u e n c y ( k H z )Magnitude(dB)M a g n i t u d e R e s p o n s e ( d B )图 1.2
6、.3 幅频响应 FDATool 工具可以将所设计的滤波器参数导出成 Matlab 能识别的 m 语言文件和Simulink Model 文件用于仿真验证,也可以导出成 C 语言头文件( .H)用于其他平台的开发。图 1.2.4 是将所设计的滤波器导出 Simulink Model 后建立的验证性仿真结构框图。 图 1.2.4 滤波器验证框图 图 1.2.5a 为加入频率为 80KHz 噪声后的信号功率 谱, b 为滤波后的功率谱,比较二者可知噪声在通过滤波器时完全被滤掉,基本达到滤波的功能。 a)滤波前 b)滤波后 图 1.2.5 信号功率谱 1.3 FIR 滤波器的 DSP 实现 将在 Ma
7、tlab 的 FDATool 中设计好的滤波器参数导出成 C 语言头文件,从而在 DSP 开发环境中引用该参数即可完成在 DSP 中实现数字滤波器的设计。 附录一为 FIR 实验的源代码。 实验中给出的信号是 250Hz 的有用信号和 4.5KHz 的噪声信号的叠加,采样率为 10KHz。 1.3.1 FIR 低通滤波器的设计实验 根据以上参数在 FDATool 中设计的 FIR 低通滤波器的幅频响应如图 1.3.1 所示。 0 0 . 5 1 1 . 5 2 2 . 5 3 3 . 5 4 4 . 5- 6 0- 5 0- 4 0- 3 0- 2 0- 1 00F r e q u e n c
8、 y ( k H z )Magnitude(dB)M a g n i t u d e R e s p o n s e E s t i m a t e图 1.3.1 FIR 低通滤波器, fc=300Hz 其 中 , 该 低通 滤 波器 阶 数 为 11 ,系 数 为: 0, 0.01767646657392, 0.0667464118867, 0.1303069136933,0.183326950056,0.2038865155802,0.183326950056,0.1303069136933,0.0667464118867, 0.01767646657392, 0。 将附录一中的源代码中的
9、滤波器阶数变量 FIRNUMBER 和滤波器系数变量 fHn 改成以上参数后,运行之,在 CCS 的 Graph 工具中观察滤波前后的效果,如图 1.3.2 所示。 a)低通滤波前的输入信号 b)低通滤波后的输入信号 图 1.3.2 低通滤波前后的信号对比 通过观察以上两个波形并对比可得,原先输入信号中含有的高频分量被完全滤除了,说明所设计的低通滤波器各项指标符合实验要求。 1.3.2 FIR 高通滤波器的设计实验 根据信号的各项参数在 Matlab 的 FDATool 工具中设计的高通滤波器幅频响应如图 1.3.3 所示。 0 0 . 5 1 1 . 5 2 2 . 5 3 3 . 5 4
10、4 . 5- 7 0- 6 0- 5 0- 4 0- 3 0- 2 0- 1 00F r e q u e n c y ( k H z )Magnitude(dB)M a g n i t u d e R e s p o n s e E s t i m a t e图 1.3.3 FIR 高通滤波器, fc=4KHz 其中,该低 通滤波器 阶数为 11,系数 为: 0, 0.005478675859511,-0.04276363616214, 0.1215188926974,-0.2075790503787,0.2453194898046,-0.2075790503787, 0.1215188926
11、974, -0.04276363616214, 0.005478675859511, 0。 将附录一中的源代码中 的滤波器阶数变量 FIRNUMBER 和滤波器系数变量 fHn 改成以上参数后,运行之,在 CCS 的 Graph 工具中观察滤波前后的效果,如图 1.3.4 所示。 a)高通滤波前的输入信号 b)高通滤波后的输出信号 图 1.3.4 高通滤波前后的效果对比 通过观察以上两个波形并对比可得,原先输入信号中含有的低频分量被完全滤除了,说明所设计的高通滤波器各项指标符合实验要求。 2 快速傅立叶变换( FFT)及其 DSP 实现 2.1 FFT 的理论基础 离散傅立叶变换的基本公式为:
12、 1n010( ) ( )1( ) ( )NknNNknNkX K x n Wx n X K WNFFT 即是在 DFT 基础上提出来的快速算法,其基本思想是充分利用变换核 NW 的周期性、对称性以及将 DFT 分解为多个短序列的 DFT 变换。 最常见的 FFT 算法包括按时间抽选和按频率抽选两种,其基本单元都是蝶形运算。 2.2 FFT 的 DSP 实现 附录二为 DSP 实现的源代码。测试信号为 y s i n (1 0 0 ) s i n ( 2 4 0 )33tt 即频率分别为 50Hz 和 120Hz 正弦信号的叠加。 图 2.1.1 为在 CCS 软仿真环境下获得的原始信号及其
13、FFT 变换频谱。 a)测试信号时域波形 b)测试信号 FFT 频谱 图 2.1.1 测试信号时域及频谱 3 语音信号的 FIR 滤波 正常语音信号的频带是 200Hz-3400Hz,在前端的防混叠滤波后,需对所采样的语音信号进行 200Hz 以下和 4000Hz 以上的的滤波处理以净化频带。 本实验采用多媒体数字语音编解码器 TLV320AIC23 来进行语音信号的采 集。TLV320AIC23 是 TI 公司生产的一款高性能的多媒体数字语音编解码器,它的内部 ADC 和DAC 转换模块带有完整的数字滤波器,数据传输宽度可以是 16 位、 20 位、 24 位和 32 位,采样频率范围可从
14、8 kHz 到 96 kHz,并可通过控制接口来编辑该器件的控制寄存器。TLV320AIC23 支持 SPI, I2C 两种控制模式。图 3.1 给出了 TLV320AIC23 与 DSP 器件的连接图。 图 3.1 TLV320AIC23 与 DSP 的接口 在子程序中,首先初始化语音缓冲区和工作变量,等待 MCBSP 通道 0 传送结束后,再采集 语音信号,然后传送到 MCBSP 并保存于左声道缓冲区,此时即可调用 FIR2 计算 FIR滤波输出,滤波后的结果存放于右声道缓冲区,最后将滤波后的信号输出到 MCBSP 接口,再将此信号传送到 TLV320AIC23 中,经 DA 转换后输出。
15、软件流程如图 3.2 所示。 图 3.2 软件流程 附录三给出了语音信号 FIR 滤波实验的主程序。 附录 附录一 FIR 滤波 DSP 实验源程序 #include #define FIRNUMBER 11 #define SIGNAL1F 250 #define SIGNAL2F 4500 #define SAMPLEF 10000 #define PI 3.1415926 float InputWave(); float FIR(); float fHnFIRNUMBER= 0, 0.005478675859511, -0.04276363616214, 0.1215188926974,
16、 -0.2075790503787, 0.2453194898046, -0.2075790503787, 0.1215188926974, -0.04276363616214, 0.005478675859511, 0; float fXnFIRNUMBER= 0.0 ; float fInput,fOutput; float fSignal1,fSignal2; float fStepSignal1,fStepSignal2; float f2PI; int i; float fIn256,fOut256; int nIn,nOut; main() nIn=0; nOut=0; f2PI=
17、2*PI; fSignal1=0.0; fSignal2=PI*0.1; fStepSignal1=2*PI*SIGNAL1F/SAMPLEF; fStepSignal2=2*PI*SIGNAL2F/SAMPLEF; while ( 1 ) fInput=InputWave(); fInnIn=fInput; nIn+; nIn%=256; fOutput=FIR(); fOutnOut=fOutput; nOut+; /* break point */ if ( nOut=256 ) nOut=0; float InputWave() for ( i=FIRNUMBER-1;i0;i- )
18、fXni=fXni-1; fXn0=sin(double)fSignal1)+cos(double)fSignal2)/6.0; fSignal1+=fStepSignal1; if ( fSignal1=f2PI ) fSignal1-=f2PI; fSignal2+=fStepSignal2; if ( fSignal2=f2PI ) fSignal2-=f2PI; return(fXn0); float FIR() float fSum; fSum=0; for ( i=0;iFIRNUMBER;i+ ) fSum+=(fXni*fHni); return(fSum); 附录二 FFT
19、程序源码 ;- ; 函数名 : void fft(void) ; 功能 :实现 32、 64 或 128 采样点的快速傅立叶变换 ; 入口条件 : ; _sintab 存放 FFT 运算中用到的 sin 和 cosin 函数值 ; _input 存放 FFT 运算中用到的数据 ,包括实部和虚部 ,按二进制反序排列 ; 注意 :由于 “*BR0+“间接寻址方式对 _input 的地址有特殊的要求 , ; 所以最好将数组 _input 放置在一个独立的块中 ,如 B1 块。 ; _nom 当 _nom=0 时 ,本函数将不对运算结果进行归一化。反之 ,将对每 ; 一步运算结果进行归一化处理 ,避免溢出 ,但是 ,它会使运算精度降低。 ; N 常数 ,参与 FFT 运输的点数 ,用户可根据需要选择 ,例如 ,需要进行 128点 ; FFT 时 ,请在本函数中做出如下选择 : ; N .set 128