import pyaudio
import numpy as np
RATE=44100
block = 64
pa = pyaudio.PyAudio()
stream = pa.open(format=pyaudio.paFloat32,
channels=1,
rate=RATE,
output=True)
while True:
x = np.arange(block,dtype=np.float32)
output = np.cos(2*np.pi*2000*x/44100)
output = output.tobytes()
stream.write(output)
我想播放2000Hz频率和64块大小的余弦波。为什么在更改块大小时音调会发生变化?无论块大小如何,都应该是一定频率的固定音调,不应该这样吗? 谢谢你的回复。
答案 0 :(得分:-1)
我不确定你想要通过计算实现什么。对于2kHz的声音,你需要每秒2000个正弦波或每44100个样本/ 1个正弦波,每22个样本或0.5毫秒。找到这样的公式的最好方法是抓住笔和纸,找出你真正想要的东西(如何实际组合频率,采样率和所需的块长度)。一种可能的方法是在这里,但试着理解背后的数学(未经测试):
import pyaudio
import numpy as np
RATE=44100
FREQUENCY = 2000
pa = pyaudio.PyAudio()
stream = pa.open(format=pyaudio.paFloat32,
channels=1,
rate=RATE,
output=True)
sample_len = 4000.0
wave_len = float(RATE) / FREQUENCY # ~22 samples per wave
# x goes from 0 to 1 for approx index 0..wave_len-1, 1..2 for wave_len..2wave_len-1, ...
x = np.arange(sample_len,dtype=np.float32)/wave_len
# 0..1 -> 0..1..0..-1..0; 1..2 -> 0..1..0..-1..0
# yes, I prefer sin over cos
output = np.sin(2*np.pi*x)
output = output.tobytes()
# no need to recreate the pattern every cycle
while True:
stream.write(output)