问题描述
我正在尝试检测计算机音频输出中的某些频率。出于某种原因,我发现的频率大约是预期值的一半。整个程序有点长,所以我只贴出相关部分。
我使用 pyaudio 的一个分支来传输输出声音 (https://github.com/intxcc/pyaudio_portaudio)。由此,我读入了一些音频数据,应用 scipy.rfft 并绘制了频谱图。
frames = np.frombuffer(
self.stream.read(int(self.sampleRate/10)),np.int16)
xf,yf = audioUtils.getSpectrum(frames,self.sampleRate)
self.plotWidget.plot(xf,yf)
请求:
def getSpectrum(frames,sampleRate):
n = len(frames)
yf = rfft(frames)
yf = np.abs(yf)
xf = rfftfreq(n,1 / sampleRate)
我一直在使用在线音调发生器 (https://www.szynalski.com/tone-generator/) 测试代码,它针对 10 kHz 音调产生以下结果:
出于某种原因,主峰位于预期频率的一半。此外,在~12 kHz 附近似乎有一个峰值镜像。这是 20 kHz 的第二个例子
我的采样率为 44100 Hz。 我的 rfft 做的不对吗?
解决方法
问题是流正在从 2 通道源读取音频。一个简单的拼接固定它。
工作代码:
frames = np.frombuffer(
self.stream.read(int(self.sampleRate)),np.int16)
frames = frames[::2]
xf,yf = audioUtils.getSpectrum(frames,self.sampleRate)
self.plotWidget.plot(xf,yf)