产生的MATLAB声音增加了dB值

时间:2012-04-04 14:50:40

标签: matlab audio signal-processing

对于你们中的一些人来说这可能看起来很简单,但我对信号处理并不是很熟悉,我宁愿对此有所了解。

所以我发现了一些在MATLAB中生成纯音的简单代码:

Fs = 44100;
duration = 5.0;

numberOfSamples = Fs * duration;
samples = (1:numberOfSamples) / Fs;
s = sin(2 * pi * freq * samples);

sound(s, Fs);

我希望能够在这里以dB为单位调节音量。更确切地说,我想引入一个特定的参数,比如说dbOffset,它在校准后会确定音调的大小。

例如:如果我进行校准以使dbOffset = 0产生50 dB的音调,我希望dbOffset = 10产生60 dB,依此类推。

这可能吗?有人可以帮帮我吗?

非常感谢。

2 个答案:

答案 0 :(得分:4)

声音的强度(即声音的大小)由声波的幅度决定。要增加或减小正弦振幅,必须将其乘以比例因子。一般来说:

 A*sin(2*pi*f)

产生正弦波,其峰值(因此幅度) A ,频率 f Hz。那当然是在连续的世界里。

那就是说,要控制声音强度,你必须将它乘以一些常数。

然后,您必须查看sound函数的工作原理。从官方文档:

  

声音函数假设y包含介于-1和1之间的浮点数,并剪切该范围之外的值。

松散地转换为:如果幅度y等于1,声卡将发出最大声音。哎呀,你遇到了一个问题:实际的声音强度主要取决于声卡和连接到PC的扬声器......所以制作一个以分贝为单位发出声音的通用功能并不容易...... < / p>

如果您只想玩这个概念并习惯它,请尝试:

Fs = 44100;
duration = 2.0;

numberOfSamples = Fs * duration;
samples = (1:numberOfSamples) / Fs;
s = sin(2 * pi * freq * samples);
s2 = 0.5*sin(2*pi*freq*samples);

sound(s, Fs);
sound(s2,Fs);

这将创建一个峰值为第一个播放峰值一半的声音。 意味着它具有一半的强度,或者使用更好的术语,即功率。正弦曲线的功率与其振幅没有线性关系,但这是一个完全不同的故事。

底线是:要做你想做的事,你必须知道整个系统所涉及的再现声音,你必须知道一些物理来计算功率,然后,就在那时,你将会能够编写一些代码,将正弦曲线乘以某个计算的常数,播放具有指定强度的声波:)

答案 1 :(得分:3)

您可能需要知道的是,20 dB等于10倍,即

dB = 20 * log10(V / V0)

因此,要将振幅增加20 dB,您的峰值需要增加10倍,相反,-20 dB则是振幅减小10倍。