Как определить величину частоты и фазовый угол из аудиосэмпла? - PullRequest
2 голосов
/ 03 мая 2011

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

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

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

Итак, это то, что я сделал до сих пор:

  • Я помещаю сэмплы для каждого канала в массив.
  • Я применяю окно Хэмминга [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));

Поскольку я "ищу голос" здесь, мне нужны частоты от 80 до 1000 (даже если диапазон голоса составляет от 80 до 255 Гц). Итак, из БПФ я получаю зеркальный массив N = 8129 от ведьмы, мне нужен только первый N / 2.

Частота на бин (интервал в массиве, полученном из FFT) будет частотой дискретизации (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 миллисекунд, если величина постоянна в этом частотном диапазоне и определите, центрируется ли звук. Последнее должно быть сделано (я думаю), анализируя фазовый угол, когда кто-то говорит, звук всегда центрирован.

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

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

Ответы [ 3 ]

1 голос
/ 03 мая 2011

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

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

0 голосов
/ 28 августа 2013

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

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

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

0 голосов
/ 05 мая 2011

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

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

...