立体声加宽

信息处理 声音的 DSP核心
2022-01-25 13:18:17

我最近发现了这个由 Michael Gruhn 扩展立体声信号的实现。

http://www.musicdsp.org/showArchiveComment.php?ArchiveID=256

我自己实现了如下:

void Voice::WidenTheStereoImage( double *a_dInputBufferLeft, double *a_dInputBufferRight, double *a_dOutputBufferLeft, double *a_dOutputBufferRight size_t a_zBufferSize, double a_dWidth){
double dTemp = 1/(1.0 + a_dWidth);
double dCoefficientM = 1.0 * dTemp;
double dCoefficientS = a_dWidth * 0.5;
double dValueM = 0.0;
double dValueS = 0.0;

for(size_t i = 0; i < a_zBufferSize; i++)
{
    dValueM = (a_dInputBufferLeft[i] + a_dInputBufferRight[i]) * dCoefficientM;
    dValueS = (a_dInputBufferRight[i] - a_dInputBufferLeft[i]) * dCoefficientS;

    a_dOutputBufferLeft[i] = dValueM - dValueS;
    a_dOutputBufferRight[i] = dValueM + dValueS;
}

}

当我将此功能应用于任何信号时,我没有得到类似于输入的加宽立体声版本。我尝试将 1 到 4 的值用作 Width,但它听起来有点失真。

我想知道这个代码示例是否只是实现的一部分。我看不出信号的一侧是如何在上面延迟的,这似乎(对我来说)是立体声加宽的关键因素?

另外我认为这个信号的输出需要与原始输入混合?这些是正确的假设吗?

有人可以解释这段代码在做什么以及我必须做什么才能从中获得立体声加宽效果吗?

1个回答

此代码将具有左右分量的立体声信号拆分为具有中间分量侧面分量立体声信号,缩放中间分量侧面分量并转换回左右分量。

要将左 (L) 和右 (R) 立体声转换为中(M 和侧 (S)):

M=L+R2
S=LR2

然后回来:

L=M+S
R=MS

代码在转换回 L 和 R 之前缩放 M 和 S。这是一种相当常见的立体声加宽方法。要扩大,您可以减少 M(L 和 R 共有的信号位)和/或增加 S(L 和 R 之间的差异的信号位)。首先,L 和R 之间的差异越小,这种技术的效果就越差,即如果L 和R 相同(即单声道发送到两个通道),它将无法工作。在 L 和 R 相同时加宽通常从将一个通道延迟少量开始(但有点心理声学黑客)。

至于为什么你的声音失真是另一回事。您很可能正在缩放以使 L 和 R 超出可以通过扬声器播放的值范围。通常数字音频样本在 -1 到 1 的范围内,因此如果您将样本缩放到超出此范围,您将获得削波/饱和度。

您无需将其与原始信号混合。干/湿的概念毫无意义,因为立体声宽度完全控制了应用于原始音频的效果量。