如何将声音的音量从听不到 (0db) 增加到响亮 (60db)



我尝试通过这样做来增加噪音:

public void maakgeluid() {
    WaveOut waveOut = new WaveOut();
    SineWaveOscillator osc = new SineWaveOscillator(44100);
    for (short amplitude = 1; amplitude <500; amplitude+=1) {
        Console.WriteLine("amplitude:" + amplitude);
        for (int i = 1; i < 10; i++) {
            Console.WriteLine(i);
            osc.Frequency = 500;
            osc.Amplitude = amplitude;
            try {
                waveOut.Init(osc);
            } catch (Exception ) { Console.WriteLine("error"); }
            waveOut.Play();
        }
    }
}

目的是产生声音,就像您去看耳朵专家并进行听力测试一样。 所以它应该非常安静地开始,然后慢慢加载。

但我有不同的问题:

  • 我立即听到声音
  • 声音增加到快速
  • 我将循环与 I 计数器一起使用,以延长声音的持续时间,但我认为这不是正确的方法。
  • 增加声级的循环停止很快,但我不明白为什么?

感谢

基于以下代码msdn.microsoft.com/en-us/magazine/ee309883.asp

贝尔刻度是对数的,因此您需要进行数学运算才能在分贝和示例比例因子之间进行转换。

在数字(浮点)音频中,完整信号(即从+1到-1,从峰值到波谷的波形)被认为是0dB。

因此,您可能希望从-60dB到0dB。

转换如下(假设有符号的音频而不是无符号的音频,就像 8 位音频一样)

double sampleValue = 1.0d;
//every -3db represents an approximate halving of linear signal level
double decibelValue = -3.0d; 
double linearScalingRatio = Math.Pow(10d, decibelValue/10d);
var newSampleValue = sampleValue * linearScalingRatio;

所以现在,newSampleValue是 0.501187233627272

您当前的代码不断重新创建 WaveOut 设备,这不是一个好主意。打开声卡一次,然后向其馈送单个信号,该信号的音量会随着时间的推移逐渐增加。你可以做到这一点的一种方法是使用 SignalGenerator 类来制造罪恶波,然后将其传递到FadeInSampleProvider以逐渐淡入:

 var sg = new SignalGenerator(44100,1);
 sg.Frequency = 500;
 sg.Type = SignalGeneratorType.Sin;
 var fadeIn = new FadeInOutSampleProvider(sg, true);
 fadeIn.BeginFadeIn(20000); // fade in over 20 seconds
 waveOut.Init(fadein);
 waveOut.Play();

正如 spender 正确指出的那样,0dB 是最大值,因此在淡入时间内,从负无穷大分贝上升到 0dB。如果你想让它从-60dB开始,或者乘法器的斜坡不是线性的,那么你需要制作自己的自定义ISampleProvider,类似于FadeInOutSampleProvider并使用它。

最新更新