gpt4 book ai didi

signal-processing - 我对 FFT 和音高检测的理解在这里正确吗?

转载 作者:行者123 更新时间:2023-12-04 11:06:29 27 4
gpt4 key购买 nike

关于 FFT 和基音检测,已经有无数关于 Stackoverflow 及其他方面的讨论。

人们普遍认为 FFT 虽然速度很快,但对于很多应用来说并不是很准确,但通常没有解释原因。

我想解释一下我对为什么会这样的理解,希望比我更聪明的人可以纠正我并填补我不能填补的空白。

FFT 将输入数据从时域转换为频域。

最初,我们从一系列数据开始,如果我们要绘制在图表上,Y 轴上的给定时间点的声音振幅和 X 轴上的时间。这是在时域中。

FFT 将这些时间点的幅度值转换为不同频率的幅度。

FFT 输出的数据数与输入的数据数 相同

如果我们输入 10 个时间点(10 个样本)的幅度,FFT 将输出这些样本中 10 个不同频率的幅度(在乘以虚数和实数的 sqrt 之后)。

哪些频率由以下因素决定:

我们将 FFT 的输出称为 bin,每个 bin 的宽度是通过将采样率除以 FFT 中的样本数来计算的:

bin width = Sample Rate(Hz)/FFT Length (n samples)

有了一些真正的值(value),那可能是:

bin_width = 44100/512 = 86.132

所以我们的 FFT 有 512 个 bin(请记住,输入和输出的数据数量相同),每个 bin 跨越 86.132 Hz。

所以对于给定的 bin,我们可以计算它代表的频率:
Bin Freq (Hz) = Bin number (n) * bin width (Hz)

使用上面的值,FFT 输出中的第三个 bin 将表示 258.398Hz 处的幅度:
Bin Freq (Hz) = 3 * 86.132 = 258.396Hz

这意味着在给定的采样率和缓冲区大小的情况下,FFT 输出的精度不能超过 ± 86.132Hz。

如果您需要更高的精度(比如 1Hz),您必须降低采样率,或增加缓冲区大小(或两者兼而有之)。
desired bin width: 1Hz = 44100 / 44100  # A buffer size of 44100 would work in this instance 

随着缓冲区大小越来越接近采样率,延迟问题变得更加严重。
FFT Results per second = Sample Rate / Buffer Size = 44100/44100 = 1 FFT per second

(每秒 44100 个样本,填充 44100 个样本缓冲区 = 每秒 1 个完整缓冲区)。

我意识到 FFT 不仅仅是计算基频(幅度最高的 bin),但到目前为止我对基音检测中 FFT 的理解是否正确?

是否有任何方法可以在不牺牲延迟的情况下提高 FFT 的准确性?

最佳答案

关于您的第一个问题 (“到目前为止,我对基音检测中 FFT 的理解是否正确?”)我会说是的,但我想指出一个陷阱:

Using the values from above, the 3rd bin in the FFT output would represent the amplitude at 258.398Hz:

Bin Freq (Hz) = 3 * 86.132 = 258.396Hz


请注意,第 0 个 bin 代表 0 Hz。这意味着表示 3 * 86.132 = 258.396Hz 的 bin 位于结果数组的第 4 个位置。
为了完成这个索引陷阱,如果你有 512 点的 FFT (=fftsize),索引值 256 代表奈奎斯特频率 (= 采样频率/2)。这意味着 你总是得到 fftsize/2+1 bins 代表真实的频谱,即在您的情况下为 257 个 bin。
关于 您的第二个问题 ,有两种广泛而简单的方法可以提高频率检测精度:
  • 零填充 (参见例如 some answers why zero-padding is used )
  • 抛物线插值 (参见例如 the 1st answer )

  • 最后,一个 不问答:绝对推荐申请 窗函数 ,不仅因为它是抛物线插值的前提,还因为它降低了显着的人工旁瓣的幅度。

    关于signal-processing - 我对 FFT 和音高检测的理解在这里正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23812541/

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