从pyaudio流中获取作为浮点数的音频样本

2024-04-26 00:29:06 发布

您现在位置:Python中文网/ 问答频道 /正文

由于我目前正准备建立一个基于覆盆子Pi的设备,用于测量用声卡记录的噪声(例如方差)中的一些东西,并试图在python中实现这一点,我一直在想如何获得一个作为浮点数的音频样本,以便进一步计算。

我做了什么:
接了一条线到chinch适配器并触摸插头以产生某种测试信号。
以Audacity或Matlab为例,记录显示了一些合理的结果,比如

enter image description here

我想要的:
理想情况下,我想从声卡中获取5帧1024的样本,并将它们转换成一个列表、元组或numpy数组作为浮点数,以便进一步计算。

在本文末尾的代码中尝试使用python/pyaudio实现这一点时,我得到了如下信息:

enter image description here

由于我用python得到的值与在Matlab(和其他程序)中得到的值相差了大约2倍,我认为我监督了某件事或做错了某件事。 我想我在struct.unpack区域的某个地方犯了个错误,但是不知道确切的位置或原因。 我想请你帮忙,指出错误在哪里,我做错了什么。

获取一些样本并绘制它们的小测试代码:

import pyaudio
import struct
import matplotlib.pyplot as plt

FORMAT = pyaudio.paFloat32
SAMPLEFREQ = 44100
FRAMESIZE = 1024
NOFFRAMES = 220
p = pyaudio.PyAudio()
print('running')

stream = p.open(format=FORMAT,channels=1,rate=SAMPLEFREQ,input=True,frames_per_buffer=FRAMESIZE)
data = stream.read(NOFFRAMES*FRAMESIZE)
decoded = struct.unpack(str(NOFFRAMES*FRAMESIZE)+'f',data)

stream.stop_stream()
stream.close()
p.terminate()
print('done')
plt.plot(decoded)
plt.show()

Tags: importformatstream错误记录pltstruct样本
1条回答
网友
1楼 · 发布于 2024-04-26 00:29:06

尝试使用“numpy.fromstring”函数替换“struct.unpack”:

import numpy
stream = p.open(format=FORMAT,channels=1,rate=SAMPLEFREQ,input=True,frames_per_buffer=FRAMESIZE)
data = stream.read(NOFFRAMES*FRAMESIZE)
decoded = numpy.fromstring(data, 'Float32');

如果这对你有用就告诉我

相关问题 更多 >