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

时间:2013-11-01 13:59:13

标签: c# naudio

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

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计数器的循环,以延长声音的持续时间,但我不认为这是正确的方法。
  • 循环增加声级会快速停止,但我不明白为什么?

THx的

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

2 个答案:

答案 0 :(得分:2)

贝尔刻度是对数的,所以你需要做数学来转换分贝和样本比例因子。

在数字(浮点)音频中,一个完整的信号(即从+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

答案 1 :(得分:1)

您当前的代码不断重新创建WaveOut设备,这不是一个好主意。打开声卡一次,然后向其发送一个信号,随着时间的推移逐渐增加音量。你可以做到这一点的一种方法是使用SignalGenerator类来制作sin波,然后通过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();

正如消费者正确指出的那样,0dB是最大的,所以这在淡入时间的持续时间内从负无穷大分贝变为0dB。如果你想让它从-60dB开始,或者为了使乘数的上升不是线性的,那么你需要制作你自己的自定义ISampleProvider,类似于FadeInOutSampleProvider并使用它。