6

由于我目前正要构建一个基于 Raspberry Pi 的设备,用于测量用声卡记录的噪声(例如方差)中的一些东西,并尝试在 python 中执行此操作,所以我陷入了弄清楚如何获取音频样本的问题用于进一步计算的浮点数。

我做了什么:
拿了一个 Line-In-to-chinch-adapter 并触摸插头以生成某种测试信号。
录制到例如 Audacity 或 Matlab 会显示合理的结果,例如

在此处输入图像描述

我想得到什么:
理想情况下,我想从声卡中获取例如 5 帧 á 1024 个样本,并将它们转换为列表、元组或 numpy 数组作为浮点数以供进一步计算。

当尝试使用本文末尾的代码使用 python/pyaudio 实现这一点时,我得到了这样的结果:

在此处输入图像描述

由于我使用 python 获得的值似乎与 Matlab(和其他)中的值相差大约两倍,我认为我监督了某些事情或做错了什么。我想我在 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()
4

1 回答 1

13

尝试使用“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');

让我知道这是否适合你

于 2013-10-28T15:47:06.947 回答