利用matlab编程设计一模拟信号:x(t)=3sin(2πft)。采样频率fs为5120Hz。在该模拟信号的频率f分别取150 Hz(可以实现正常采样)和3000Hz(欠采样)两种情况下进行采样和恢复演示分析。
时间: 2023-12-28 09:03:56 浏览: 211
压缩感知(Compressed Sensing, CS)matlab代码 实现多个正弦信号的随机欠采样,通过压缩感知恢复
5星 · 资源好评率100%
好的,以下是针对您的要求的Matlab程序设计:
```matlab
% 定义信号参数
f = 150; % 信号频率
fs = 5120; % 采样频率
t = 0:1/fs:1; % 时间序列
x = 3*sin(2*pi*f*t); % 生成信号
% 正常采样情况
fs_normal = 5*f; % 满足奈奎斯特采样定理的采样频率
n_normal = length(t); % 采样点数
t_normal = 0:1/fs_normal:1; % 采样时间序列
x_normal = 3*sin(2*pi*f*t_normal); % 采样信号
% 欠采样情况
fs_undersample = 2*f; % 低于奈奎斯特采样定理的采样频率
n_undersample = length(t); % 采样点数
t_undersample = 0:1/fs_undersample:1; % 采样时间序列
x_undersample = 3*sin(2*pi*f*t_undersample); % 采样信号
% 正常采样信号重构
x_reconstruct_normal = sinc_interpolation(x_normal, t_normal, t); % 插值重构信号
% 欠采样信号重构
x_reconstruct_undersample = sinc_interpolation(x_undersample, t_undersample, t); % 插值重构信号
% 绘制信号和重构信号的时域波形图和频谱图
figure;
subplot(2,2,1);
plot(t, x);
title('Original Signal');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,2);
plot(t_normal, x_normal, 'o');
title('Sampled Signal (Normal)');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,3);
plot(t, x_reconstruct_normal);
title('Reconstructed Signal (Normal)');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,4);
plot(linspace(-fs/2,fs/2,length(fft(x_reconstruct_normal))),abs(fftshift(fft(x_reconstruct_normal))));
title('Frequency Spectrum (Normal)');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
figure;
subplot(2,2,1);
plot(t, x);
title('Original Signal');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,2);
plot(t_undersample, x_undersample, 'o');
title('Sampled Signal (Undersample)');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,3);
plot(t, x_reconstruct_undersample);
title('Reconstructed Signal (Undersample)');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,2,4);
plot(linspace(-fs/2,fs/2,length(fft(x_reconstruct_undersample))),abs(fftshift(fft(x_reconstruct_undersample))));
title('Frequency Spectrum (Undersample)');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
% 定义插值函数
function y = sinc_interpolation(x, t, tn)
y = zeros(1, length(tn));
for i = 1:length(tn)
for j = 1:length(t)
y(i) = y(i) + x(j)*sinc((tn(i) - t(j))*length(x));
end
end
end
```
该程序首先生成一个频率为150Hz的信号,并分别进行了150Hz的正常采样和3000Hz的欠采样。然后,使用插值算法对采样信号进行重构,最后绘制了信号和重构信号的时域波形图和频谱图。
需要注意的是,插值算法的选择对信号重构的质量有很大的影响。在这里,我使用了最简单的sinc插值算法,但在实际应用中,可能需要使用更复杂的插值算法来获得更好的重构质量。
阅读全文