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