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