FIR滤波器设计报告

  • 格式:doc
  • 大小:494.00 KB
  • 文档页数:14

摘要本文介绍了数字滤波器的设计基础及用窗函数法设计FIR 滤波器的方法,运用MATLAB 语言实现了低通滤波器的设计以及用CCS软件进行滤波效果的观察。

读取语音文件,并加入一定的随机噪声,最后使用窗函数滤波法进行语音滤波,将加噪后的语音文件转换为.dat文件使其能和ccs软件链接,输出个阶段的时域和频域波形。

关键词:FIR滤波、Matlab、窗函数法、CCS目录1.引言 (2)2.FIR滤波器的窗函数法的设计 (2)2.1 fir1函数 (2)3.FIR滤波器的设计(Matlab) (4)4.滤波器的DSP实现(CCS) (7)4.1 编写源程序 (7)5.本课程的心得体会和对本课程的建议 (11)6.结束语 (12)参考文献 (13)1.引言根据数字滤波器冲激响应函数的时域特性。

可将数字滤波器分为两种,即无限长冲激响应( IIR) 滤波器和有限长冲激响应(FIR) 滤波器。

IIR 滤波器的特征是具有无限持续时间的冲激响应;FIR 滤波器冲激响应只能延续一定时间。

其中FIR 滤波器很容易实现严格的线性相位,使信号经过处理后不产生相位失真,舍入误差小,稳定等优点。

能够设计具有优良特性的多带通滤波器、微分器和希尔伯特变换器,所以在数字系统、多媒体系统中获得极其广泛的应用。

FIR数字滤波器的设计方法有多种,如窗函数设计法、最优化设计和频率取样法等等。

而随着MATLAB软件尤其是MATLAB 的信号处理工具箱和Simulink 仿真工具的不断完善,不仅数字滤波器的计算机辅助设计有了可能而且还可以使设计达到最优化。

2.FIR滤波器的窗函数法的设计2.1 fir1函数用来设计标准频率响应的基于窗函数的FIR滤波器,可实现加窗线性相位FIR数字滤波器的设计。

语法:b=fir1(n,Wn);b=fir1(n,Wn,’ftype’);b=fir1(n,Wn,Window);b=fir1(n,Wn,’ftype’,Window);其中,n为滤波器的阶数;Wn为滤波器的截止频率;ftype参数用来决定滤波器的类型,当ftype=high时,可设计高通滤波器;当ftype=stop时,可设计带阻滤波器。

Windows参数用来指定滤波器采用的窗函数类型,其默认值为汉明(Hamming)窗。

使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。

滤波器的系数包含在返回值b中,可表示为b(z)=b(1)+b(2)+...+b(n+1)本文采用汉明窗设计低通FIR滤波器使用b=fir1(n,Wn)可得到低通滤波器。

其中,0Wn1,Wn=1相当于0.5。

其语法格式为b=fir1(n,Wn);采用:b=fir1(25, 0.25);得到归一化系数:b =Columns 1 through 8-0.0008 0.0010 0.0038 0.0063 0.0042 -0.0065 -0.0231 -0.0335Columns 9 through 16-0.0199 0.0290 0.1072 0.1896 0.2426 0.2426 0.1896 0.1072Columns 17 through 240.0290 -0.0199 -0.0335 -0.0231 -0.0065 0.0042 0.0063 0.0038Columns 25 through 260.0010 -0.0008或者在命令行输入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};25阶采样频率8000HZ与截止频率1000HZ使用hamming窗选择窗函数3.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滤波后的时域频域波形4.滤波器的DSP实现(CCS)4.1 编写源程序.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 ;缓冲区大小37stm #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经观察效果差不多。