对于你们中的一些人来说这可能看起来很简单,但我对信号处理并不是很熟悉,我宁愿对此有所了解。
所以我发现了一些在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,依此类推。
这可能吗?有人可以帮帮我吗?
非常感谢。
答案 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倍。