如何使用 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 这样的音频频谱?的主要内容,如果未能解决你的问题,请参考以下文章