gpt4 book ai didi

ios - 使用 Apple 的 Accelerate 框架、FFT、Hann 窗口和 Overlapping

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:31 25 4
gpt4 key购买 nike

我正在尝试为一个项目设置 FFT 并且真的没有清楚地了解事情......基本上,我使用 Audio Units 从设备的麦克风获取数据。然后我想对该数据执行 FFT。到目前为止,这是我的理解:我需要为我的数据设置一个循环缓冲区。在每个填充的缓冲区上,我应用一个 Hann 窗口,然后执行一个 FFT。但是,我仍然需要一些关于重叠的帮助。为了获得更精确的结果,我知道我需要特别使用它,因为我正在使用窗口。但是,我找不到任何东西...这是我目前所拥有的(用于音调检测):

// Setup -------------  
UInt32 log2N = 10; // 1024 samples
UInt32 N = (1 << log2N);
FFTSetup FFTSettings = vDSP_create_fftsetup(log2N, kFFTRadix2);
COMPLEX_SPLIT FFTData;
FFTData.realp = (float *) malloc(sizeof(float) * N/2);
FFTData.imagp = (float *) malloc(sizeof(float) * N/2);
float * hannWindow = (float *) malloc(sizeof(float) * N);

// create an array of floats to represent a hann window
vDSP_hann_window(hannWindow, N, 0);

// FFT Time ----------
// Moving data from A to B via hann window
vDSP_vmul(A, 1, hannWindow, 1, B, 1, N);

// Converting data in B into split complex form
vDSP_ctoz((COMPLEX *) B, 2, &FFTData, 1, N/2);

// Doing the FFT
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Forward);

// calculating square of magnitude for each value
vDSP_zvmags(&FFTData, 1, FFTData.realp, 1, N/2);

// Inverse FFT
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Inverse);

// Storing the autocorrelation results in B
vDSP_ztoc(&FFTData, 1, (COMPLEX *)B, 2, N/2);

vDSP_Length lastZeroCrosssing;
vDSP_Length zeroCrossingCount;
vDSP_nzcros(B, 1, N, &lastZeroCrossing, &zeroCrossingCount, N);

// Cleanup -----------
vDSP_destroy_fftsetup(FFTSettings);
free(FFTOutput.realp);
free(FFTOutput.imagp);
free(hannWindow);

那么在哪里以及如何包含重叠?此外,任何代码片段都会受到欢迎。谢谢

更新:

这个项目的最终目标是对音频进行指纹识别,尽可能接近实时,所以我需要尽可能准确的结果——因此重叠。为此,我认为我实际上可以将所有部分从逆到清理。

最佳答案

您实际上不需要重叠 - 通常重叠帧以在时间轴上提供更高分辨率,例如用于绘制频谱图或估计音符开始时间。您现在可以让您的代码在不重叠的情况下工作,因为它不那么复杂,然后再决定您是否需要在时间轴上使用更高分辨率。

如果您决定要添加重叠,那么您将需要保存前一个缓冲区的一大块(例如 50%),然后对于每个新缓冲区,您将按如下方式处理两个完整的缓冲区:

  • 处理旧缓冲区的最后 50% + 新缓冲区的前 50%
  • 处理 100% 的新缓冲区
  • 为下一次迭代保存最后 50% 的新缓冲区

对于不同的重叠百分比,类似的逻辑适用。

请注意,增加重叠超过某个点可能会适得其反,因为所需的处理带宽会大大增加,而分辨率却几乎没有提高。

关于ios - 使用 Apple 的 Accelerate 框架、FFT、Hann 窗口和 Overlapping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18931905/

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