scipy.rfft 产生减半的频率

问题描述

我正在尝试检测计算机音频输出中的某些频率。出于某种原因,我发现的频率大约是预期值的一半。整个程序有点长,所以我只贴出相关部分。

我使用 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 音调产生以下结果:

Spectrum after analysing a 10 kHz tone

出于某种原因,主峰位于预期频率的一半。此外,在~12 kHz 附近似乎有一个峰值镜像。这是 20 kHz 的第二个例子

Spectrum after analysing a 20 kHz tone

我的采样率为 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)