gpt4 book ai didi

c# - 帮助动态范围压缩功能(音频)

转载 作者:太空狗 更新时间:2023-10-29 21:52:15 26 4
gpt4 key购买 nike

我正在编写一个 C# 函数来进行动态范围压缩(一种音频效果,基本上可以压缩 transient 峰值并放大其他所有内容以产生整体更响亮的声音)。我已经编写了一个函数来执行此操作(我认为):

alt text http://www.freeimagehosting.net/uploads/feea390f84.jpg

public static void Compress(ref short[] input, double thresholdDb, double ratio)
{
double maxDb = thresholdDb - (thresholdDb / ratio);
double maxGain = Math.Pow(10, -maxDb / 20.0);

for (int i = 0; i < input.Length; i += 2)
{
// convert sample values to ABS gain and store original signs
int signL = input[i] < 0 ? -1 : 1;
double valL = (double)input[i] / 32768.0;
if (valL < 0.0)
{
valL = -valL;
}
int signR = input[i + 1] < 0 ? -1 : 1;
double valR = (double)input[i + 1] / 32768.0;
if (valR < 0.0)
{
valR = -valR;
}

// calculate mono value and compress
double val = (valL + valR) * 0.5;
double posDb = -Math.Log10(val) * 20.0;
if (posDb < thresholdDb)
{
posDb = thresholdDb - ((thresholdDb - posDb) / ratio);
}

// measure L and R sample values relative to mono value
double multL = valL / val;
double multR = valR / val;

// convert compressed db value to gain and amplify
val = Math.Pow(10, -posDb / 20.0);
val = val / maxGain;

// re-calculate L and R gain values relative to compressed/amplified
// mono value
valL = val * multL;
valR = val * multR;

double lim = 1.5; // determined by experimentation, with the goal
// being that the lines below should never (or rarely) be hit
if (valL > lim)
{
valL = lim;
}
if (valR > lim)
{
valR = lim;
}

double maxval = 32000.0 / lim;

// convert gain values back to sample values
input[i] = (short)(valL * maxval);
input[i] *= (short)signL;
input[i + 1] = (short)(valR * maxval);
input[i + 1] *= (short)signR;
}
}

我用 10.0 db 到 30.0 db 之间的 threshold 值和 1.5 到 4.0 之间的比率来调用它。此功能肯定会产生更响亮的整体声音,但即使在低阈值和低比率下,也会产生 Not Acceptable 失真程度。

有人能看出这个函数有什么问题吗?我是否正确处理立体声方面(该功能假定立体声输入)?正如我(模糊地)理解的那样,我不想分别压缩两个 channel ,所以我的代码试图压缩一个“虚拟”单声道样本值,然后分别对 L 和 R 样本值应用相同程度的压缩.但是,我不确定我做得对不对。

我认为部分问题可能是我函数的“硬膝”,当超过阈值时它会突然启动压缩。我想我可能需要像这样使用“软膝盖”:

alt text http://www.freeimagehosting.net/uploads/4c1040fda8.jpg

任何人都可以建议修改我的函数以产生柔软的膝盖曲线吗?

最佳答案

开源Skype Voice Changer项目包括一个到 C# 的端口,由 Scott Stillwell 编写的许多不错的压缩器, 都带有可配置的参数:

第一个看起来有做软拐点的能力,虽然没有公开这样做的参数。

关于c# - 帮助动态范围压缩功能(音频),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com