[英]How do I generate a sine wave using Python?
我試圖在給定的持續時間內生成給定頻率的正弦波,然后將其寫入 a.wav 文件。 我正在使用 numpy 的 sin function 和 scipy 的 wavfile function。我聽到一種奇怪的聲音,這絕對不是正弦波。
import numpy as np
from scipy.io import wavfile
fs = 44100
f = int(raw_input("Enter fundamental frequency: "))
t = float(raw_input("Enter duration of signal (in seconds): "))
samples = np.arange(t * fs)
signal = np.sin(2 * np.pi * f * samples)
signal *= 32767
signal = np.int16(signal)
wavfile.write(str(raw_input("Name your audio: ")), fs, signal)
任何幫助,將不勝感激。 我對正弦波或其他東西做了一些根本上不正確的假設嗎?
使用它並根據需要設置參數
start_time = 0
end_time = 1
sample_rate = 1000
time = np.arange(start_time, end_time, 1/sample_rate)
theta = 0
frequency = 100
amplitude = 1
sinewave = amplitude * np.sin(2 * np.pi * frequency * time + theta)
figure(figsize=(20, 6), dpi=80)
plt.plot(sinewave)
一種簡化的方法:
cycles = 2 # how many sine cycles
resolution = 25 # how many datapoints to generate
length = np.pi * 2 * cycles
my_wave = np.sin(np.arange(0, length, length / resolution))
生成:
[ 0. 0.4818 0.8443 0.998 0.9048 0.5878 0.1253 -0.3681 -0.7705
-0.9823 -0.9511 -0.6845 -0.2487 0.2487 0.6845 0.9511 0.9823 0.7705
0.3681 -0.1253 -0.5878 -0.9048 -0.998 -0.8443 -0.4818]
注意:盡管沒有解決音頻生成的正弦波問題,但仍將此答案留在這里,因為我發現對於我的應用程序,僅參數化波的長度和生成的數據點數量更為直觀,而不是基頻和以秒為單位的持續時間。
更改
samples = np.arange(t * fs)
至
samples = np.linspace(0, t, int(fs*t), endpoint=False)
(這假設fs*t
產生整數值。)
或者,正如Paul Panzer在評論中所說,
samples = np.arange(t * fs) / fs
你的samples
只是整數0,1,2,... fs*t
的序列。 相反,您需要樣本的實際時間值(以秒為單位)。
您正在混合樣本值和長度! 嘗試:
samples = np.linspace(0, t, t * fs)
另一個細節:你不需要str
周圍raw_input
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.