【问题标题】:Issue with plotting sin wave on Matlab在 Matlab 上绘制正弦波的问题
【发布时间】:2021-01-25 18:09:32
【问题描述】:

我必须绘制信号 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')

我得到了一个适当的罪波。这里到底发生了什么?第一个代码有什么问题?

【问题讨论】:

    标签: matlab signal-processing trigonometry sampling


    【解决方案1】:

    第一个代码 sn-p 的问题是采样周期恰好是正弦曲线周期的一半。由于您使用的特定采样时刻,您总是对信号在其空值进行采样。这就是您获得接近 0 的值的原因(它们不完全是 0,因为floating-point arithmetic 固有的数值不准确)。

    第二个代码sn-p中,由于linspace在其端点处包含,因此采样周期略有不同。所以你没有和上面一样的问题,你确实得到了一个正弦曲线。但是,由于采样不足,您遇到了一个不同的问题,即aliasing。观察绘制的正弦曲线的频率与应有的频率有何不同(小得多)。

    解决这两个问题的解决方案提高采样率。根据Nyquist criterion,至少两倍于最大信号频率的采样率足以重建原始信号。但这并不意味着直接绘制以该速率采集的样本会产生类似于信号的图形。为此,您需要一个比2 大得多的因子。此外,避免将采样率选择为正弦频率的整数倍,以防止由于采样过程“耦合”到第一个 sn-p 中的信号变化而引起的问题。

    因此,在您的代码中,例如尝试Fs = 100/3*Fm(您可能需要放大才能正确查看信号)。

    【讨论】:

    • 将采样周期减小到小于正弦周期的值也意味着将采样频率增加到大于正弦频率的值,对吗?那么我可以简单地使用 Fs = 3*Fm 作为采样频率吗?
    • @MuhammedRoshan Fs 以上2*Fm 将根据奈奎斯特标准进行。在实践中,如果您直接绘制样本,则需要大于2 的因子才能使绘图与信号相似。另外,我建议不要使用Fm 的整数倍数,以避免出现第一张图中的情况。所以试试Fs = 100/3*Fm 之类的东西(并放大以查看信号)
    【解决方案2】:

    Fm=1000 #%1 kHz

    这里是python版本

    import math
    import matplotlib.pyplot as plt
    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 )
    t=np.linspace(0,10,Fs)
    
    Am=1   #%amplitude
    m=[ Am*math.sin(2*math.pi*Fm*value) for value in t]
    plt.plot(m)
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多