如何使用Python生成正弦波?

22

我正在尝试生成一个给定频率和持续时间的正弦波,然后将其写入.wav文件中。我使用了numpy的sin函数和scipy的wavfile函数。但是,我得到了一个奇怪的声音,肯定不是正弦波。

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)

任何帮助都将不胜感激。我是否对正弦波或其他内容做出了基本错误的假设?


2
如果您尝试使用samples = np.arange(t * fs) / fs会发生什么? - Paul Panzer
4个回答

16

更改

samples = np.arange(t * fs)

to

samples = np.linspace(0, t, int(fs*t), endpoint=False)

(这假设fs*t的结果为整数值。)
或者,正如保罗·潘泽在评论中建议的那样,
samples = np.arange(t * fs) / fs

您的样本只是整数0、1、2...... fs*t的序列。相反,您需要样本的实际时间值(以秒为单位)。


1
我认为我的更精确一些(如果 fs*t 不是整数的话)。 - Paul Panzer
是的,现在我明白了!变量samples必须是秒而不是样本。谢谢! - Badrinarayan Rammohan

7
一个简化的方法:
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]

生成的正弦波


注意:尽管这个回答没有涉及用于音频生成的正弦波,但对于我的应用程序而言,仅参数化波长和生成的数据点数比基本频率和持续时间更直观。


4

使用它并按照您的要求设置参数。

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)

3
你混淆了样本值和长度!尝试使用以下方法:
samples = np.linspace(0, t, t * fs)

另一个细节:在raw_input周围不需要使用str


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接