音频均衡分辨率
Audio equalization resolution
简而言之
我正在尝试用 C++ 制作均衡器。我必须以(通常)256 个样本为单位处理音频。我使用 FFT 来获取样本块的频谱。我处理频率,然后使用 IFFT 在时域中获得处理后的音频块。我正在使用相关问题中提供的代码:FFT in a single C-file.
对于低通滤波器,将较低的系数设置为零应该会去除低频。然而,在处理后的音频中,我得到的是变化的频谱,而不是低通滤波器(音频包含嗡嗡声)。
我已阅读以下相关文章:
- What Are High-Pass and Low-Pass Filters?
- Primary FFT Coefficients vs Low-Pass Filter
- How to implement an Equalizer
我做错了什么吗?块大小是否太小而无法获得合理的频率分辨率?
我熟悉傅里叶变换的数学原理。但是,我不知道 FFT 和 IFFT 变换的细节。提供的代码可能未正确实现。然而,当 FFT 完成然后对 FFT 结果进行 IFFT 时,原始音频块被正确重建。
详情
我正在编写 VST 并在 processReplacing()
方法中进行所有处理。这就是我受块大小限制的原因。
我的想法是将最后n个块保留在内存中,然后对最后n个块进行FFT计算以获得更高的频率分辨率,然后对这些频率进行处理,IFFT后,只替换最后一个块。
关于这是否是实现均衡器的正确方法,有什么建议吗?
让我猜猜(因为你遗漏了相关信息):你的采样率相当高,比如 44000 samples/second。这意味着你的块只有 6 毫秒,或者换句话说你的块频率是 171 赫兹。完全听得见。
所以,问题不在于您的频率分辨率太低,而是您每秒处理的块太多。
更深层次的问题是为什么这些区块会引起轰动。对此也有一个简单的答案:您正在对时间限制的信号进行 FFT。数学中的傅立叶变换适用于无限信号,在实际 FFT 中,无限信号近似于 256 样本块的无限重复。但是块的最后一个样本与第一个样本不一致;会有一个跳跃。因此,该跳跃每秒发生 171 个计时器,这是一个嗡嗡声。
至少3个问题:
首先,滤除频率的方法不是将 FFT bin 归零。有关详细信息,请参阅此答案:https://dsp.stackexchange.com/questions/6220/why-is-it-a-bad-idea-to-filter-by-zeroing-out-fft-bins/6224#6224
其次,在计算出所需滤波器响应的脉冲响应长度后,您必须至少将 FFT 零填充该额外长度,然后使用重叠相加或重叠保存(快速卷积算法)来组合您的 IFFT 结果,而不是仅仅将它们串联起来。
第三,44.1 kHz 采样率下的 256 个样本甚至不足以容纳低于 170 Hz 的任何音高的 1 个完整周期。所以,是的,低频分辨率将受到您选择的块大小的限制。这是否合理取决于您对频率响应的要求。
FFT/IFFT 如果您的均衡曲线具有较长的脉冲响应、足够的计算 resource/power/cycles,并且不介意一些与块大小相关的延迟,那么快速卷积是一种常见的 DSP 均衡方法。
简而言之
我正在尝试用 C++ 制作均衡器。我必须以(通常)256 个样本为单位处理音频。我使用 FFT 来获取样本块的频谱。我处理频率,然后使用 IFFT 在时域中获得处理后的音频块。我正在使用相关问题中提供的代码:FFT in a single C-file.
对于低通滤波器,将较低的系数设置为零应该会去除低频。然而,在处理后的音频中,我得到的是变化的频谱,而不是低通滤波器(音频包含嗡嗡声)。
我已阅读以下相关文章:
- What Are High-Pass and Low-Pass Filters?
- Primary FFT Coefficients vs Low-Pass Filter
- How to implement an Equalizer
我做错了什么吗?块大小是否太小而无法获得合理的频率分辨率?
我熟悉傅里叶变换的数学原理。但是,我不知道 FFT 和 IFFT 变换的细节。提供的代码可能未正确实现。然而,当 FFT 完成然后对 FFT 结果进行 IFFT 时,原始音频块被正确重建。
详情
我正在编写 VST 并在 processReplacing()
方法中进行所有处理。这就是我受块大小限制的原因。
我的想法是将最后n个块保留在内存中,然后对最后n个块进行FFT计算以获得更高的频率分辨率,然后对这些频率进行处理,IFFT后,只替换最后一个块。
关于这是否是实现均衡器的正确方法,有什么建议吗?
让我猜猜(因为你遗漏了相关信息):你的采样率相当高,比如 44000 samples/second。这意味着你的块只有 6 毫秒,或者换句话说你的块频率是 171 赫兹。完全听得见。
所以,问题不在于您的频率分辨率太低,而是您每秒处理的块太多。
更深层次的问题是为什么这些区块会引起轰动。对此也有一个简单的答案:您正在对时间限制的信号进行 FFT。数学中的傅立叶变换适用于无限信号,在实际 FFT 中,无限信号近似于 256 样本块的无限重复。但是块的最后一个样本与第一个样本不一致;会有一个跳跃。因此,该跳跃每秒发生 171 个计时器,这是一个嗡嗡声。
至少3个问题:
首先,滤除频率的方法不是将 FFT bin 归零。有关详细信息,请参阅此答案:https://dsp.stackexchange.com/questions/6220/why-is-it-a-bad-idea-to-filter-by-zeroing-out-fft-bins/6224#6224
其次,在计算出所需滤波器响应的脉冲响应长度后,您必须至少将 FFT 零填充该额外长度,然后使用重叠相加或重叠保存(快速卷积算法)来组合您的 IFFT 结果,而不是仅仅将它们串联起来。
第三,44.1 kHz 采样率下的 256 个样本甚至不足以容纳低于 170 Hz 的任何音高的 1 个完整周期。所以,是的,低频分辨率将受到您选择的块大小的限制。这是否合理取决于您对频率响应的要求。
FFT/IFFT 如果您的均衡曲线具有较长的脉冲响应、足够的计算 resource/power/cycles,并且不介意一些与块大小相关的延迟,那么快速卷积是一种常见的 DSP 均衡方法。