Подпишите результаты fft

Я пытаюсь вычислить MTF из тестовой цели. Я вычисляю функцию распространения достаточно легко, но результаты FFT не имеют для меня никакого смысла. Подводя итог, значения, похоже, чередуются, что дает мне отражение того, что я ожидаю. Чтобы проверить, я использовал простую квадратную волну и numpy:

from numpy import fft data = [] for x in range (0, 20): data.append(0) data[9] = 10 data[10] = 10 data[11] = 10 dataFFT = fft.fft(data) 

Результаты выглядят корректно, за исключением знака … В качестве примера для следующих четырех значений я вижу следующее:

30.00000000 + 0.00000000e + 00j

-29,02113033 + 7,10542736e-15j

26.18033989 -1.24344979e-14j

-21.75570505 + 1.24344979e-14j

Поэтому мой вопрос в том, почему положительный -> отрицательный – положительный – отрицательный в реальной плоскости? Это не то, что я ожидал бы … Это я его построю, почти кажется, что правильная функция зеркалируется вокруг оси х.

Примечание. В качестве примера я ожидал следующее: Пример изображения

Это то, что я получаю: Мои результаты

3 Solutions collect form web for “Подпишите результаты fft”

Ваш импульс симметричен и расположен в центре вашего окна FFT (около N / 2). Симметричные реальные данные соответствуют только косинусным или «реальным» компонентам результата БПФ. Обратите внимание, что функция косинуса чередуется между -1 и 1 в центре окна FFT, в зависимости от индекса бинарной частоты (представляющего косинусные периоды по ширине FFT). Таким образом, корреляция этих базисных функций БПФ с положительным импульсом также будет чередоваться до тех пор, пока импульс будет меньше половины косинусного периода.

Если вы хотите, чтобы наибольшие коэффициенты БПФ были в основном положительными, попробуйте центрировать ваш узкий прямоугольный импульс вокруг времени 0 (или круговое время N), где функция косинуса всегда равна 1 для любой частоты.

Это не так неожиданно. Если вы хотите проверить обычные графики, убедитесь, что вы конвертируете эту информацию в масштаб и фазу, прежде чем приступать к каким-либо выводам.

Я сделал быструю проверку, используя ваш код и numpy.abs для mag, numpy, angle for phase. Для меня это выглядит как функция sinc (), что и ожидалось, если временная область является квадратным импульсом. Если вы это сделаете, вы обнаружите довольно широкий характер, как это было бы потрачено на короткий импульс на так много образцов.

  1. вы забыли указать, являются ли ваши данные реальными или сложными

    не каждый код в python / numpy (включая меня), и если вы этого не знаете, вы, вероятно, обрабатываете данные в / из FFT по-другому.

    • Вход FFT может быть как реальным, так и сложным доменом
    • Вывод FFT – сложный домен

    поэтому проверьте документы для реализации FFT и укажите его, а также соответствующим образом отредактируйте обработку данных. Сложный домен обычно имеет первое значение Re и Second Im, но это зависит от реализации / конфигурации FFT .

  2. сигнал

    здесь приведен пример импульсной характеристики БПФ Импульсный отклик БПФ сначала вводится сигнал реального домена (Im = 0) одиночный конечный ненулевой импульс ширины, а второй является частью Re для выхода FFT . Третья часть – это часть FFT-выхода . Если вы немного увеличите масштаб изображения, вы увидите амплитудный диапазон оси y каждого сигнала (слева).

    Не забывайте, что разные реализации FFT могут иметь разные константы нормализации, которые изменят амплитуду сигнала. Если вы хотите, чтобы амплитуда и фаза превращались так:

     mag=sqrt(Re*Re+Im*Im); // power ang=atanxy(Re,Im); // phase angle 

    atanxy(dx,dy) – это 4 квадранта arctan также называемый atan2 но будьте осторожны, чтобы получить порядок операндов так же, как и ваши atanxy/atan2 . Также может использовать myan-реализацию my C ++

[Заметки]

если ваш входной сигнал является реальным доменом, тогда выход FFT является симметричным. Оба сигнала Re и Im будут выглядеть так:

 { a0,a1,a2,a3,...,a(n-1),a(n-1)...,a3,a2,a1,a0 } 

точно так же, как на изображении выше. Слева находятся низкие частоты, а в середине – верхняя частота. Если ваш входной сигнал является сложным доменом, то выход может быть любым.

Python - лучший язык программирования в мире.