使用 FFT 的通道声码器 - 如何处理直流分量和奈奎斯特频率?

Posted

技术标签:

【中文标题】使用 FFT 的通道声码器 - 如何处理直流分量和奈奎斯特频率?【英文标题】:Channel vocoder using FFT - what to do about DC Component and Nyquist frequency? 【发布时间】:2011-07-26 04:01:55 【问题描述】:

我正在尝试使用 ios Accelerate vDSP FFT 算法实现通道声码器。我无法弄清楚如何处理直流分量和奈奎斯特频率。

调制器和载波信号都是长度为 n 的浮点数组。在每一个上,我执行一个前向 FFT 并返回一个长度为 n/2 的频率图(称为 bin[])。

根据 vDSP 规范,bin[1] 包含高于 0Hz 的第一个频率,bin[2] 包含第二个等... bin[0] 包含实部中的直流分量和奈奎斯特频率(这将通常在虚部的 bin[n/2]) 中。 vDSP 本质上是将频率图压缩到尽可能小的空间中(bin[0] 和 bin[n/2] 的虚部在压缩之前应始终为零)。

我将载波和调制器的频率图分成 k 个波段。我的目标是将carrier.band[x]中的每个频率乘以modulator.band[x]中频率的总幅度。从本质上讲,增加了载波中也存在于调制器中的那些频率的强度。

因此,如果 n=8 和 k=2,调制器的第二个波段将包含 bin[2] 和 bin[3]。很容易找到总幅度,只需将每个 bin 的幅度相加(例如 mag[2] = sqrt( bin[2].real*bin[2]*real + bin[2].imag*bin[2] *imag ))。

这对除第一个以外的所有频段都有效,因为第一个频段包含带有直流分量和奈奎斯特频率的奇怪 bin[0]。

在计算波段的总幅度时,如何处理第一个 bin?我是否只是假设第一个 bin 的幅度只是 DC 分量本身?我要放弃奈奎斯特频率吗?

感谢任何可以提供一些指导的人!我很感激。

【问题讨论】:

您是否应该添加 FFT 而不是将它们相乘? 【参考方案1】:

我建议您忽略 0 Hz 和 Nyquist,因为它们在音频信号的情况下不包含有用的信息。

【讨论】:

谢谢保罗。假设我将除 bin[0] 之外的所有 bin 除以 2 结束,因此除了 bin[0] 之外的所有 bin 的频率幅度减半。当我进行逆 FFT 将其转换回时域信号时,我会注意到不更改 bin[0] 的任何影响吗?或者,如果我对其他 bin 不做任何更改,时域信号是否会完全一样? @Albeit:您可以将 0 Hz 分量归零。对于音频信号,无论如何它都应该接近于零 - 直流偏移在音频中既无用也不可取。

以上是关于使用 FFT 的通道声码器 - 如何处理直流分量和奈奎斯特频率?的主要内容,如果未能解决你的问题,请参考以下文章

去除信号中的直流分量

去除信号中的直流分量

使用旋转编码器控制直流减速电机

如何处理共享同一通道的多个 goroutine

STM32单片机接直流减速电机编码器注意点

Go中的make函数如何处理可选参数? [复制]