Python 当我改变块大小时,为什么色调会改变?

Python 当我改变块大小时,为什么色调会改变?,python,audio,pyaudio,Python,Audio,Pyaudio,我想播放一个频率为2000Hz,块大小为64的余弦波。当我改变块大小时,为什么色调会改变?它应该是固定音调,有一定的频率,不管块大小是多少,不是吗? 谢谢你的回复。我不确定你的计算想要达到什么目的。对于2kHz的声音,每秒需要2000个正弦波,或者每44100个采样/1个正弦波,每22个采样或0.5ms。找到这些公式的最佳方法是抓起笔和纸,找出您真正想要的(如何实际组合频率、采样率和所需的块长度)。一种可能的方法是在这里,但尝试理解背后的数学(未经测试): @彼得·施耐德,你能给我一些建议吗?谢

我想播放一个频率为2000Hz,块大小为64的余弦波。当我改变块大小时,为什么色调会改变?它应该是固定音调,有一定的频率,不管块大小是多少,不是吗?
谢谢你的回复。

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


@彼得·施耐德,你能给我一些建议吗?谢谢。听起来像正弦音吗?你应该试着把几个街区相邻地画出来,然后你就会知道问题出在哪里。我想你的计算和我的一样。
sample\u len
是块大小吗?当我运行程序时,不同的块大小将导致播放不同的音调。但是,它不应该是这样的。这基本上和OP提供的代码相同,只是可读性较差。
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)
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)