0

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

根据有多少音高系数,音频信号被均匀分割。如果只有 2 个音高系数,则音频将被分成 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”声音开始。我假设发生这种情况是因为我连接帧的方式。如果帧太小,这种效果会变得如此明显,以至于音频不再可听。

我应该如何减轻或消除这个问题?有没有办法像模糊图像以消除噪音一样平滑音频?

附加信息:我使用此相位声码器(pvoc) 进行时间缩放。

4

3 回答 3

1

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

于 2015-11-23T18:16:08.320 回答
1

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

于 2015-11-24T18:11:02.810 回答
1

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

于 2015-11-24T18:47:38.247 回答