0

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

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

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

非常感谢。

4

2 回答 2

4

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

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

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

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

于 2012-04-04T15:05:21.737 回答
3

您可能只需要知道 20 dB 等于 10 的因数,即

dB = 20 * log10(V / V0)

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

于 2012-04-04T15:30:49.693 回答