我必须绘制信号 m(t) = ASin(2pi1000t),我使用以下 Matlab 代码来完成此操作。
Fm=1000;%1 kHz
Fs = 2*Fm;
t = 0:1/Fs:10; % ( that is, time will run from 0 to 10 with a sample at every 1/2000th second )
Am=1;%amplitude
m=Am*sin(2*pi*Fm*t);
figure(1)
plot(t,m)
title('Message signal')
xlabel('Time in Seconds')
ylabel('m(t)')
但是,我得到的情节是
但另一方面,如果我使用以下代码,
Fm=1000;%1 kHz
t=linspace(0,10,2000);
Am=1;%amplitude
m=Am*sin(2*pi*Fm*t);
figure(1)
plot(t,m)
title('Message signal')
xlabel('Time in S')
我得到了正确的正弦波。这里到底发生了什么?第一个代码有什么问题?
最佳答案
第一个代码片段的问题是采样周期正好是正弦曲线周期的一半。由于您使用的特定采样时刻,您始终在信号的空值处对信号进行采样。这就是为什么您会得到接近 0
的值(它们并不完全是 0
,因为 floating-point arithmetic 固有的数字不准确)。
在第二个代码片段中,从linspace
开始在其端点包含,采样周期略有不同。所以你不会遇到与上面相同的问题,并且你确实得到了正弦曲线。但是,您有一个不同的问题,现在已经很明显了,即 aliasing由于采样不足。观察绘制的正弦曲线的频率与应有的频率有何不同(小得多)。
这两个问题的解决方案是提高采样率。根据Nyquist criterion ,至少两倍于最大信号频率的采样率足以重建原始信号。但这并不意味着直接绘制以该速率采集的样本将产生类似于信号的图形。为此,您需要一个远大于2
的因子。另外,避免将采样率选择为正弦频率的整数倍,以防止采样过程与信号变化“耦合”而导致问题,如第一个代码段中所示。
因此,在您的代码中,尝试例如 Fs = 100/3*Fm
(您可能需要放大才能正确查看信号)。
关于matlab - 在Matlab上绘制正弦波的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65890139/