扩展器简介与实现

一、简介:
扩展器(Expander)是一种动态范围控制技术,与压缩器相反,它通过降低动态范围来增加信号的可听性。扩展器通常用于减少噪声、增加信号的清晰度和可听性,以及增加信号的感知音量。

二、原理:
扩展器的工作原理与压缩器相反。当信号的幅度低于阈值时,扩展器降低信号的幅度,从而扩大信号的动态范围。当信号的幅度高于阈值时,扩展器不执行任何处理,从而保持信号的原始幅度。
扩展器通常与压缩器一起使用,以实现更广泛的动态范围控制。例如,在音乐录制和混音中,压缩器可以用于压缩高音和低音的动态范围,扩展器可以用于在保持中音动态范围不变的情况下增加其可听性。在语音处理中,扩展器可以用于减少背景噪声,以提高语音的清晰度和可听性。
扩展器在音频处理中非常有用,可以提高信号的可听性和清晰度,减少噪声,并增加音频信号的感知音量

三、示例:以下代码实现了一个基于包络跟踪的扩展器,其工作原理是在信号低于阈值时降低信号的幅度,以扩大信号的动态范围。在该代码中,我们使用阈值、压缩比率和软折线宽度等参数来控制扩展器的工作方式。我们使用攻击时间和释放时间来计算包络,并使用包络来计算适当的增益。最后,我们将输出信号打印到控制台上。
需要注意的是,该示例代码中的扩展器实现仅适用于单声道信号。对于立体声信号,需要对左右声道分别进行处理,并使用相应的包络跟踪、增益计算公式。

#include
#include
#include

#define THRESHOLD -30.0 // 阈值
#define RATIO 2.0 // 压缩比率
#define KNEE_WIDTH 5.0 // 软折线宽度
#define SAMPLE_RATE 44100.0
#define PI 3.1415926535

int main() {
float input = 0.0; // 输入信号
float output = 0.0; // 输出信号
float gain = 0.0; // 增益
float attack_time = 0.002; // 攻击时间
float release_time = 0.1; // 释放时间
float samples = SAMPLE_RATE * 2.0; // 2秒钟的采样数
float dt = 1.0 / SAMPLE_RATE;
float envelope = 0.0; // 包络
float alpha_attack = exp(-1.0 / (attack_time * SAMPLE_RATE)); // 攻击系数
float alpha_release = exp(-1.0 / (release_time * SAMPLE_RATE)); // 释放系数
float threshold = pow(10.0, THRESHOLD / 20.0); // 将阈值转换为幅度值
float knee_threshold = threshold - KNEE_WIDTH / 2.0; // 软折线开始的阈值
float knee_slope = RATIO - 1.0; // 软折线斜率
float knee_gain = 1.0 / RATIO; // 软折线增益
for (int i = 0; i < samples; i++) {
// 计算包络
float amplitude = fabs(input);
if (amplitude > envelope) {
envelope = alpha_attack * envelope + (1.0 - alpha_attack) * amplitude;
} else {
envelope = alpha_release * envelope + (1.0 - alpha_release) * amplitude;
}
// 计算增益
if (envelope < knee_threshold) {
gain = 1.0;
} else if (envelope < threshold) {
gain = (knee_slope * (envelope - knee_threshold) / KNEE_WIDTH + 1.0) * knee_gain;
} else {
gain = 1.0 / RATIO;
}
// 应用扩展器
output = input * gain;
// 更新输入信号
input += sin(2.0 * PI * 1000.0 * i / SAMPLE_RATE);
// 打印输出信号
printf(“%!f(MISSING)\n”, output);
}
return 0;
}

你可能感兴趣的:(C语言,算法)