在 matlab 中创建正弦波
Creating a sinusoidal wave in matlab
我想创建一个具有以下属性的正弦波:
f=400Hz amp=1 从 0 到 2s 的正弦波
f=200Hz amp=1 的正弦波,从 2 秒到 3 秒
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)
这是我的情节,但看起来一点也不合逻辑,
所以我想知道我的代码中的错误
在这类问题中,您自然会查看物理量,在整个计算过程中始终保持一致非常有帮助。
具体来说,你指定了赫兹(1/秒),一个物理单位,所以你在计算其他所有东西的时候,你需要和那个保持一致。
要在您的等式中执行此操作,最直接的方法是将时间直接放入 sin
函数中,例如 sin(2*pi*f*t)
。但是,由于您想使用不同的 n
来拆分数组,这样做可能最简单,然后使用 t=linspace(0,5,50000)
和 dt = 5.0/50000
或 dt = t(2) - t(1)
,以及 sin(2*pi*400*dt*n1)
.读作 dt*n1
将 n1
中的整数转换为以秒为单位的时间。
还要注意物理单位:上面的400
其实是400Hz
,时间单位是秒,所以2*pi*400*dt*n1
和2*pi*f*t
的单位是Hz * s = 1
,也就是单位抵消,这就是你需要的。
程序员倾向于定义一些单位,比如seconds=1
。这是可能的并且在技术上是正确的,并且可以节省一两次乘法。它几乎总是会导致错误。
另请注意,您应该将 t=linspace(0,5,5000)
更改为 t=linspace(0,5,50000)
之类的内容。原因现在应该很清楚了:您正在查看 400-800Hz 的频率,或几乎 1kHz
,或每毫秒 1 次振荡。要查看正弦波,您需要在每次振荡中输入几个数据点,5 秒内的 50000
个点现在每毫秒会给出大约 10 个点,这几乎不足以看到一个合理的正弦波。或者,无论您想如何计算,您都需要以某种方式确保以足够高的速率进行采样。
也就是说,您遇到的具体错误是,通过使用整数而不是时间数组的几分之一秒,您为 sin
函数采取了太多的步骤。这始终是 sin
函数可能存在的问题,但即使您确实绘制了一个看起来像 sin
的 sin
(例如,使用 0.003Hz 而不是 400Hz 的频率)它仍然是不正确的,因为它没有正确的时间轴。因此,您既需要获得正确的单位,又需要确保每次振荡都获得足够的数据以查看正弦波(或您恰好正在寻找的任何内容)。
我想创建一个具有以下属性的正弦波:
f=400Hz amp=1 从 0 到 2s 的正弦波
f=200Hz amp=1 的正弦波,从 2 秒到 3 秒
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)
这是我的情节,但看起来一点也不合逻辑, 所以我想知道我的代码中的错误
在这类问题中,您自然会查看物理量,在整个计算过程中始终保持一致非常有帮助。
具体来说,你指定了赫兹(1/秒),一个物理单位,所以你在计算其他所有东西的时候,你需要和那个保持一致。
要在您的等式中执行此操作,最直接的方法是将时间直接放入 sin
函数中,例如 sin(2*pi*f*t)
。但是,由于您想使用不同的 n
来拆分数组,这样做可能最简单,然后使用 t=linspace(0,5,50000)
和 dt = 5.0/50000
或 dt = t(2) - t(1)
,以及 sin(2*pi*400*dt*n1)
.读作 dt*n1
将 n1
中的整数转换为以秒为单位的时间。
还要注意物理单位:上面的400
其实是400Hz
,时间单位是秒,所以2*pi*400*dt*n1
和2*pi*f*t
的单位是Hz * s = 1
,也就是单位抵消,这就是你需要的。
程序员倾向于定义一些单位,比如seconds=1
。这是可能的并且在技术上是正确的,并且可以节省一两次乘法。它几乎总是会导致错误。
另请注意,您应该将 t=linspace(0,5,5000)
更改为 t=linspace(0,5,50000)
之类的内容。原因现在应该很清楚了:您正在查看 400-800Hz 的频率,或几乎 1kHz
,或每毫秒 1 次振荡。要查看正弦波,您需要在每次振荡中输入几个数据点,5 秒内的 50000
个点现在每毫秒会给出大约 10 个点,这几乎不足以看到一个合理的正弦波。或者,无论您想如何计算,您都需要以某种方式确保以足够高的速率进行采样。
也就是说,您遇到的具体错误是,通过使用整数而不是时间数组的几分之一秒,您为 sin
函数采取了太多的步骤。这始终是 sin
函数可能存在的问题,但即使您确实绘制了一个看起来像 sin
的 sin
(例如,使用 0.003Hz 而不是 400Hz 的频率)它仍然是不正确的,因为它没有正确的时间轴。因此,您既需要获得正确的单位,又需要确保每次振荡都获得足够的数据以查看正弦波(或您恰好正在寻找的任何内容)。