【问题标题】:Amplitude units in FFTFFT 中的幅度单位
【发布时间】:2020-08-25 03:18:59
【问题描述】:

我对 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 到几千,具体取决于文件,我不知道这些是什么单位。我猜它们可能是相对幅度,我想知道是否有是一种将其转换为分贝的方法,因为我需要特定的值。

谢谢

唐吉

【问题讨论】:

  • 单位与输入信号的单位相同。但是,分贝是一个相对单位,我不确定您所说的“特定值”是什么意思。
  • 感谢您的评论。本质上,然后我需要在仅采用 db 幅度值的软件中重新使用从这些图表中获得的读数。所以我需要特定的分贝读数,最大声部分为 0db,然后相对于此。我不知道输入信号单元是什么
  • 你只需要用这样的东西进行标准化吗? FFT /= np.max(FFT)

标签: python python-3.x matplotlib scipy fft


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多