Matlab:以非常小的帧大小处理音频信号会使音频完全消失

Matlab: processing audio signal in very small frame sizes makes the audio disappear completely

我正在用 matlab 编写一个音调自适应函数。它需要一个音频信号和一个 pitchCoefficient 向量,其中每个元素决定其各自帧的音调偏移量。

音频信号根据有多少个音高系数被均匀分割。如果只有 2 个音调系数,音频将被分成两半,前半部分将按第一个系数进行音调偏移,后半部分将按第二个系数进行音调偏移。因此,如果我的系数为 [1,2],则音频信号的前半部分听起来与原始音频信号相同,而音频信号的后半部分音调高两倍。

这是我的函数的代码:

function [audioModified] = modifyPitch(audio, pitchCoefficients)

nwindows = length(pitchCoefficients);
windowSize = floor(length(audio)/nwindows);
audioModified = [];
for i=1:nwindows
    start = (i-1)*windowSize + 1;
    finish = i*windowSize;
    originalWindow = audio(start:finish, 1);
    pitchCoeff = 1/pitchCoefficients(i);
    timeScaledWindow = pvoc(originalWindow, pitchCoeff);
    [P,Q] = rat(pitchCoeff);
    pitchModifiedWindow = resample(timeScaledWindow, P, Q);
    audioModified = [audioModified; pitchModifiedWindow];
end

end

但是,最终音频(所有帧的串联)具有这些伪像,其中每个帧都以 'tic' 声音开头。我假设发生这种情况是因为我连接帧的方式。如果帧太小,这种效果会变得非常明显,以至于听不到音频。

我应该如何缓解或消除这个问题?有没有一种方法可以像模糊图像以消除噪音一样平滑音频?

附加信息:我使用 this phase vocoder (pvoc) 进行时间缩放。

在音频处理中,振幅的任何突然跳跃(即比当前采样率允许的更陡峭)听起来像咔哒声,并被视为错误。因此,如果您的算法只是突然改变 window 中的样本,那么如果您查看结果波形(比如在 Audacity 或类似的东西中),您很可能会看到电平急剧上升,这实际上是在产生分量超过奈奎斯特的频率(采样率的一半),这意味着系统无法准确地表示它们并且它们会导致听得见的伪影。对此没有简单的解决方案,不幸的是,您不能只对数字音频做一些事情并希望它会起作用,需要大量 DSP 来确保您的过程在当前采样率下是可表示的。

尝试重叠和交叉淡入淡出较长的帧,而不是使用太小的帧。淡入淡出将有助于减少相邻(重新)合成帧之间的不连续性。

实际上,我认为对于您的问题,以某种方式动态调整 window 可能就足够了,每个 window 在信号过零的点开始和结束。为了正确完成这项工作,您可能需要在 matlab 原始数据中使用更高的分辨率。