今天上数字信号处理的实验。。。做滤波器仿真,放上来玩玩:
- %模拟巴特沃斯低通滤波器设计
- clear;closeall
- fp=500;fs=750;Ap=3;As=15;%输入滤波器指标
- [N,fc]=buttord(fp,fs,Ap,As,'s')%计算阶数N和3dB截止频率fc
- [B,A]=butter(N,fc,'s');%设计低通巴特沃斯模拟滤波器
- [hf,f]=freqs(B,A,1024);%计算模拟滤波器频率响应,freqs为工具函数
- subplot(1,3,1);
- plot(f,20*log10(abs(hf)/abs(hf(1))))
- title('模拟巴特沃斯滤波器');
- grid;
- xlabel('f/Hz');
- ylabel('幅度(dB)');
- axis([0,4000,-40,5]);
- %以上为模拟滤波器特性
- %转换为数字滤波器
- %脉冲冲击响应变换法
- Fs0=[2000];%采样频率
- Fs=Fs0(1)%T=0.001s及T=0.002s
- [d,c]=impinvar(B,A,Fs)%用impinvar函数实现离散化
- wd=[0:512]*pi/512%设定数字归一化频率
- hw1=freqz(d,c,wd)%计算数字滤波器频响函数
- subplot(1,3,2);
- plot(wd/pi,abs(hw1)/abs(hw1(1)));holdon;%画出数字滤波器幅频特性
- title('脉冲冲击响应变换法');
- grid;xlabel('f/Hz');
- text(0.5,0.74,'T=0.0005s');
- %双极性变换法
- Fs=Fs0(1)%T=0.001s及T=0.002s
- [f,e]=bilinear(B,A,Fs)%用bilinear函数实现离散化
- wd=[0:512]*pi/512%设定数字归一化频率
- hw2=freqz(f,e,wd)%计算数字滤波器频响函数
- subplot(1,3,3);
- plot(wd/pi,abs(hw2)/abs(hw2(1)));holdon;%画出数字滤波器幅频特性
- title('双极性变换法');
- grid;xlabel('f/Hz');
- text(0.5,0.74,'T=0.0005s');
结果如下:
大致这里有几个函数需要注意一下用法:
%巴特沃斯
[B,A]=butter(N,fc,'s');% BUTTER Butterworth digital and analog filter design.
%其中三个参数为,N为滤波器结束,fc为截止频率,s为拉普拉斯算子
%脉冲冲击响应变换法
[d,c]=impinvar(B,A,Fs);%IMPINVAR Impulse invariance method for analog to digital filter conversion.
%这里的B为方程的上半部分,A为方程的下半部分,FS为采样频率
%双极性变换法
[f,e]=bilinear(B,A,Fs);%BILINEAR Bilinear transformation with optional frequency prewarping.
%这里的B为方程的上半部分,A为方程的下半部分,FS为采样频率
OK,就能按照巴特沃斯滤波器的方式去设计简单的数字滤波器了,MATLAB可以直接生成JAVA&C/C++代码,实现还是挺简单的