Название: Уровень шума в 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? Да, именно так. Только обычно считают dB для какой-нибудь выборки и расчитывают её для, например, максимального в ней значения.10*log(amplitude*amplitude*10^(12))? Название: 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 битного звука со знаком. А вообще используй примерно такой код:Код
Название: Re: Уровень шума в dB Отправлено: Тимур от Июль 03, 2013, 10:51 xokc, спасибо!
получается среднее арифметическе-геометрическое? ) Код: float decibel = 10 * log10(rms); Название: Re: Уровень шума в dB Отправлено: xokc от Июль 04, 2013, 10:10 получается среднее арифметическе-геометрическое? ) Вроде того. Всё зависит от задачи, которую ты пытаешься решить. Если тебе нужно просто рисовать на экране уровень звука, то используй среднее. Если нужно генерировать алярм по превышению/"принижению" звуком некоторых пороговых значений, то берут макс/мин значение из выборки и рассчитывают децибелы из него.Код: float decibel = 10 * log10(rms); [/quote] Вот тут уж всё равно. Если ты пытаешься равняться на spectarLab, то подгони под неё. |