Как определить величину частоты и фазовый угол по аудиосэмплу?

В настоящее время я работаю над этим проектом, который требует некоторых навыков DSP. Я должен извлечь звук из фильма, а затем, проанализировав его, я должен определить, говорит кто-то или нет, больше как детектор голосовой активности.

Я пишу код на Java (да, я знаю, что это не лучший выбор) и использую только библиотеку для извлечения звука из видео и JLayer, чтобы я мог обрабатывать MP3.

Мой класс, извлекающий образцы аудио получает выборки последовательно для каждого канала, в моем случае два: LEFT0, RIGHT0, LEFT1, RIGHT1, LEFT2, RIGHT2 и т. д.

Вот что я сделал до сих пор:

  • Я помещаю образцы для каждого канала в массив.
  • I apply a Hamming window [N = 8192]:

    double w = 0.54 - 0.46 * (Math.cos(2*Math.PI*buffer[i]/buffer.length-1)); fftBuffer[i] = new Complex(w, 0);

  • Затем я выполняю простой БПФ на каждом канале, а затем вычисляю величину mag = re^2 + im^2; после этого я делаю логарифмический масштаб (дБ): mag_dB = 10 * log10(abs(mag));

Because I am "looking for voice" here, I need frequencies between 80 and 1000 (even tough the voice ranges between 80 Hz and 255 Hz). So, from the FFT I get a mirrored N = 8129 array from witch I need only the first N/2.

Частота на ячейку (слот в массиве, полученном в результате БПФ) будет частотой дискретизации (48,000 кГц) / N; это будет 48000/8192 = 5 Гц на ячейку. Так что я смотрю в массиве только на значения от FFT_Result [15] до FFT_Result [199] (16 * 5 Гц = 80 Гц; 200 * 5 = 1000 Гц), верно ?!

Я посмотрел на частотный анализатор в Cool Edit Pro, все амплитуды отрицательные. В моем случае первые (звук на заднем плане и негромкий) отрицательные, а после все положительные. Разве они не должны быть отрицательными? Я что-то здесь упускаю?

До сих пор, исходя из того, что я заметил, глядя на частотный анализатор и фазоанализатор в Cool Edit Pro, мне нужен порог в этом частотном диапазоне, какой-то алгоритм для определения в течение n миллисекунд, если величина постоянна. в этом частотном диапазоне и определите, центрирован ли звук. Последнее нужно делать (я думаю), анализируя фазовый угол, когда кто-то говорит, звук всегда по центру.

Мне не удалось найти способ сделать это, и я запутался в том, что я сделал до сих пор, потому что не знаю, правильно ли то, что я сделал до сих пор.

Итак, если вы читаете все это, спасибо за ваше терпение и мои вопросы:
- правильно ли я сделал то, что сделал до сих пор?
- должна ли амплитуда быть отрицательной?
- кто-нибудь знает, как я могу вычислить фазу для ряда образцов?


person Cyupa    schedule 03.05.2011    source источник
comment
Амплитуды отрицательные? Это не имеет смысла, кроме шкалы дБ. Так ли это?   -  person Oliver Charlesworth    schedule 03.05.2011
comment
@Oli Charlesworth: После того, как я сделаю логарифмическую шкалу, я получаю такие значения: 6.192286815256956 1.4657064018498 -2.360496921728435 4.294669805664844 -2.2876799531445684 -11.729105860184267 7.070140033122696, смешанные вместе отрицательные и положительные стороны   -  person Cyupa    schedule 03.05.2011
comment
@Cyupa: О, я пропустил ту часть, где вы упомянули лог в своем вопросе. Извините. Но положительные они или отрицательные - это совершенно произвольно, в том смысле, что это зависит от общего масштабирования вашей звуковой волны. Вероятно, вы захотите увидеть значительное относительное изменение амплитуды, а не конкретный абсолютный уровень.   -  person Oliver Charlesworth    schedule 03.05.2011
comment
@Oli Charlesworth: Итак, вы предлагаете, чтобы, основываясь на предыдущих значениях амплитуды определенных частотных интервалов, я должен определить, есть ли относительное изменение, а не проверять, достигает ли оно определенного значения. Спасибо за ваше предложение. :-)   -  person Cyupa    schedule 03.05.2011
comment
@Cyupa: Да, возможно, относительно значений корзины в предыдущий момент времени. Или, возможно, относительно среднего значения интервала по всему БПФ для этого временного интервала. Фактически, вычисление того, сколько общей энергии сосредоточено в интересующей полосе.   -  person Oliver Charlesworth    schedule 03.05.2011
comment
@Oli Charlesworth: Интересный совет. Спасибо. Я постараюсь реализовать это и вернуться с результатами завтра.   -  person Cyupa    schedule 03.05.2011
comment
Как вы думаете, зачем вам фаза? И если да, то что вы хотите, чтобы измерение фазы относительно?   -  person Paul R    schedule 03.05.2011
comment
@Paul R: Я читал, что некоторые плагины для удаления голоса изменяют фазовый угол на 180 градусов, потому что голос помещается по центру (в большинстве случаев), и в Cool Edit Pro я заметил, используя Phase Analyzer (размер окна 8129), что когда кто-то был в фильме он был по центру (левая и правая были почти одинаковы). Кстати, спасибо за ваши предыдущие посты. Я новичок в этом, и один из ваших предыдущих ответов помог мне рассчитать величины.   -  person Cyupa    schedule 04.05.2011
comment
@Cyupa: Хорошо, важно понимать, что фаза - это относительное измерение - в этом случае это звучит так, как будто вы хотите, чтобы фаза одного канала (например, L) относительно другой канал (т.е. R). Вы можете рассчитать фазу на заданной частоте для каждого канала относительно окна БПФ, а затем вычесть ее, чтобы получить разницу, но обратите внимание, что это будет по модулю 2 * пи, если вы не можете выполнить какую-либо развертку фазы .   -  person Paul R    schedule 04.05.2011
comment
@eryksun Спасибо за совет. Я нашел здесь то, что вы мне рассказали, и думаю, что это ценная информация, которую вы мне предложили. Как я уже сказал ранее, я новичок в этой работе, у меня нет опыта, и довольно сложно разобраться во всех этих деталях за несколько дней. Спасибо!   -  person Cyupa    schedule 04.05.2011
comment
У меня есть сомнения по поводу окна Хэмминга .... double [] w = new double [SIZE]; двойной Pi2_N = 2.0 * Math.PI / SIZE; w [i] = 0,54-0,46 * (Math.cos (Pi2_N * (i))); ...   -  person Anita    schedule 25.12.2014


Ответы (3)


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

Для фазы во временной области вы можете сначала использовать преобразование Гильберта, а затем использовать atan2 для действительной и мнимой частей каждой выборки для оценки мгновенной фазы.

person toadaly    schedule 03.05.2011
comment
Я решил вернуться и дать отзыв. Это действительно очень сложная проблема, но практический подход будет тем, который вы предложите. Я пошел с ним и получил некоторые интересные результаты, он требует множества тонких настроек и каким-то образом зависит от кодировки звука. Спасибо. - person Cyupa; 11.10.2012

Вместо того, чтобы смотреть на фазы отдельных каналов, вы можете проверить задержку между обоими каналами. Предполагая, что один и тот же сигнал представлен на оба канала, направление источника звука можно определить по этой межканальной задержке. Предполагая, что расстояние от уха до уха составляет около 20 см, эта задержка составляет не более 0,2 / 340 = 0,58 мс или около 30 отсчетов при 48 кГц. Если вы рассчитаете взаимную корреляцию в этом диапазоне (30 отсчетов), вы должны найти пик, указывающий направление источника.

Чтобы определить наличие голосового сигнала, вы можете рассчитать общую энергию в диапазоне 80–1000 Гц и установить пороговое значение по некоторому разумному значению. Вы можете сделать это либо в частотной области, суммируя величины в ячейках от 80 до 1000 Гц, либо во временной области, используя полосовой фильтр и вычисляя среднеквадратичное значение.

person Han    schedule 04.05.2011

У вас двустороннее преобразование. Средняя точка - это составляющая постоянного тока. Отрицательная частота - это действительно положительная частота, сдвинутая по фазе на 180 градусов! Итак, если вы используете первую половину значений БПФ с отрицательными частотами, вам нужно изменить фазу на пи, чтобы получить точную картину того, что происходит.

В качестве альтернативы используйте вторую половину значений БПФ, где частоты положительны, а фазы правильные.

Я посмотрел на частотный анализатор в Cool Edit Pro, все амплитуды отрицательные. В моем случае первые (звук на заднем плане и негромкий) отрицательные, а после все положительные. Разве они не должны быть отрицательными? Я что-то здесь упускаю?

person JackCColeman    schedule 28.08.2013