2012-04-04 7 views
0

Это может показаться легким вопросом для некоторых из вас, но я не очень хорошо разбираюсь в обработке сигналов, и я предпочел бы быть уверенным в этом.Генерация звука MATLAB с увеличенным значением дБ

Так что я нашел простой код для генерации чистого тона в среде MATLAB:

Fs = 44100; 
duration = 5.0; 

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

sound(s, Fs); 

Я хотел бы, чтобы иметь возможность регулировать громкость в дБ здесь. Точнее, я хочу ввести определенный параметр, скажем dbOffset, который после калибровки определяет громкость тона.

Например: если я откалибрую так, чтобы dbOffset = 0 дал тон 50 дБ, я хочу dbOffset = 10, чтобы получить 60 дБ и так далее.

Возможно ли это? Может ли кто-нибудь помочь мне в этом?

Большое спасибо.

ответ

3

Возможно, все, что вам нужно знать, это то, что 20 дБ равно 10, т.е.

dB = 20 * log10(V/V0) 

Таким образом, чтобы увеличить амплитуду на 20 дБ ваш пиковое значение должно идти на коэффициент 10, и, наоборот, -20 дБ является уменьшение амплитуды на коэффициент 10.

+0

Спасибо, это действительно то, что мне нужно знать! Поэтому, чтобы добавить 'k * 10' дБ, мне нужно умножить амплитуду на' sqrt (10)^k'. – gleerman

+0

Да, я думаю, это правильно. Например. 60 дБ - коэффициент 1000, поэтому k = 6 => sqrt (10)^6 = 3.16227766016838^6 = 1000. –

4

Интенсивность звука (то есть громкость) определяется амплитудой звуковой волны. Чтобы увеличить или уменьшить амплитуду синуса, вы должны умножить его на коэффициент масштабирования. Вообще говоря:

A*sin(2*pi*f) 

дает синусоидальную волну с пиковым значением (и, следовательно, амплитуда) , и частота F Гц. Это, конечно, в непрерывном мире.

При этом, чтобы контролировать интенсивность звука, вы должны умножить его на некоторую константу.

Затем вы должны посмотреть, как работает функция sound. Из официальной документации:

Звуковая функция предполагает, что y содержит числа с плавающей запятой между -1 и 1 и значения клипов вне этого диапазона.

Это слабо означает, что если амплитуда y равна единице, звуковая карта будет излучать самый громкий звук, который он может. К сожалению, там вы столкнулись с проблемой: фактическая интенсивность звука в основном зависит от звуковой карты и громкоговорителей, подключенных к ПК ... Так что не так просто сделать общую функцию, которая выплескивает звук в децибелах ...

Если вы хотите просто играть с концепцией, и привыкают к нему, попробуйте:

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

Это создаст звук с пиковым значением, что половина пикового значения первого воспроизведением. То, что не означает, что он имеет половину интенсивности, или, используя лучшие условия, мощность. Сила синусоиды не линейно связана с ее амплитудой, но это совершенно другая история.

Подводя итог: делать то, что вы хотите, вам нужно знать всю систему, участвующую в воспроизведении звука, вам нужно будет узнать какую-то физику, чтобы вычислить силу, а затем, именно тогда, можно написать код, который, умножая синусоид на некоторую вычисленную константу, воспроизводит звуковую волну с заданной интенсивностью :)

+0

Благодарность за объяснение. Поэтому на самом деле я должен работать наоборот: поставьте аппаратный том до максимума, скажем, на 130 дБ, и пусть амплитуда этого объема соответствует 1. Начиная с этого, есть способ разделить эту амплитуду и убедиться, что это будет соответствовать определенному значению дБ? У меня такое чувство, что отсюда не может быть так тяжело. – gleerman

+0

Да, есть. Но я уже дал вам все подсказки, которые вам нужны, чтобы вы могли понять это;) – Castilho