增加 dB 值的 MATLAB 声音生成

Posted

技术标签:

【中文标题】增加 dB 值的 MATLAB 声音生成【英文标题】:MATLAB sound generation with increased dB-value 【发布时间】:2012-04-04 14:50:39 【问题描述】:

对于你们中的某些人来说,这可能看起来是一个简单的问题,但我对信号处理不是很熟悉,我更愿意确定这一点。

所以我找到了一些在 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,依此类推。

这可能吗?谁能帮我解决这个问题?

非常感谢。

【问题讨论】:

【参考方案1】:

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

 A*sin(2*pi*f)

产生一个正弦波,其峰值(因此振幅)为 A,频率为 f Hz。当然,这是在连续的世界中。

也就是说,要控制声音强度,您必须将其乘以某个常数。

然后,你必须看看sound 函数是如何工作的。来自官方文档:

sound 函数假定 y 包含介于 -1 和 1 之间的浮点数,并裁剪超出该范围的值。

这大致翻译为:如果幅度 y 等于 1,则声卡将发出它所能发出的最响亮的声音。哎呀,你遇到了一个问题:实际的声音强度主要取决于声卡和连接到PC的扬声器......所以要制作一个以分贝为单位的通用函数并不容易......

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

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);

这将创建一个峰值为第一个播放的峰值一半的声音。这并不意味着它有一半的强度,或者用更好的术语来说,就是力量。正弦曲线的功率与其幅度不是线性相关,但这是完全不同的故事。

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

【讨论】:

感谢您的解释。所以实际上我应该反过来工作:将硬件音量调到最大值,比如 130 dB,并让该音量的幅度对应于 1。从这里开始,有没有办法划分这个幅度并确保它将对应于某个 dB 值?我有一种感觉,从这里开始不会那么难。 是的,有。但我已经给了你所有你需要的提示,这样你就可以自己弄清楚了;)【参考方案2】:

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

dB = 20 * log10(V / V0)

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

【讨论】:

谢谢,这确实是我需要知道的!所以要添加k*10 dB,我需要将幅度乘以sqrt(10) ^ k 是的 - 我认为这是正确的。例如。 60 dB 是 1000 的因数,因此 k = 6 => sqrt(10)^6 = 3.16227766016838^6 = 1000。

以上是关于增加 dB 值的 MATLAB 声音生成的主要内容,如果未能解决你的问题,请参考以下文章

点声源随距离增加引起的衰减计算

在objective c ios中增加自定义本地通知声音的时间

如何在iphone sdk的Touch down事件中设置增加声音的速率并重复这个声音

如何在目标 c 中增加声音的音量并消除背景噪音

如何增加使用AVAudioRecorder录制的声音音量

C# winform,如何使轨迹栏与声音文件一起移动(增加其值)?