[英]Creating a sinusoidal wave in matlab
我想創建一個具有以下特性的正弦波:
從0到2s的f = 400Hz amp = 1的正弦波
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)
這是我所擁有的情節,看起來還是不合邏輯,所以我想知道代碼中的錯誤
在這種類型的問題中,您自然地要查看物理量,因此在整個計算過程中始終與這一點保持一致非常有幫助。
具體來說,您指定Hz(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的頻率),它仍然是不正確的,因為它不會有適當的時間軸。 因此,您既需要正確設置單位,又要確保每次振盪都獲得足夠的數據以查看正弦波(或碰巧正在尋找的任何東西)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.