Как правильно сделать комплексное преобразование Фурье в python?
У меня есть два массива по 1024 значения с двух АЦП (I и Q сигналы). Мне требуется вычислить как частоту сигнала, так и сдвиг фазы между этими каналами. Т.е. сделать комплексное преобразование. Должно получиться примерно так, как на этом рисунке:
Я предполагаю использовать NumPy. Но не могу понять как мне надо подготовить массивы для комплексного FFT и какую конкретно функцию из библиотеки использовать для моего случая?
Использовать numpy.fft.fft().
Можно использовать с действительными числами, преобразование все равно будет комплексным.
Если уж сильно хочется чтоб было все комплексное - просто добавьте нулевую мнимую часть к вашим действительным числам. Это можно сделать например сложив ваш действительный массив с 0j.
Вот это во всех туториалах, но это не то, что надо.
Дело в том, что I и Q с точки зрения математики как раз реальная и мнимая части. Я пробовал умножать Q на мнимую единицу, загнав в массив чистый синус. В результате максимальная магнитуда для 0 индекса и 2048. И либо данные надо "готовить" иначе, либо я не понимаю как интерпретировать результат преобразования.
Роман Попов, Проблема не ясна. Что конкретно у вас не получается?
В результате максимальная магнитуда для 0 индекса и 2048.
В результате БПФ в нулевой гармонике находится постоянная составляющая сигнала. Нулевая гармоника обычно максимальна. Т.к. результат БПФ симметричен, то и последняя гармоника будет такой же как нулевая, за исключением того, что мнимая составляющая во второй половине спектра идет с противоположным знаком.
Обычно в дальнейших преобразованиях вторую половину спектра не используют.
Постоянную составляющую спектра (нулевую гармонику) можно сделать нулевой. Для этого надо найти среднее арифметическое временного сигнала и разделить каждый отсчет на это среднее.
Если у вас проблема правильно собрать входной комплексный массив для БПФ, то можно сделать так: in = I + 1j * Q
Это сработает, если массивы I и Q будут numpy array. Если это не так, то сначала приведите их в этот вид: I = np.asarray(I)
Спасибо. Что касается обработки результата понятно.
Но что из себя представляет InputBuffer?
У меня есть два массива - результат оцифровки двух параллельных АЦП. Т.е. реальный сигнал уже разложен на квадратурные каналы - действительную и мнимую составляющие сигнала. Что с ними сделать, прежде чем пихать в InputBuffer?