在MATLAB中创建正弦波

时间:2018-10-24 16:40:35

标签: matlab signal-processing sine

我想创建一个具有以下特性的正弦波:

  • f = 400Hz amp = 1且从0到2s的正弦波

  • f = 200Hz amp = 1的正弦波从2到3s

  • f = 800Hz amp = 2的正弦波,持续3到5s

这是我的matlab代码:

t=linspace(0,5,5000);
x=zeros(1,length(t));
n1=0:1999;
n2=2000:2999;
n3=3000:4999;
x(1:2000)=1*sin(2*pi*400*n1);
x(2001:3000)=1*sin(2*pi*200*n2);
x(3001:5000)=2*sin(2*pi*800*n3);
plot(t,x)

这是我的情节,看起来还是不合逻辑的, 所以我想知道我的代码中的错误

enter image description here

1 个答案:

答案 0 :(得分:0)

在这种类型的问题中,您自然地要查看物理量,因此在整个计算过程中始终与之保持一致非常有帮助。

具体来说,您可以指定Hz(1 /秒)(一种物理单位),因此在计算其他所有内容时,都需要与之保持一致。

要在方程式中执行此操作,最直接的方法是将时间直接放在sin函数中,例如sin(2*pi*f*t)。但是,由于您想使用不同的n分解数组,因此最简单的方法是先使用t=linspace(0,5,50000)dt = 5.0/50000dt = t(2) - t(1)sin(2*pi*400*dt*n1) 。将其读为dt*n1会将n1中的整数转换为以秒为单位的时间。

也请注意物理单位:上面的400实际上是400Hz,时间以秒为单位,因此2*pi*400*dt*n12*pi*f*t的单位是{{1 }},即取消单位,这就是您需要的。

程序员倾向于定义一些单位,例如Hz * s = 1。这是可能的,并且在技术上是正确的,并且可以节省一两个乘法。几乎总是会导致错误。

请注意,您应该从seconds=1更改为t=linspace(0,5,5000)。现在,原因应该很清楚:您正在查看的频率范围是400-800Hz,或者几乎是t=linspace(0,5,50000),或者是每毫秒1次振荡。要查看正弦波,您需要在每次振荡中获取几个数据点,而5秒内的1kHz点现在将为每毫秒10个点,这几乎不足以看到一个合理的正弦波。或者,但是,您想考虑一下计算,就需要以某种方式确保以足够高的速率进行采样。

也就是说,您遇到的特定错误是通过使用整数而不是时间数组使用一秒的小数,您为50000函数采取了太多步骤。 sin函数始终是一个可能的问题,但是即使您确实绘制了一个看起来像sin的{​​{1}}(例如,使用0.003Hz而不是400Hz的频率),仍然不正确,因为它没有正确的时间轴。因此,您既需要正确设置单位,又要确保每次振荡都获得足够的数据以查看正弦波(或正好要寻找的东西)。