一、摘要
这里主要是对窗函数的简单应用做些介绍,是在已知滤波器阶数的情况下,设计滤波器。多数情况下,在不能直接知道滤波器阶数的时候,可参考“http://www.cnblogs.com/sunev/archive/2011/11/23/2260579.html”。
二、MATLAB中的窗函数
(1)矩形窗(Rectangle Window) 调用格式:w=boxcar(n),根据长度 n 产生一个矩形窗 w。
(2)三角窗(Triangular Window) 调用格式:w=triang(n),根据长度 n 产生一个三角窗 w。
(3)汉宁窗(Hanning Window) 调用格式:w=hanning(n),根据长度 n 产生一个汉宁窗 w。
(4)海明窗(Hamming Window) 调用格式:w=hamming(n),根据长度 n 产生一个海明窗 w。
(5)布拉克曼窗(Blackman Window) 调用格式:w=blackman(n),根据长度 n 产生一个布拉克曼窗 w。
(6)恺撒窗(Kaiser Window) 调用格式:w=kaiser(n,beta),根据长度 n 和影响窗函数旁瓣的β参数产生一个恺撒窗w。
三、基于窗函数的 FIR 滤波器设计
利用 MATLAB 提供的函数 fir1来实现
调用格式:fir1(n,Wn,’ftype’,Window),n 为阶数、Wn 是截止频率(如果输入是形如[W1 W2]的矢量时,本函数将设计带通/带阻滤波器。
[例]设计一个长度为 8 截止频率为0.4π的线性相位 FIR 滤波器。
用矩形窗:
Window=boxcar(8);
b=fir1(7,0.4,Window);
freqz(b,1)
用blackman窗:
Window=blackman(8);
b=fir1(7,0.4,Window);
freqz(b,1)
[例] 设计线性相位带通滤波器,其长度N=15,上下边带截止频率分别为W1= 0.3π,W2=0.5π
Window=blackman(16);
b=fir1(15,[0.3 0.5],Window);
freqz(b,1)
- %{
- ---------------------------------------------------------------------------
- File:Matlab的窗函数,矩形窗
- 功能:降低旁瓣水平
- 参数:
- ---------------------------------------------------------------------------
- %}
- %N =51
- %==========================================================================
- %求矩形窗的频率响应图
- %==========================================================================
- W = linspace(-pi,pi,4096);
- wn0 = rectwin(51) %矩形窗函数
- %20*log10(abs(WN))
- [h1,w0] = freqz(wn0,1,W);
- %subplotfigure(5,1,1);
- subplot(511);
- plot(w0/pi,20*log10(abs(h1/max(h1))));
- axis([-1 1 -100 0]);
- xlabel('归一化频率 /\pi');
- ylabel('20log_{10}|W(e^{j\omega})| /dB');
- title('矩形窗的傅里叶变换');
- set(gca,'YTick',[-100 -80 -60 -40 -20 0])
- set(gca,'XTick',[-1 :0.2: 1])
- %set(gca,'XAxisLocation','top');%设置X轴在上方
- %set(gca,'XAxisLocation','buttom');%设置X轴在下方
- set(gca,'YAxisLocation','left'); %设置Y轴在左方
- text(1,-124,'\pi');%gtext('\pi');
- %==========================================================================
- %求三角窗的频率响应图
- %==========================================================================
- wn1 = bartlett(51)
- [h1,w1] = freqz(wn1,1,W);
- %figure(5,1,2);
- subplot(512);
- plot(w1/pi,20*log10(abs(h1/max(h1))));
- %plot(w/pi,20*log10(h1/max(h1))); % 警告: 复数 X 和/或 Y 参数的虚部已忽略
- axis([-1 1 -100 0]);
- xlabel('归一化频率 /\pi');
- ylabel('20log_{10}|W(e^{j\omega})| /dB');
- title('三角窗的傅里叶变换');
- set(gca,'YTick',[-100 -80 -60 -40 -20 0])
- set(gca,'XTick',[-1 :0.2: 1])
- %set(gca,'XAxisLocation','top');%设置X轴在上方
- set(gca,'YAxisLocation','left'); %设置Y轴在左方
- text(1,-124,'\pi');%gtext('\pi');
- %==========================================================================
- %hanning 窗的频率响应图
- %==========================================================================
- wn2 = hanning(51)
- [h1,w2] = freqz(wn2,1,W);
- %figure(5,1,3);
- subplot(513);
- plot(w2/pi,20*log10(abs(h1/max(h1))));
- axis([-1 1 -100 0]);
- xlabel('归一化频率 /\pi');
- ylabel('20log_{10}|W(e^{j\omega})| /dB');
- title('Hanning的傅里叶变换');
- set(gca,'YTick',[-100 -80 -60 -40 -20 0]);
- set(gca,'XTick',[-1 :0.2: 1]);
- %set(gca,'XAxisLocation','top');%设置X轴在上方
- set(gca,'YAxisLocation','left'); %设置Y轴在左方
- text(1,-124,'\pi');%gtext('\pi');
- %==========================================================================
- %hamming 窗的频率响应图
- %==========================================================================
- wn3 = hamming(51)
- [h1,w3] = freqz(wn3,1,W); %离散系统频响特性的函数freqz()
- %figure(5,1,4);
- subplot(514);
- plot(w3/pi,20*log10(abs(h1/max(h1))));
- axis([-1 1 -100 0]);
- xlabel('归一化频率 /\pi');
- ylabel('20log_{10}|W(e^{j\omega})| /dB');
- title('Hamming的傅里叶变换');
- set(gca,'YTick',[-100 -80 -60 -40 -20 0])
- set(gca,'XTick',[-1 :0.2: 1])
- %set(gca,'XAxisLocation','top');%设置X轴在上方
- set(gca,'YAxisLocation','left'); %设置Y轴在左方
- text(1,-124,'\pi');%gtext('\pi');
- %==========================================================================
- %Blackman wn1 = blackman(51)
- %==========================================================================
- wn4 = blackman(51)
- [h1,w4] = freqz(wn4,1,W);
- %figure(5,1,5);
- subplot(515);
- plot(w4/pi,20*log10(abs(h1/max(h1))));
- axis([-1 1 -100 0]);
- xlabel('归一化频率 /\pi');
- ylabel('20log_{10}|W(e^{j\omega})| /dB');
- title('Blackman的傅里叶变换');
- set(gca,'YTick',[-100 -80 -60 -40 -20 0])
- set(gca,'XTick',[-1 :0.2: 1])
- %set(gca,'XAxisLocation','top');%设置X轴在上方
- set(gca,'YAxisLocation','left'); %设置Y轴在左方
- text(1,-124,'\pi');%gtext('\pi');