2

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

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

4

2 回答 2

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

于 2013-11-01T14:21:43.707 回答
1

您当前的代码不断重新创建 WaveOut 设备,这不是一个好主意。打开声卡一次,然后向它提供一个信号,随着时间的推移音量逐渐增加。您可以这样做的一种方法是使用SignalGenerator该类来制作 sin 波,然后将其传递给 aFadeInSampleProvider以逐渐淡入:

 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 并改用它。

于 2013-11-01T16:23:57.557 回答