对以下代码进行分析;% 例1,设计一个带通滤波器,其参数为:ws1=0.2*pi;wp1=0.35*pi; wp2=0.65*pi;ws2=0.8*pi;Ap=-3dB, As=-75dB; % 根据阻带要求选择布莱克曼窗。 clear;clc; ws1=0.2*pi; wp1=0.35*pi; wp2=0.65*pi; ws2=0.8*pi; Ap=-3; As=-75; wd=min((wp1-ws1),(ws2-wp2)); wc1=(ws1+wp1)/2; wc2=(ws2+wp2)/2; % 计算窗口长度 N=ceil(11*pi/wd); % 计算窗口 w_bla=(blackman(N+1))'; hd=ideal_lp(wc2,N+1)-ideal_lp(wc1,N+1);%低通 h=hd.*w_bla; % 采用窗函数设计法完成低通滤波器的设计,参数为: wp1=0.35*pi; wp=0.35*pi;ws=0.8*pi;Ap=-3dB, As=-45dB; % 阻带要求是As % 采用窗函数设计法完成低通滤波器的设计 % 采用汉明窗以及ideal_lp函数 % 参数为:wp1=0.35pi; wp=0.35pi; ws=0.8*pi; Ap=-3dB, As=-45dB clear;clc; % 参数设置 wp1 = 0.35*pi; % 通带截止频率1 wp = 0.35*pi; % 通带截止频率2 ws = 0.8*pi; % 阻带截止频率 Ap = 3; % 通带最大衰减 As = 45; % 阻带最小衰减 % 计算滤波器阶数和截止频率 delta_w = ws - wp; delta_p = (10^(Ap/20)-1)/(10^(Ap/20)+1); delta_s = 10^(-As/20); A = -20*log10(min(delta_p,delta_s)); n = ceil((A-8)/(2.285*delta_w/pi)); wc = (wp+ws)/2; % 汉宁窗窗函数设计法 h = fir1(n, wc/pi, hann(n+1)); % 绘制滤波器幅频特性曲线 [H, W] = freqz(h, 1, 1024); figure; plot(W/pi, 20*log10(abs(H)));title('低通滤波器幅频特性曲线');xlabel('频率/\pi');ylabel('幅值/dB'); fvtool(h, 1); clear;clc; % 定义参数 ws = 0.2*pi; % 通带截止频率 wp = 0.35*pi; % 阻带截止频率 Ap = 3; % 通带最大衰减量 As = 50; % 阻带最小衰减量 % 计算数字滤波器阶数和截止频率 [N, wn] = buttord(wp/pi, ws/pi, Ap, As); % 设计数字滤波器b和a分别是分子和分母多项式的系数 [b, a] = butter(N, wn, 'high'); % 绘制滤波器频率响应曲线 freqz(b, a); fvtool(b, a);
时间: 2023-08-04 07:07:14 浏览: 126
此代码实现了两个滤波器的设计,一个是带通滤波器,一个是高通滤波器。
对于带通滤波器,先根据阻带要求选择布莱克曼窗,然后计算窗口长度。接着利用ideal_lp函数得到低通滤波器的理想频率响应,再用窗函数乘上,得到带通滤波器的频率响应。
对于高通滤波器,采用汉宁窗窗函数设计法,先计算滤波器阶数和截止频率,然后用fir1函数得到滤波器系数,最后绘制滤波器的频率响应曲线。
同时,在每个滤波器的设计中,都有对应的参数设置和计算过程,最后用fvtool函数绘制滤波器的幅频特性曲线。
相关问题
matlab编写程序设计一个带通滤波器,其参数为:ws1=0.2*pi;wp1=0.35*pi; wp2=0.65*pi;ws2=0.8*pi;Ap=-3dB, As=-75dB; 根据阻带要求选择布莱克曼窗。
好的,以下是 Matlab 代码实现:
```matlab
% 定义参数
ws1 = 0.2*pi;
wp1 = 0.35*pi;
wp2 = 0.65*pi;
ws2 = 0.8*pi;
Ap = 3; % 单位为 dB
As = 75; % 单位为 dB
% 计算通带和阻带边缘频率
wc1 = sqrt(wp1*ws1);
wc2 = sqrt(wp2*ws2);
% 计算通带和阻带宽度
dw1 = wc2 - wc1;
dw2 = min(wc1, ws2-wp2);
% 计算窗函数长度
N = ceil((As-8)/(2.285*dw2));
if mod(N, 2) == 0
N = N + 1;
end
% 生成布莱克曼窗函数
w = blackman(N);
% 计算理想带通滤波器的频率响应
h_ideal = ideal_lp(wc2, N) - ideal_lp(wc1, N);
% 应用窗函数
h = h_ideal' .* w;
% 频域中心移位
h_shift = fftshift(h);
% 绘制频率响应曲线
[H, w] = freqz(h_shift);
mag_H = 20*log10(abs(H));
plot(w/pi, mag_H);
xlabel('Normalized Frequency (\times\pi rad/sample)');
ylabel('Magnitude (dB)');
title('Magnitude Response of Bandpass Filter');
% 输出滤波器系数
b = h_shift;
a = 1;
```
其中 `ideal_lp` 函数用于计算理想低通滤波器的频率响应,实现如下:
```matlab
function h = ideal_lp(wc, N)
% Ideal lowpass filter calculation
% wc : cutoff frequency
% N : filter length (odd)
% h : filter impulse response
h = zeros(1, N);
n = -(N-1)/2 : (N-1)/2;
for i = 1 : length(n)
if n(i) == 0
h(i) = pi * wc;
else
h(i) = sin(pi*wc*n(i)) / (pi*n(i));
end
end
end
```
最终得到的滤波器系数为 `b`,`a` 为 1。
matlab编写程序设计带通滤波器,参数要求为ws1=0.2*pi;wp1=0.35*pi; ws2=0.8*pi;wp2=0.65*pi;Ap=-3dB, As=-65dB;N=40,给定T1,T2
好的,根据您的要求,我为您编写了一个MATLAB程序,实现了40阶带通滤波器的设计。以下是代码:
```
% 定义参数
ws1 = 0.2 * pi;
wp1 = 0.35 * pi;
ws2 = 0.8 * pi;
wp2 = 0.65 * pi;
Ap = 3;
As = 65;
N = 40;
T1 = 0.1;
T2 = 0.2;
% 计算通带截止频率和阻带截止频率
wp = [wp1, wp2];
ws = [ws1, ws2];
% 计算折中频率
wc = sqrt(wp1*wp2);
% 选择滤波器类型
delta_p = (10^(0.05*Ap)-1)/(10^(0.05*Ap)+1);
delta_s = 10^(-0.05*As);
epsilon = sqrt(delta_p);
if delta_p < delta_s
type = 'elliptic';
else
type = 'chebyshev2';
end
% 计算滤波器参数
if strcmp(type, 'elliptic')
[N, Wn] = ellipord(wp, ws, delta_p, delta_s);
[b, a] = ellip(N, epsilon, As, Wn);
elseif strcmp(type, 'chebyshev2')
[N, Wn] = cheb2ord(wp, ws, delta_p, delta_s);
[b, a] = cheby2(N, As, Wn);
end
% 绘制幅频特性图
[H, w] = freqz(b, a);
figure;
plot(w/pi, 20*log10(abs(H)));
title('Magnitude Response');
xlabel('Normalized Frequency (\times\pi rad/sample)');
ylabel('Magnitude (dB)');
grid on;
% 计算单位抽样响应
n = 0:N-1;
imp = (wc/pi)*sinc((wc/pi)*(n-(N-1)/2));
h = b(1)*imp;
for i = 2:length(b)
imp = [0 imp(1:end-1)];
h = h + b(i)*imp;
end
for i = 2:length(a)
imp = [0 imp(1:end-1)];
h = h - a(i)*h;
end
% 绘制单位抽样响应图
figure;
stem(n, h);
title('Impulse Response');
xlabel('n');
ylabel('Amplitude');
grid on;
% 计算单位阶跃响应
step = ones(1, N);
y = filter(b, a, step);
% 绘制单位阶跃响应图
figure;
stem(n, y);
title('Step Response');
xlabel('n');
ylabel('Amplitude');
grid on;
% 计算T1和T2时的输出响应
t = 0:N-1;
x = cos(wc*t);
y1 = filter(b, a, x);
y2 = filter(b, a, x.*(t>=T1));
y3 = filter(b, a, x.*(t>=T2));
% 绘制输出响应图
figure;
subplot(3, 1, 1);
plot(t, x);
title('Input Signal');
xlabel('n');
ylabel('Amplitude');
grid on;
subplot(3, 1, 2);
plot(t, y1);
title('Output Signal (All)');
xlabel('n');
ylabel('Amplitude');
grid on;
subplot(3, 1, 3);
plot(t, y2, 'r', t, y3, 'g');
title(['Output Signal (T1=', num2str(T1), ', T2=', num2str(T2), ')']);
xlabel('n');
ylabel('Amplitude');
legend(['T1=', num2str(T1)], ['T2=', num2str(T2)]);
grid on;
```
您可以将代码复制到MATLAB代码编辑器中运行,得到滤波器的单位抽样响应、单位阶跃响应和输出响应。同时,程序还绘制了滤波器的幅频特性图和输出响应图。
阅读全文