滤波器设计原理本文将介绍数字滤波器的设计基础及用窗函数法设计FIR 滤波器的方法,运用MATLAB 语言实现了低通滤波器的设计以及用CCS软件进行滤波效果的观察。
读取语音文件,并加入一定的随机噪声,最后使用窗函数滤波法进行语音滤波,将加噪后的语音文件转换为.dat文件使其能和ccs软件链接,输出个阶段的时域和频域波形。
根据数字滤波器冲激响应函数的时域特性。
可将数字滤波器分为两种,即无限长冲激响应( IIR) 滤波器和有限长冲激响应(FIR) 滤波器。
IIR 滤波器的特征是具有无限持续时间的冲激响应;FIR 滤波器冲激响应只能延续一定时间。
其中FIR 滤波器很容易实现严格的线性相位,使信号经过处理后不产生相位失真,舍入误差小,稳定等优点。
能够设计具有优良特性的多带通滤波器、微分器和希尔伯特变换器,所以在数字系统、多媒体系统中获得极其广泛的应用。
FIR数字滤波器的设计方法有多种,如窗函数设计法、最优化设计和频率取样法等等。
而随着MATLAB软件尤其是MATLAB 的信号处理工具箱和Simulink 仿真工具的不断完善,不仅数字滤波器的计算机辅助设计有了可能而且还可以使设计达到最优化。
FIR滤波器的窗函数法的设计采用汉明窗设计低通FIR滤波器使用b=fir1(n,Wn)可得到低通滤波器。
其中,0Wn1,Wn=1相当于0.5。
其语法格式为b=fir1(n,Wn);采用:b=fir1(25, 0.25);得到归一化系数:或者在命令行输入fdatool进入滤波器的图形设置界面,如下图所示得到系数(并没有归一化)const int BL = 26;const int16_T B[26] = {-26, 33, 126, 207, 138, -212, -757, -1096, -652,950, 3513, 6212, 7948, 7948, 6212, 3513, 950, -652,-1096, -757, -212, 138, 207, 126, 33, -26};FIR滤波器的设计(Matlab)技术指标为:采用25阶低通滤波器,汉明窗(Hamming Window)函数,截止频率为1000Hz,采样频率为8000Hz,增益40db。
下面的程序功能是:读取语音文件,并加入一定的随机噪声,最后使用窗函数滤波法进行语音滤波,将加噪后的语音文件转换为.dat文件使其能和ccs软件链接,输出个阶段的时域和频域波形。
原程序如下:[x,fs,bits]=wavread('how.wav'); %读取语音文件m=max(x);normal1=x/max(x); %归一化sound(normal1,fs,bits); %播放归一化后的语音信号indata=round(32767*normal1); %数据最大取16位的数即32768 tem1=fopen('indata.dat','w'); %打开文件保存数据fprintf(tem1,'1651 1 0 0 0\n'); %输出文件头fprintf(tem1,'%d\n',indata); %输出fclose(tem1); %关闭n = length (x); %求出语音信号的长度X=fft(x,n); %傅里叶变换%x2=randn(1,length(x)); %产生一与x长度一致的随机信号%sound(x2,fs,bits);m=randn(size(x)); %产生随机噪声x2=0.1*m+x;X2=fft(x2,n); %傅里叶变换normal=x2/max(x2); %归一化chang=round(32767*normal);sound(normal,fs,bits); %播放加噪声后的音乐ch=fopen('chang.dat','w');fprintf(ch,'1651 1 0 0 0\n');fprintf(ch,'%d\n',chang);fclose(ch);subplot(2,2,1);plot(x);title('原始信号波形');subplot(2,2,2);plot(abs(X));title('原始信号频谱');subplot(2,2,3);plot(x2);title('加噪声后的语音信号波形');subplot(2,2,4);plot(abs(X2));title('加噪声后的语音信号频谱');%figure(2)N=24;Wn=0.25; %海明窗滤波器b=fir1(N,Wn);hd = dfilt.dffir(b); %画出滤波器的频率响应图freqz(hd);figure(3)z=filter(b,1,x2); %对信号进行滤波m=length(z);Z=fft(z,m);subplot(211);plot(z);title('FIR滤波后信号的波形');subplot(212);plot(abs(Z));title('FIR滤波后信号的频谱');%pause(1); %延时1秒sound(z,fs,bits); %播放滤波后的语音信号xout=z/max(z);xto_ccs=round(32767*xout)fid=fopen('output2.dat','w');fprintf(fid,'1651 1 0 0 0\n');fprintf(fid,'%d\n',xto_ccs);fclose(fid);运行上面的m文件,得到下图1、图2、图3:图 1原始信号和加噪声后的语音信号的时域和频域波形图 2 滤波器的频率响应图 3 FIR滤波后的时域频域波形滤波器的DSP实现(CCS)编写源程序.title "FIR.ASM".mmregs.def start.bss yn,1xn .usect "xn",25hn .usect "hn",25indata .usect "indata",300outdata .usect "outdata",256.datafir_coff:.word 8*32768/10000,10*32768/10000.word 38*32768/10000,63*32768/10000.word 42*32768/10000,-65*32768/10000.word -231*32768/10000,-335*32768/10000.word -199*32768/10000,290*32768/10000.word 1072*32768/10000,1896*32768/10000.word 2426*32768/10000.word 1896*32768/10000,1072*32768/10000.word 290*32768/10000,-199*32768/10000.word -335*32768/10000,-231*32768/10000.word -65*32768/10000,42*32768/10000.word 63*32768/10000,38*32768/10000.word 10*32768/10000,8*32768/10000.textstart:ssbx frct ;使用小数运算stm #hn,ar1 ;系数首地址rpt #24 ;将系数移入循mvpd fir_coff,*ar1+ ;环缓冲区stm #-1,ar0stm #outdata,ar5stm #indata,ar4stm #xn+24,ar2rpt #24 ;将输入数据移入mvdd *ar4+,*ar2+0% ;循环缓冲区stm #xn+24,ar2 ;指向第一个输入 stm #hn+24,ar3stm #25,bk ;缓冲区大小37 stm #255,brc ;块重复256次stm #-1,ar0rptb loop-1 ;块程序重复大小 rptz a,#24 ;计算一个输出mac *ar2+0%,*ar3+0%,asth a,*(yn) ;保存输出mvkd *(yn),*ar5+mvdd *ar4+,*ar2+0% ;读进一个输入loop: nopb loop.end注:.data系数可改为.datafir_coff:.word -26,33.word 126,207.word 138,-212.word -757,-1096.word -652,950.word 3523,6212.word 7948.word 6212,3512.word 950,-652.word -1096,-757.word -212,138.word 207,126.word 33,-26经观察效果差不多。
4.2 观察滤波效果4.2.1 编译生成*.out文件,选择File->Load Program装入*.out文件,然后选择File->Data->Load装入*.dat文件并打开,在弹出的对话框中输入起始地址indata和长度300,数据类型为data。
4.2.2 查看输入和输出点击View->Graph->Time/Frenquency进入图形属性对话框进行设置图 4 输入输出波形属性设置对话框图 5 输入的时域波形图 6 输出的时域波形图7 输入的频域波形图 8 输出的频域波形5.本课程的心得体会和对本课程的建议首先课程的安排比较好,先让我们了解硬件方面的知识,然后在硬件的基础上开始编写简单的程序。
这很对我们的胃口,如果一开始就搞抽象的CPU内核结构之类的东西,肯定让很多人头疼。
DSP系统的硬件结构比较复杂,一定要分模块学习,在实际用用到哪一块硬件,就重点了解这一块的内容。
紧接着学习TMS320C54x的指令系统。
寄存器和存储空间在指令执行前后到底是怎么变化的,这个指令的过程到底是怎么样进行的,到现在也还有一些细节问题没搞清楚,学习过程中要结合C54系列的内核进一步细化,看了C54的内部结构框图、寄存器定义、汇编指令格式、片上外设等等,特别是中断系统和位反转操作。
接着第五章学习汇编语言的程序设计,要通过不断地做作业练习和上机实验,逐步看懂一个比较复杂的DSP程序的结构框架,熟悉CCS软件的应用,为大作业做准备。
通过学习和积累,我们能够进行一些简单的应用程序的设计,如:FIR滤波器、IIR滤波器、FFT变换、正弦信号发生器等。