如何从输入音频流中提取频率信息(使用PortAudio)?

2 投票
2 回答
6360 浏览
提问于 2025-04-11 18:40

我想用PortAudio(PyAudio)来录制声音(比如说话),然后把对应的声音波形显示在屏幕上。不过我实在是太无助了,无法从音频流中提取频率信息,这样我就不能把它画成赫兹/时间的形式。


这里有一段示例代码,可以录制和播放录制的音频,持续五秒钟,希望对你有帮助:

p = pyaudio.PyAudio()

chunk = 1024
seconds = 5

stream = p.open(format=pyaudio.paInt16,
                channels=1,
                rate=44100,
                input=True,
                output=True)

for i in range(0, 44100 / chunk * seconds):
    data = stream.read(chunk)
    stream.write(data, chunk)

我希望从上面的变量“data”中提取所需的信息。(或者用PortAudio或其他有Python绑定的库来使用一些更高级的方法。)


如果有人能帮我,我会非常感激!即使是一些与音频分析相关的零碎知识也很受欢迎。:)

2 个回答

1

傅里叶变换如果你想同时分析频率和时间的话,可能帮不上太多忙。你可以考虑看看“小波变换”。有一个叫做pywavelets的工具包……http://www.pybytes.com/pywavelets/#discrete-wavelet-transform-dwt

4

你想要的可能是音频数据的傅里叶变换。现在有很多工具包可以帮你计算这个,比如 scipynumpy 就是其中两个。这个过程通常被称为“快速傅里叶变换”(FFT),但这只是算法的名字。

这里有一个使用的例子:https://svn.enthought.com/enthought/browser/Chaco/trunk/examples/advanced/spectrum.py

撰写回答