Правильно манипулируя данными с помощью FFT-свертки

Я читал Руководство по DSP вот уже 3 года. Только до недавнего времени, когда я достаточно освоился с программированием, я решил начать экспериментировать со сверткой на основе БПФ, 1D, если быть точным, одно действительное, сложное.

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

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

public void convolution(double [] xReal, double [] xImag,
double [] hReal, double [] hImag){

for (int i = 0; i < n; i++){
xReal[i] *= hReal[i];
xImag[i] *= hImag[i];
}
}

Мой вопрос: этот код для умножения элементов комплексного ДПФ правильно.

Я искал простой код свертки или просто математику за ним, но мне не повезло. Все, что я обнаружил, было просто «умножение в частотной области равно свертке во временной области».

2

Решение

Умножение в частотной области делает круговую свертку, а не прямолинейную свертку, если только вы не обнуляете FFT и IFFT дольше, чем сумма длины сигнала во временной области и полной импульсной характеристики во временной области. (Zero-pad, потому что круговое обтекание / обнуление всех нулей такое же, как без обтекания).

Кроме того, для свертки необходимо умножить на преобразование (БПФ) импульсный отклик с нулевой подкладкой (его частотный отклик), а не сам импульсный отклик.

Кроме того, умножение должно быть сложным умножением, а не умножением только двух разделенных компонентных векторов.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector