首页 > 解决方案 > FFT 中的幅度单位

问题描述

我对 python、scipy、matplotlib 和一般编程完全陌生。我正在使用我在网上遇到的以下代码将 FFT 应用于 .wav 文件:

import scipy.io.wavfile as wavfile
import scipy
import scipy.fftpack as fftpk
import numpy as np
from matplotlib import pyplot as plt

s_rate, signal = wavfile.read("file.wav")

FFT = abs(scipy.fft.fft(signal))
freqs = fftpk.fftfreq(len(FFT), (1.0/s_rate))

plt.plot(freqs[range(len(FFT)//2)], FFT[range(len(FFT)//2)])
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.show()

结果图给出的幅度值范围从 0 到几千,具体取决于文件,我不知道这些是什么单位。我猜它们可能是相对幅度,我想知道是否有办法将其转换为分贝,因为我需要特定的值。

谢谢

坦吉

标签: pythonpython-3.xmatplotlibscipyfft

解决方案


它们是相对于用于输入信号中的样本的量化单位的幅度。因此,如果没有根据已知的源输入电平校准输入信号(以获得每 1 位变化的电压等),实际单位是未知的。如果已校准,您可能仍需要将 FFT 输出的幅度除以 N(FFT 长度),具体取决于您的特定 FFT 实现。

要获得分贝,请通过获取 FFT 结果的 20*log10(abs(...)) 进行转换,并偏移 0 dB 校准水平。


推荐阅读