答:
使用用了采样定理和卷积定理进行信号处理。采样定理表明,为了准确恢复一个最高频率为f 的信号,采样频率必须至少是 2f 。在代码中,我们选择了三个不同的信号频率和采样间隔,并计算相应的采样频率。对于频率为 50 赫兹和 300 赫兹的信号,在采样间隔为 0.5 毫秒的情况下,采样频率分别为 2000 赫兹,满足采样定理。然而,对于频率为 300 赫兹的信号,在采样间隔为 2 毫秒的情况下,采样频率为 500 赫兹,低于所需的 600 赫兹,会导致混叠现象,无法正确恢复信号。
其次,理想低通滤波器的频率响应是一个矩形窗口,截止频率内保持恒定,截止频率外为零。其时间域表示为 sinc 函数。我们用 sinc 函数设计理想低通滤波器,通过卷积操作恢复采样信号。在代码中,我们使用 sinc 函数作为滤波器的冲激响应,并对采样信号进行卷积以恢复信号。通过在每个绘图区中绘制不同情况的时域信号、采样信号、频谱以及恢复信号,可以直观比较不同采样间隔对信号恢复的影响。
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% 参数设置
Fs = 1e3; % 连续信号的采样频率
t = 0:1/Fs:0.1; % 连续信号的时间向量
% 定义正弦信号的参数
Fm_values = [50, 300, 300]; % 不同的频率值
Ts_values = [0.5e-3, 0.5e-3, 2e-3]; % 不同的采样间隔
colors = ['r', 'g', 'b']; % 曲线颜色
% 初始化图形
axes(handles.axes1); cla;
axes(handles.axes2); cla;
axes(handles.axes3); cla;
axes(handles.axes4); cla;
axes(handles.axes5); cla;
axes(handles.axes6); cla;
for i = 1:length(Fm_values)
Fm = Fm_values(i);
Ts = Ts_values(i);
% 生成连续时间的正弦信号
x = sin(2*pi*Fm*t);
% 对信号进行采样
n = 0:Ts*Fs:0.1*Fs; % 采样索引
x_sampled = sin(2*pi*Fm*n/Fs);
% 使用理想低通滤波器恢复信号
N = length(n);
f_cutoff = 1/(2*Ts); % 理想低通滤波器的截止频率
sinc_filter = sinc((-N/2:N/2-1)) * f_cutoff;
x_recovered = conv(x_sampled, sinc_filter, 'same');
% 绘制原始信号
axes(handles.axes1);
hold on;
plot(t, x, colors(i), 'DisplayName', ['Fm=' num2str(Fm) 'Hz, Ts=' num2str(Ts*1e3) 'ms']);
title('原始信号');
xlabel('时间 (s)');
ylabel('幅度');
% 绘制采样信号
axes(handles.axes2);
hold on;
stem(n/Fs, x_sampled, colors(i), 'DisplayName', ['Fm=' num2str(Fm) 'Hz, Ts=' num2str(Ts*1e3) 'ms']);
title('采样信号');
xlabel('时间 (s)');
ylabel('幅度');
% 绘制采样信号的频谱
axes(handles.axes3);
hold on;
X_sampled = fftshift(fft(x_sampled, 1024)); % 增加频谱点数以提高频谱分辨率
f = linspace(-Fs/2, Fs/2, 1024);
plot(f, abs(X_sampled), colors(i), 'DisplayName', ['Fm=' num2str(Fm) 'Hz, Ts=' num2str(Ts*1e3) 'ms']);
title('采样信号的频谱');
xlabel('频率 (Hz)');
ylabel('幅度');
% 绘制恢复的信号
axes(handles.axes4);
hold on;
plot(n/Fs, x_recovered, colors(i), 'DisplayName', ['Fm=' num2str(Fm) 'Hz, Ts=' num2str(Ts*1e3) 'ms']);
title('恢复的信号');
xlabel('时间 (s)');
ylabel('幅度');
% 绘制恢复信号的频谱
axes(handles.axes5);
hold on;
X_recovered = fftshift(fft(x_recovered, 1024)); % 增加频谱点数以提高频谱分辨率
plot(f, abs(X_recovered), colors(i), 'DisplayName', ['Fm=' num2str(Fm) 'Hz, Ts=' num2str(Ts*1e3) 'ms']);
title('恢复信号的频谱');
xlabel('频率 (Hz)');
ylabel('幅度');
% 绘制理想低通滤波器的频谱
axes(handles.axes6);
hold on;
F_sinc = fftshift(fft(sinc_filter, 1024));
plot(f, abs(F_sinc), colors(i), 'DisplayName', ['Fm=' num2str(Fm) 'Hz, Ts=' num2str(Ts*1e3) 'ms']);
title('理想低通滤波器的频谱');
xlabel('频率 (Hz)');
ylabel('幅度');
end
% 显示低通滤波器的参数
for i = 1:length(Fm_values)
Fm = Fm_values(i);
Ts = Ts_values(i);
f_cutoff = 1/(2*Ts);
disp(['情况 ' num2str(i) ': Fm = ' num2str(Fm) ' Hz, Ts = ' num2str(Ts*1e3) ' ms']);
disp(['低通滤波器的截止频率: ' num2str(f_cutoff) ' Hz']);
end
% 加上图例
axes(handles.axes1);
legend show;
axes(handles.axes2);
legend show;
axes(handles.axes3);
legend show;
axes(handles.axes4);
legend show;
axes(handles.axes5);
legend show;
axes(handles.axes6);
legend show;
使用Matlab GUIDE
