我尝试通过这样做来增加噪音:
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并使用它。