Russian Qt Forum
Ноябрь 22, 2024, 12:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Уровень шума в dB  (Прочитано 4826 раз)
Тимур
Гость
« : Июнь 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))?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Июнь 28, 2013, 11:01 »

Что приходит в const char *data? Массив Амплитуд в каждую 10^(-4) c времени?
Массив амплитуд в каждую 1/sampleRate c времени

И как эту амплитуду перевести в dB?
10*log(amplitude*amplitude*10^(12))?
Да, именно так. Только обычно считают dB для какой-нибудь выборки и расчитывают её для, например, максимального в ней значения.
Записан
Тимур
Гость
« Ответ #2 : Июль 01, 2013, 11:03 »

Хokc, спасибо.  Подмигивающий

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

Это уже инженерная задача. Микрофон выполняет преобразование мощности акустических колебаний в определенной полосе частот в напряжение на выходе. Чтобы назвать микрофон средством измерений мощности акустических колебаний у него должна быть известная (и стабильная) характеристика преобразования.
Дальше звуковая карта выполняет преобразование выходного напряжения микрофона в цифровой код. Можно подать на звуковую карту калиброванное напряжение и определить соотношени между аналоговым и цифровым сигналами.
Дальше нужно определиться, что стоит за формулировкой "измерять уровень шума в dB". Децибеллы подразумевают существование некоторого "нулевого" значения, например порог слышимости. В Вашем случае, это может быть цена младшего разряда АЦП звуковой карты.
Что значит 10^12? Эту величину можно вынести за логарифм.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #4 : Июль 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);
Записан
Тимур
Гость
« Ответ #5 : Июль 03, 2013, 10:51 »

xokc, спасибо!

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

Код:
float decibel = 10 * log10(rms);
Как думаешь, может правильнее  float decibel = 20 * log10(rms)?
« Последнее редактирование: Июль 03, 2013, 12:08 от Тимур » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #6 : Июль 04, 2013, 10:10 »

получается среднее арифметическе-геометрическое? )
Вроде того. Всё зависит от задачи, которую ты пытаешься решить. Если тебе нужно просто рисовать на экране уровень звука, то используй среднее. Если нужно генерировать алярм по превышению/"принижению" звуком некоторых пороговых значений, то берут макс/мин значение из выборки и рассчитывают децибелы из него.

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


Страница сгенерирована за 0.137 секунд. Запросов: 22.