【问题标题】:Matlab: processing audio signal in very small frame sizes makes the audio disappear completelyMatlab:以非常小的帧大小处理音频信号使音频完全消失
【发布时间】:2016-02-24 23:58:18
【问题描述】:

我正在 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”声音开头。我假设发生这种情况是因为我连接帧的方式。如果帧太小,这种效果会变得非常明显,以至于无法再听到音频。

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

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

【问题讨论】:

    标签: matlab audio signal-processing noise pitch-shifting


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2012-11-05
          • 2012-11-01
          • 1970-01-01
          • 2013-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-14
          • 1970-01-01
          相关资源
          最近更新 更多