为什么放慢音频会引入混叠?

信息处理 声音的
2022-02-01 06:18:16

我有一个 8khz 的单声道样本缓冲区,我试图通过修改其中的样本数量来控制它的播放速度。当减速时(例如 speedScale 值为 0.5),这些值会重复 - 样本缓冲区:[0.1, 0.2, 0.3..] 变为 [0.1, 0.1, 0.2, 0.2, 0.3, 0.3 ..]。当我这样做时,虽然速度已经正确减慢,但我注意到发生了混叠。我的印象是重复这样的样本不需要低通滤波来避免混叠。难道我做错了什么?

这是减速/加速的代码:

function process(buffer, speedScale) {
    size = ceil(buffer.size / speedScale);

    counter = 0.0;
    ratio = 1 * speedScale;
    processed = [];

    for (i = 0; i < size; i++) {
        index = floor(counter);
        processed[i] = buffer.samples[index];
        counter += ratio;
    }
    return processed;
}
2个回答

那是因为您正在对信号进行插值。看看这张图:

在此处输入图像描述

这是零插值,即在样本之间插入零,但也适用于您的情况。2*pi 处的复制品会扭曲您的信号。您可以在第三张图中看到它们,即 -2pi/L、+2pi/L。因此,在扩展器之后,您需要一个截止频率为 pi/L 的低通滤波器。

在您的情况下,假设输入信号的 dtft X(w),扩展器的输出 dtft 将为 X(w*2) + exp(-jw)*X(w*2)。因此,您的外推器输出看起来会有些不同,但想法是一样的。

方波、三角波和锯齿波有混叠,因为它们有尖角。那些尖角将频率超越奈奎斯特,使其完美尖锐。当您重复采样以减慢速度时,您将引入尖角,从而引入锯齿。希望这是一个体面的直观解释。肯定还有更正式的数学解释(: