% 参数设置 fp = 4000; % 通带截止频率 (Hz) fst = 4500; % 阻带截止频率 (Hz) As = 60; % 阻带衰减 (dB) fs = 20000; % 抽样频率 (Hz) % 计算窗口长度 delta_f = (fst - fp) / fs; % 归一化阻带宽度 Delta = 10^(-As / 20); % 阻带衰减系数 M = ceil((6.6 * pi) / (2 * pi * delta_f)); % 使用布莱克曼窗计算滤波器长度 N = M + 1; % 滤波器阶数 % 设计低通滤波器 Wc = (fp + fst) / (2 * fs); % 归一化截止频率 window = blackman(N)'; % 布莱克曼窗 [n, ~] = meshgrid(0:M-1); % 网格生成 hd = 2 * Wc * sinc(2 * Wc * (n-M/2)); % 理想低通滤波器的单位冲激响应 h = hd .* window; %应用布莱克曼窗 % 画出幅度响应曲线和相位响应曲线 [H, freq] = freqz(h, 1, 1024); H_dB = 20 * log10(abs(H)); % 转换为 dB 值 % 幅度响应 figure; plot(freq / pi * fs / 2, H_dB); xlabel('Frequency (Hz)'); ylabel('Gain (dB)'); title('Amplitude Response'); grid on; % 相位响应 figure; unwrap_phase = unwrap(angle(H)); % 解包相位以避免跳变 plot(freq / pi * fs / 2, unwrap_phase); xlabel('Frequency (Hz)'); ylabel('Phase (radians)'); title('Phase Response'); grid on;
时间: 2024-03-11 19:44:42 浏览: 17
根据您提供的代码,第18行为:
hd = 2 * Wc * sinc(2 * Wc * (n-M/2)); % 理想低通滤波器的单位冲激响应
可能会出现“矩阵维度不一致”的错误,这是因为在进行 sinc 函数运算时,(n-M/2) 的维度与 2*Wc 不匹配。解决该问题的方法是使用点除运算符 ./ 代替乘法运算符 *,即将该行代码修改为:
hd = 2 * Wc * sinc(2 * Wc * (n-M/2) ./ fs); % 理想低通滤波器的单位冲激响应
这样就可以避免“矩阵维度不一致”的错误了。
相关问题
fp=2000hz,fst=5000hz,rp=5db,as=40db用matlab设计切比雪夫一型滤波器
在 MATLAB 中设计切比雪夫一型滤波器可以使用 `cheby1` 函数。
首先,需要计算出归一化的通带截止频率 `wp` 和归一化的阻带截止频率 `ws`。由于 `fp=2000hz`,`fst=5000hz`,因此:
```
wp = 2 * pi * fp / fs = 0.4 * pi
ws = 2 * pi * fst / fs = 1 * pi
```
其中,`fs` 是采样频率,这里假设为 `10000hz`。
接下来,需要计算出滤波器的阶数 `n` 和通带最大衰减 `Rp`,由于 `rp=5db`,因此:
```
Rp = 10^(rp/20) - 1 = 0.1151
```
为了满足要求,选择 `n=4`。
最后,调用 `cheby1` 函数进行滤波器设计:
```
[b, a] = cheby1(n, Rp, wp, 's');
```
其中,`n` 是滤波器的阶数,`Rp` 是通带最大衰减,`wp` 是归一化的通带截止频率,`'s'` 表示设计的是模拟滤波器。
设计好的滤波器系数保存在 `b` 和 `a` 中,可以用于滤波器的实现。
matlab 设计一个线性相位 FIR 低通滤波器,给定抽样频率为 2*pi*1.5*10^4 (rad /sec) ,通带截止频率为2*pi*1.5*10^3 (rad /sec) ,阻带起始频率为2*pi*3*10^3 (rad /sec) ,阻带衰减不小于-50dB.
好的,我可以帮你设计一个线性相位FIR低通滤波器。下面是MATLAB代码实现:
```matlab
% 设计参数
Fs = 2*pi*1.5*10^4; % 抽样频率
Fp = 2*pi*1.5*10^3; % 通带截止频率
Rp = 1; % 通带最大衰减
Fst = 2*pi*3*10^3; % 阻带起始频率
Rs = 50; % 阻带最小衰减
% 计算通带和阻带截止频率所对应的数字频率
wp = Fp / (Fs/2);
ws = Fst / (Fs/2);
% 求解滤波器阶数和截止频率
[N, Wc] = buttord(wp, ws, Rp, Rs, 's');
% 根据阶数和截止频率设计滤波器
[b, a] = butter(N, Wc, 'low', 's');
% 将滤波器转换为线性相位FIR滤波器
h = fvtool(b, a, 'Analysis', 'freq');
d = designfilt('linearphasefir', 'FilterOrder', N, 'PassbandFrequency', Fp, 'StopbandFrequency', Fst, 'PassbandRipple', Rp, 'StopbandAttenuation', Rs, 'DesignMethod', 'butter');
% 打印滤波器系数
disp('滤波器系数:')
disp(d.Coefficients)
```
运行以上代码,将得到一个线性相位FIR低通滤波器的系数。你可以将这些系数导入到你的系统中,以实现滤波操作。