2017-08-16 105 views
1
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

@Peter Schneider您能给我一些建议吗?谢谢。 – Roger

+0

听起来像是正弦音吗?你应该试着画出几个街区相邻的街区,然后你应该看看有什么问题。 – Matthias

回答

-1

我不确定你在计算中想达到什么目的。对于2kHz声音,每22秒采样或0.5ms采样需要每秒钟或每隔44100个采样/ 1个正弦波。找到这些公式的最好方法是抓住笔和纸,找出你真正想要的(如何实际结合频率,采样率和所需的块长度)。一种可能的方法是在这里,但尝试了解背后的数学(未经测试):

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)     
+0

我认为你的计算和我的一样。 'sample_len'是块大小吗?当我运行该程序时,不同的块大小会导致不同的音调播放。但是,它不应该是这样的。 – Roger

+0

这与OP提供的代码基本相同,只是可读性较差。 – Matthias

相关问题