Russian Qt Forum

Qt => Мультимедиа => Тема начата: Тимур от Июнь 27, 2013, 16:03



Название: Уровень шума в dB
Отправлено: Тимур от Июнь 27, 2013, 16:03
Здравствуйте!
Передо мной стоит задача измерять уровень шума в db, захваченного с микрофона.
Похожее, реализовано уже в  примере AudioInput Example.
Помогите разобраться, с функцией:
qint64 AudioInfo::writeData(const char *data, qint64 len)
Что приходит в const char *data? Массив Амплитуд в каждую 10^(-4) c времени?
И как эту амплитуду перевести в dB?
10*log(amplitude*amplitude*10^(12))?


Название: Re: Уровень шума в dB
Отправлено: xokc от Июнь 28, 2013, 11:01
Что приходит в const char *data? Массив Амплитуд в каждую 10^(-4) c времени?
Массив амплитуд в каждую 1/sampleRate c времени

И как эту амплитуду перевести в dB?
10*log(amplitude*amplitude*10^(12))?
Да, именно так. Только обычно считают dB для какой-нибудь выборки и расчитывают её для, например, максимального в ней значения.


Название: Re: Уровень шума в dB
Отправлено: Тимур от Июль 01, 2013, 11:03
Хokc, спасибо.  ;)

Цитировать
Да, именно так. Только обычно считают dB для какой-нибудь выборки и расчитывают её для, например, максимального в ней значения.
Предположим микрофон захватывает синус, сгенерированный на конкретной частоте.
В const char *data поступает массив размером 320 точек. Я нахожу максимальное значение. Оно равно, напрмер, 19 и тут у меня затык. Я не понимаю что это такое 19: вольты, милливольты? Если же посчитать 10*log(19*19*10^(12)), то я получаю значения в dB, которые не соответствуют, получаемым в сторонней программе spectarLab?


Название: Re: Уровень шума в dB
Отправлено: popper от Июль 02, 2013, 11:49
Это уже инженерная задача. Микрофон выполняет преобразование мощности акустических колебаний в определенной полосе частот в напряжение на выходе. Чтобы назвать микрофон средством измерений мощности акустических колебаний у него должна быть известная (и стабильная) характеристика преобразования.
Дальше звуковая карта выполняет преобразование выходного напряжения микрофона в цифровой код. Можно подать на звуковую карту калиброванное напряжение и определить соотношени между аналоговым и цифровым сигналами.
Дальше нужно определиться, что стоит за формулировкой "измерять уровень шума в dB". Децибеллы подразумевают существование некоторого "нулевого" значения, например порог слышимости. В Вашем случае, это может быть цена младшего разряда АЦП звуковой карты.
Что значит 10^12? Эту величину можно вынести за логарифм.


Название: Re: Уровень шума в dB
Отправлено: xokc от Июль 02, 2013, 22:54
В const char *data поступает массив размером 320 точек. Я нахожу максимальное значение. Оно равно, напрмер, 19 и тут у меня затык. Я не понимаю что это такое 19: вольты, милливольты? Если же посчитать 10*log(19*19*10^(12)), то я получаю значения в dB, которые не соответствуют, получаемым в сторонней программе spectarLab?
Ну да, забыл добавить что логарифм нужно считать не от 19, а от 19/32768, где 32768 - это максимальное значение амплитуды для 16 битного звука со знаком. А вообще используй примерно такой код:
Код
C++ (Qt)
float sum = 0;
for (int i = 0; i < bufLen; i++)
{
   float sample = buffer[i] / 32768.0;
   sum += (sample * sample);
}
double rms = sqrt(sum / bufLen);
float decibel = 10 * log10(rms);


Название: Re: Уровень шума в dB
Отправлено: Тимур от Июль 03, 2013, 10:51
xokc, спасибо!

получается среднее арифметическе-геометрическое? )

Код:
float decibel = 10 * log10(rms);
Как думаешь, может правильнее  float decibel = 20 * log10(rms)?


Название: Re: Уровень шума в dB
Отправлено: xokc от Июль 04, 2013, 10:10
получается среднее арифметическе-геометрическое? )
Вроде того. Всё зависит от задачи, которую ты пытаешься решить. Если тебе нужно просто рисовать на экране уровень звука, то используй среднее. Если нужно генерировать алярм по превышению/"принижению" звуком некоторых пороговых значений, то берут макс/мин значение из выборки и рассчитывают децибелы из него.

Код:
float decibel = 10 * log10(rms);
Как думаешь, может правильнее  float decibel = 20 * log10(rms)?
[/quote]
Вот тут уж всё равно. Если ты пытаешься равняться на spectarLab, то подгони под неё.