2017-08-16 104 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

相關問題