python - 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 到几千,具体取决于文件,我不知道这些是什么单位。我猜它们可能是相对幅度,我想知道是否有办法将其转换为分贝,因为我需要特定的值。
谢谢
坦吉
解决方案
它们是相对于用于输入信号中的样本的量化单位的幅度。因此,如果没有根据已知的源输入电平校准输入信号(以获得每 1 位变化的电压等),实际单位是未知的。如果已校准,您可能仍需要将 FFT 输出的幅度除以 N(FFT 长度),具体取决于您的特定 FFT 实现。
要获得分贝,请通过获取 FFT 结果的 20*log10(abs(...)) 进行转换,并偏移 0 dB 校准水平。
推荐阅读
- optaplanner - OptaPlanner VRPTW - ArrivalTimeUpdatingVariableListener 的异常在 FULL_ASSERT 但不是在生产模式
- javascript - 如何使用 redux 制作切换器来翻译网站
- c - while 循环无法检测到简单的数学运算
- javascript - 我的页面在 ios 中加载一半但在 android 中加载
- python - 收到我的 dict 对象在 Django 应用程序中没有属性 META 的错误
- php - 模型 [App\UserModel] 0 [ Laravel ] 没有查询结果
- android - SQLite SUM 得到值 0
- java - 如何在 jooq 查询中获取 springboot 事务的数据
- swift - 如何在不中断主线程的情况下快速延迟 for 循环?
- haskell - Haskell:用 if-else 语句理解 do 表示法