gpt4 book ai didi

python - 计算FFT频率分量的功率

转载 作者:行者123 更新时间:2023-12-02 22:56:41 25 4
gpt4 key购买 nike

我正在尝试使用numpy计算48000 Hz采样率的48000个音频数据的FFT频率分量的dB功率。我正在测试的文件具有1000 Hz的全功率(0 dB)正弦波。当我计算具有最大能量的能带的均方根值时,我期望结果为0 dB,但是,我得到以下信息:

1000.0Hz 41.8387130383 dB

有人会解释为什么我得到不同的结果吗?我的代码如下。

“数据”是48000个样本的numpy数组,具有32位精度。据我了解,我需要根据数据样本的长度对fft结果进行归一化。
p = np.fft.fft(data)
uniquePts = math.ceil(len(data)+1/2.0)
p = p[0:uniquePts]
freqs = np.fft.fftfreq(len(p))

通过数据样本的长度对fft结果进行归一化
p = np.divide(p,float(len(data)))
p = np.abs(p)
p = np.power(p,2)

将FFT结果乘以2以说明我们将返回FFT数组中的元素总数减半的事实
if len(data) % 2 > 0:
p[1:len(p)] = np.multiply(p[1:len(p)], 2)
else:
p[1:len(p) - 1] = np.multiply(p[1:len(p) -1], 2)

此时,我发现 idx代表的能量最多的FFT分量:
data_size=48000 #1 second of audio
idx=np.argmax(np.abs(p)**2)
rms = math.sqrt(p[idx])
dbRep = 20 * math.log10((1.0 * rms)/data_size)
print abs(freqs[i] * frate), dbRep

最佳答案

看来您有两个错误:

  • 您正在将FFT长度标准化两次
  • 您没有考虑到数据是24位整数这一事实,因此隐式缩放因子为2 ^ 23

  • 我们可以插入数字以查看此假设是否与您所看到的相符-错误应该是:
    20 * log10(2^23 / 48000) = 44.8 dB

    这可能已经足够接近了。

    因此,您需要将输入样本除以2 ^ 23,以使它们在-1.0到+1.0范围内,并且还删除第二个归一化(用 data_size除)。

    关于python - 计算FFT频率分量的功率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26515202/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com