参考文档中的matlab部分代码,修改完善MWORKS代码部分,要求将MWORKS代码部分的步骤三:设计相应滤波器对信号进行滤波进行修改,使这部分的代码能够和matlab部分的步骤三中的一样,可以弹出对话框让用户输入滤波器类型和截止频率,并根据用户选择设计滤波器,给出修正后的代码
时间: 2025-02-26 19:28:29 浏览: 125
以下是根据MATLAB部分代码修改完善的MWORKS代码,在步骤三中添加了弹出对话框让用户输入滤波器类型和截止频率的功能,并根据用户的选择设计滤波器:
```matlab
%% 步骤三:设计相应滤波器对信号进行滤波
% 弹出对话框让用户输入滤波器类型和截止频率
prompt = {'请选择滤波器类型:', '请输入截止频率(Hz):'};
dlg_title = '滤波器设计';
num_lines = 1;
def_input = {'低通', '200'};
answer = inputdlg(prompt, dlg_title, num_lines, def_input);
filter_type = answer{1};
cutoff_frequency = str2double(answer{2});
% 检查用户输入的有效性
if isnan(cutoff_frequency) || cutoff_frequency <= 0 || cutoff_frequency >= Fs/2
error('无效的截止频率,请输入一个介于0和%s之间的正值', num2str(Fs/2));
end
% 根据用户选择设计滤波器
switch lower(filter_type)
case '低通'
[b, a] = butter(4, cutoff_frequency/(Fs/2), 'low');
case '高通'
[b, a] = butter(4, cutoff_frequency/(Fs/2), 'high');
case '带通'
prompt = {'请输入带通频率范围(低频-Hz 高频-Hz):'};
dlg_title = '带通滤波器设计';
def_input = {'100 500'};
answer_bp = inputdlg(prompt, dlg_title, num_lines, def_input);
freq_range = str2double(regexp(answer_bp{1}, '\s+', 'split'));
if length(freq_range) ~= 2 || any(isnan(freq_range)) || any(freq_range <= 0) || any(freq_range >= Fs/2) || freq_range(1) >= freq_range(2)
error('无效的带通频率范围,请输入两个介于0和%s之间的正值,并且低频小于高频', num2str(Fs/2));
end
[b, a] = butter(4, freq_range./(Fs/2), 'bandpass');
case '带阻'
prompt = {'请输入带阻频率范围(低频-Hz 高频-Hz):'};
dlg_title = '带阻滤波器设计';
def_input = {'100 500'};
answer_bs = inputdlg(prompt, dlg_title, num_lines, def_input);
freq_range = str2double(regexp(answer_bs{1}, '\s+', 'split'));
if length(freq_range) ~= 2 || any(isnan(freq_range)) || any(freq_range <= 0) || any(freq_range >= Fs/2) || freq_range(1) >= freq_range(2)
error('无效的带阻频率范围,请输入两个介于0和%s之间的正值,并且低频小于高频', num2str(Fs/2));
end
[b, a] = butter(4, freq_range./(Fs/2), 'stop');
otherwise
error('未知的滤波器类型,请选择低通、高通、带通或带阻');
end
% 应用设计的滤波器
signal_filtered = filtfilt(b, a, signal_truncated);
% 绘制滤波前后时域波形对比
figure;
hold on;
plot(t_truncated, signal_truncated, 'b', 'DisplayName', '截断后的信号');
plot(t_truncated, signal_filtered, 'r', 'DisplayName', ['滤波后的信号 (' filter_type ')']);
title(['滤波前后的时域波形对比']);
xlabel('时间 (s)');
ylabel('幅度');
legend;
hold off;
% 计算滤波后的频谱
Y_filtered = fft(signal_filtered);
P2_filtered = abs(Y_filtered / length(signal_filtered));
P1_filtered = P2_filtered(1:length(signal_filtered) / 2 + 1);
P1_filtered(2:end - 1) = 2 * P1_filtered(2:end - 1);
% 定义频率轴
f = Fs * (0 : (length(signal_filtered) / 2)) / length(signal_filtered);
% 绘制滤波前后频谱对比
figure;
hold on;
plot(f, P1, 'b', 'DisplayName', '截断后的频谱');
plot(f, P1_filtered, 'r', 'DisplayName', ['滤波后的频谱 (' filter_type ')']);
title(['滤波前后的频谱对比']);
xlabel('频率 (Hz)');
ylabel('幅度');
legend;
hold off;
% 播放滤波前后的信号
sound(signal_truncated, Fs); % 截断后的信号
pause(2);
sound(signal_filtered, Fs); % 滤波后的信号
pause(2);
% 绘制滤波器的幅频特性和相频特性
figure;
hold on;
[H, W] = freqz(b, a, 512, Fs);
plot(W, abs(H));
title(['滤波器幅频特性 (' filter_type ')']);
xlabel('频率 (Hz)');
ylabel('幅度');
hold off;
figure;
hold on;
plot(W, angle(H));
title(['滤波器相频特性 (' filter_type ')']);
xlabel('频率 (Hz)');
ylabel('相位 (rad)');
hold off;
```
### 修改说明:
1. **增加用户交互**:通过`inputdlg`函数弹出对话框让用户输入滤波器类型和截止频率。
2. **有效性检查**:增加了对用户输入的截止频率和带通/带阻频率范围的有效性检查,防止无效输入导致程序错误。
3. **滤波器设计**:根据用户选择的滤波器类型(低通、高通、带通、带阻),调用`butter`函数生成对应的滤波器系数。
4. **应用滤波器**:利用`filtfilt`函数对截断后的信号进行滤波处理。
5. **结果可视化**:绘制滤波前后的时域波形、频谱图以及滤波器的幅频特性和相频特性。
6. **播放声音**:在滤波前后分别播放信号以对比效果。
这样修改后,MWORKS代码部分的步骤三就具备了与MATLAB部分相同的交互式滤波器设计功能。
阅读全文
相关推荐


















