为什么在更改块大小时音调会发生变化?

时间:2017-08-16 14:31:26

标签: python audio pyaudio

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块大小的余弦波。为什么在更改块大小时音调会发生变化?无论块大小如何,都应该是一定频率的固定音调,不应该这样吗? 谢谢你的回复。

1 个答案:

答案 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)