Вывод GCC_PHAT

#android #audio #signal-processing

#Android #Аудио #обработка сигналов

Вопрос:

Я пытаюсь разработать алгоритм GCC_PHAT на устройствах Android. Для БПФ я использовал эту библиотеку. Идея состоит в том, чтобы сопоставить два аудиофайла (16-битный PCM mono), чтобы найти задержку между ними. С Matlab это работает отлично. Моя первая проблема — вывод FFT, он выдает числа выше 32768 . Например:

 fft re   -20830.895138576154
fft re   -30639.569794501647
fft re   -49850.48597621472
fft re   -49335.28275604235
fft re   -96060.94916529073
fft re   -91409.17426504416
fft re   -226903.051428709
 

Есть ли способ нормализовать эти числа до интервала [-1,1]?

Комментарии:

1. Какие-либо конкретные причины, по которым вам нужно нормализовать БПФ (промежуточный результат)? Насколько я понимаю, вывод G_PHAT по определению нормализуется до диапазона [-1,1].

2. да, после нормализации GCC= conv /(max(abs(conv),1e-6)) значения масштабируются от -1 до 1. но опять же, я должен применить IFFT к этим результатам, что дает мне ненормализованные числа, как вы видели выше в FFT. Итак, я не знаю, является ли возвращаемый индекс максимального пика, соответствующий такому значению, истинным или нет.

3. Если я не неправильно понял, d_PHAT в качестве возвращаемого индекса ограничен диапазоном [0,N-1] (где N — размер БПФ). Фактическое значение пика не имеет значения, если вы не хотите выполнять другие виды обработки в R_PHAT (в этом случае вы можете уточнить, какую обработку вы собираетесь выполнять). С другой стороны, выбор максимального значения для всех (i, j) пар в качестве коэффициента нормализации может привести к достижению того, что вы ищете, но является ли это наиболее подходящим для вашего конкретного приложения, это уже другая история.

4. да, я сделаю дальнейшую обработку после GCC_PHAT, чтобы вычислить расстояние между двумя устройствами, отправляющими эти аудиосигналы. Кроме того, я хочу сравнить значение пика, указанного этим индексом, с значением в Matlab. в Android я нашел значение 921.28018 .., и, как я уже сказал, в matlab будут значения <1.0.

Ответ №1:

Определение прямого преобразования библиотеки соответствует определению Matlab, поэтому вы должны получить соответствующие значения после прямого преобразования (не то, чтобы это было критично, поскольку G_PHAT нормализуется на [-1,1]).

Однако этого нельзя сказать об обратном преобразовании. Действительно, из комментариев к коду inverseTransform :

Это преобразование не выполняет масштабирование, поэтому обратное не является истинным обратным.

И с веб-страницы библиотеки:

Этот FFT не выполняет никакого масштабирования. Таким образом, для вектора длины n после выполнения преобразования и обратного преобразования над ним результатом будет исходный вектор, умноженный на n (плюс ошибки аппроксимации).

Итак, чтобы получить значения, соответствующие реализации Matlab FFT / IFFT, вам нужно будет разделить результат IFFT на n.