clc;clear;close; fc=1000; ap=1;as=25;fp=100;fs=300; wp=2*pi*fp/fc; ws=2*pi*fs/fc; Wanp=wp*fc; Wans=ws*fc; [N,wanc]=buttord(Wanp,Wans,ap,as,'s'); [b,a]=butter(N,Wans,'s'); [B1,A1]=impinvar(b,a,fc); [H1,w]=freqz(B1,A1,'whole'); subplot(2,1,1); plot(w*fc/2/pi,20*log10(abs(H1)));grid on; axis([0,1000,-40,0]);ylabel('H1幅值dB'); title('频率响应'); ap=1;as=25;fp=100;fs=300; fc=1000; wp=2*pi*fp/fc; ws=2*pi*fs/fc; anp=2*fc*tan(wp/2); ans=2*fc*tan(ws/2); [N,anc]=buttord(anp,ans,ap,as,'s'); [b,a]=butter(N,anc,'s'); [B2,A2]=bilinear(b,a,fc); [H2,w]=freqz(B2,A2,'whole'); subplot(2,1,2);plot(w*fc/2/pi,20*log10(abs(H2))); axis([0,1000,-100,0]);grid on; xlabel('频率(Hz)'); ylabel('幅值(dB)'); title('频率响应'); 什么意思?
时间: 2024-03-28 10:39:55 浏览: 62
这段程序是用MATLAB实现了一个数字滤波器的设计。具体来说,它使用了巴特沃斯滤波器设计方法,并分别采用了模拟滤波器转换为数字滤波器和双线性变换方法来实现。其中,程序中的变量ap、as、fp、fs、fc、wp、ws、anp和ans分别表示滤波器的通带最大衰减、阻带最小衰减、通带截止频率、阻带截止频率、采样频率、归一化通带截止频率、归一化阻带截止频率、模拟滤波器的通带截止频率和阻带截止频率。程序中的subplot、plot、grid、axis和xlabel等函数都是MATLAB中用于绘制图形和设置图形属性的函数。
相关问题
clc;clear;close; fc=1000; ap=1;as=25;fp=100;fs=300; wp=2*pi*fp/fc; ws=2*pi*fs/fc; Wanp=wp*fc; Wans=ws*fc; [N,wanc]=buttord(Wanp,Wans,ap,as,'s'); [b,a]=butter(N,Wans,'s'); [B1,A1]=impinvar(b,a,fc); [H1,w]=freqz(B1,A1,'whole'); subplot(2,1,1); plot(w*fc/2/pi,20*log10(abs(H1)));grid on; axis([0,1000,-40,0]);ylabel('H1幅值dB'); title; ap=1;as=25;fp=100;fs=300; fc=1000; wp=2*pi*fp/fc; ws=2*pi*fs/fc; anp=2*fc*tan(wp/2); ans=2*fc*tan(ws/2); [N,anc]=buttord(anp,ans,ap,as,'s'); [b,a]=butter(N,anc,'s'); [B2,A2]=bilinear(b,a,fc); [H2,w]=freqz(B2,A2,'whole'); subplot(2,1,2);plot(w*fc/2/pi,20*log(abs(H2))); axis([0,1000,-100,0]);grid on; xlabel;ylabel; title; 这个代码错哪里啦?
这段代码存在一些问题:
1. `title`、`xlabel`、`ylabel` 函数需要传入字符串参数,否则会报错;
2. `20*log` 函数应该改为 `20*log10`;
3. `xlabel` 和 `ylabel` 函数也需要传入字符串参数。
以下是修改后的代码:
```
clc; clear; close;
fc = 1000; ap = 1; as = 25; fp = 100; fs = 300;
wp = 2*pi*fp/fc; ws = 2*pi*fs/fc;
Wanp = wp*fc; Wans = ws*fc;
[N, wanc] = buttord(Wanp, Wans, ap, as, 's');
[b, a] = butter(N, Wans, 's');
[B1, A1] = impinvar(b, a, fc);
[H1, w] = freqz(B1, A1, 'whole');
subplot(2, 1, 1);
plot(w*fc/2/pi, 20*log10(abs(H1))); grid on; axis([0, 1000, -40, 0]);
ylabel('H1幅值(dB)'); title('频率响应');
ap = 1; as = 25; fp = 100; fs = 300; fc = 1000;
wp = 2*pi*fp/fc; ws = 2*pi*fs/fc;
anp = 2*fc*tan(wp/2); ans = 2*fc*tan(ws/2);
[N, anc] = buttord(anp, ans, ap, as, 's');
[b, a] = butter(N, anc, 's');
[B2, A2] = bilinear(b, a, fc);
[H2, w] = freqz(B2, A2, 'whole');
subplot(2, 1, 2);
plot(w*fc/2/pi, 20*log10(abs(H2))); axis([0, 1000, -100, 0]);
grid on; xlabel('频率(Hz)'); ylabel('幅值(dB)'); title('频率响应');
```
clear;clc;close all; fc=1000; ap=1;as=30;fp=200;fs=400; wp=2*pi*fp/fc; ws=2*pi*fs/fc; wanp=wp*fc; wans=ws*fc; [N,Wanc]=buttord(wanp,wans,ap,as,'s'); [b,a]=butter(N,Wanc,'s'); [B1,A1]=impinvar(b,a,fc) [H1,w]=freqz(B1,A1,'whole'); subplot(2,1,1); plot(w*fc/2/pi,20*log10(abs(H1)));grid on; axis([0,1000,-40,0]);ylabel('H1幅值dB'); title('冲激响应'); anp=2*fc*tan(wp/2); ans=2*fc*tan(ws/2); [N,anc]=buttord(anp,ans,ap,as,'s'); [b,a]=butter(N,anc,'s'); [B2,A2]=bilinear(b,a,fc) [H2,w]=freqz(B2,A2,'whole'); subplot(2,1,2);plot(w*fc/2/pi,20*log10(abs(H2))); axis([0,1000,-100,0]);grid on; xlabel('频率');ylabel('幅值'); title('双线性变换');将低通变为高通
为了将低通变为高通,我们需要对原始的巴特沃斯滤波器进行频率变换。具体来说,我们可以通过以下步骤来实现:
1. 将原始的巴特沃斯滤波器从低通变为带阻滤波器,也就是将通带从0~fp变为(fp,fs)。
2. 对带阻滤波器进行频率变换,将带通中心频率fp变为(fs+fp)/2,得到一个带通滤波器。
3. 对带通滤波器进行频率变换,将带通中心频率(fs+fp)/2变为fs,得到一个高通滤波器。
具体的MATLAB代码如下:
clear;clc;close all;
fc=1000; ap=1;as=30;fp=200;fs=400;
wp=2*pi*fp/fc; ws=2*pi*fs/fc;
wanp=wp*fc; wans=ws*fc;
% 将原始的巴特沃斯滤波器从低通变为带阻滤波器
[N,Wanc]=buttord(wanp,wans,ap,as,'s');
[b,a]=butter(N,Wanc,'s');
% 进行第一次频率变换,将带通中心频率fp变为(fs+fp)/2
fp2=(fs+fp)/2;
wp2=2*pi*fp2/fc;
Wp2=wp2*fc;
[B1,A1]=lp2bp(b,a,wp2);
% 进行第二次频率变换,将带通中心频率(fs+fp)/2变为fs
fs2=fs;
ws2=2*pi*fs2/fc;
Ws2=ws2*fc;
[B2,A2]=bilinear(B1,A1,fs2/fc);
% 求取频率响应并画图
[H2,w]=freqz(B2,A2,'whole');
figure;
plot(w*fc/2/pi,20*log10(abs(H2)));
axis([0,1000,-40,0]);grid on;
xlabel('频率');
ylabel('H2幅值dB');
title('高通滤波器');
阅读全文
相关推荐
















