h1=freqz(b1,1,M)
时间: 2024-03-12 09:50:24 浏览: 99
这段代码用于计算一个数字滤波器的频率响应,并返回M个频率响应的样本点。
具体来说,`freqz(b1, 1, M)`中,`b1`表示数字滤波器的分子系数,`1`表示数字滤波器的分母系数为1,即为一阶滤波器,`M`表示计算频率响应的样本点数目。函数返回一个长度为`M`的复数向量`h1`,表示对应的频率响应样本点。
在MATLAB中,通常使用`b1`和`a1`表示数字滤波器的分子和分母系数,其中,`b1`和`a1`都是一维行向量,分别对应数字滤波器的分子和分母多项式系数。`freqz`函数的第一个参数`b1`即为数字滤波器的分子系数。
例如,下面的代码用于计算一个10阶Butterworth低通滤波器的频率响应,并返回100个频率响应的样本点:
```
[b1, a1] = butter(10, 0.5);
h1 = freqz(b1, 1, 100);
```
这将返回一个长度为100的复数向量`h1`,表示Butterworth低通滤波器在对应频率点的频率响应。可以通过计算其幅度和相位,来分析滤波器的特性。
相关问题
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('高通滤波器');
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('频率响应');
```
阅读全文