如何使用 python 获得像 audacity 这样的音频频谱?

Posted

技术标签:

【中文标题】如何使用 python 获得像 audacity 这样的音频频谱?【英文标题】:How to get an audio frequency spectrum like audacity with python? 【发布时间】:2019-06-18 16:36:02 【问题描述】:

当我对 numpy 和 scipy 使用 fft 来生成音频频谱时,我得到的结果与 audacity 不同。 我得到正的 dBm,我必须得到负的。

这是我的代码

import numpy as np
from numpy import fft
from scipy.io import wavfile
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

rate,audData = wavfile.read("test.wav")
n = len(audData)
fourier=fft.fft(audData)
fourier = fourier / float(n)
freqArray = np.arange(0, (n/2), 1.0) * (rate*1.0/n);
freq = freqArray/1000
power = 10*np.log10(fo
power = np.abs(power)
plt.plot(freq, power, color='#ff7f00', linewidth=0.02)
plt.xlabel('Frequency (kHz)')
plt.ylabel('(dBm)')
plt.show()

我尝试以另一种方式使用来自 scipy.signal 的周期图

from scipy import signal
freqs, Pxx = signal.periodogram(audio, fs=rate, window='hanning',
                                      detrend=False, scaling='density')

freqs=freqs / 1000
Pxx = 10 * np.log10(Pxx)

plt.plot(freqs, Pxx, color='#ff7f00', linewidth=0.02)
plt.xlabel('Frequency (kHz)')
plt.ylabel('Power (dB)')

plt.show()

我希望有一个这样的情节,以显示负 dBm 的大胆

但我得到的是从负到正的 dBm 范围:

通过发送值并从 javascript 中绘制它们:

【问题讨论】:

【参考方案1】:

不同的 FFT 实现使用不同的比例因子。如果您需要与默认提供的比例因子不同的比例因子,请根据需要重新调整输入。

见:https://electronics.stackexchange.com/questions/25900/scaling-fft-output-by-number-of-points-in-fft/25941#25941

【讨论】:

以上是关于如何使用 python 获得像 audacity 这样的音频频谱?的主要内容,如果未能解决你的问题,请参考以下文章

在 Audacity 中绘制波谱

如何录制电脑系统声音(Audacity)

ubuntu怎么用audacity

使用 Audacity 录制声卡声音

audacity怎么用 audacity教程

audacity怎么用