我试着通过这样做来增加噪音:
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();
}
}
}
目的是产生一种声音,就像你去听耳科医生并进行听力测试一样。所以它应该非常默默地开始,然后慢慢地加载。
但我有不同的问题:
THx的
答案 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并使用它。