利用 kaiser 窗设计 FIR 低通滤波器,通带边界频率 0.3π,阻带边界频 率 0.5π,阻带衰减不小于 50dB。matlab
时间: 2024-03-09 16:47:55 浏览: 128
好的,使用kaiser窗设计FIR低通滤波器的步骤可以按照以下方式进行:
1. 确定滤波器的基本参数,包括截止频率、采样频率、滤波器阶数等。根据题目要求,截止频率为0.3π,阻带边界频率为0.5π,阻带衰减不小于50dB。
```
wp = 0.3*pi; % 通带边界频率
ws = 0.5*pi; % 阻带边界频率
Rp = 1; % 通带最大衰减量(dB)
Rs = 50; % 阻带最小衰减量(dB)
```
2. 根据滤波器的基本参数,计算出滤波器的设计参数。根据kaiser窗设计的原理,需要先计算出kaiser窗的beta值和所需滤波器的阶数。
```
delta_w = ws - wp; % 通带宽度
A = -20*log10(Rp); % 通带最大衰减量(dB)
beta = kaiser_beta(A); % 计算kaiser窗的beta值
N = kaiser_N(A, delta_w); % 计算所需滤波器的阶数
```
其中,kaiser_beta和kaiser_N是自定义函数,分别用于计算kaiser窗的beta值和所需滤波器的阶数。代码如下:
```
function beta = kaiser_beta(A)
% 计算kaiser窗的beta值
if A >= 50
beta = 0.1102*(A-8.7);
elseif A >= 21 && A < 50
beta = 0.5842*(A-21)^0.4 + 0.07886*(A-21);
else
beta = 0;
end
end
function N = kaiser_N(A, delta_w)
% 计算所需滤波器的阶数
if A > 50
alpha = 0.1102*(A-8.7);
else
alpha = 0.5842*(A-21)^0.4 + 0.07886*(A-21);
end
N = ceil((A-8)/(2.285*delta_w));
if mod(N, 2) == 1
N = N + 1;
end
end
```
3. 使用fir1函数生成kaiser窗滤波器系数。
```
wc = (wp+ws)/2; % 通带截止频率
b = kaiser(N+1, beta); % 生成kaiser窗
h = fir1(N, wc/pi, 'low', b); % 生成低通滤波器系数
```
其中,kaiser函数用于生成kaiser窗,'low'表示生成低通滤波器,wc/pi是通带截止频率的归一化值。
4. 使用freqz函数绘制滤波器的幅频特性和相频特性,以及相应的群延迟特性。
```
[H, W] = freqz(h);
mag = 20*log10(abs(H));
phase = unwrap(angle(H));
delay = -diff(phase) / (W(2)-W(1));
subplot(3, 1, 1);
plot(W/pi, mag);
title('Amplitude Response');
xlabel('Normalized Frequency (\times\pi rad/sample)');
ylabel('Magnitude (dB)');
ylim([-60 10]);
subplot(3, 1, 2);
plot(W/pi, phase);
title('Phase Response');
xlabel('Normalized Frequency (\times\pi rad/sample)');
ylabel('Phase (rad)');
subplot(3, 1, 3);
plot(W(2:end)/pi, delay);
title('Group Delay');
xlabel('Normalized Frequency (\times\pi rad/sample)');
ylabel('Delay (samples)');
```
其中,freqz函数用于计算滤波器的频率响应,H是频率响应,W是对应的频率轴。
5. 对滤波器进行实现和测试,可以使用firfilt函数来实现。
```
x = 输入信号;
y = firfilt(h, x);
```
其中,输入信号x可以是一个向量或者矩阵,输出信号y和输入信号具有相同的维度。
希望这些步骤能够对您有所帮助!
阅读全文