微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scipy.rfft 产生减半的频率

如何解决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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。