#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.