2013-11-08 4 views
1

Я хотел узнать, почему аргументы за конфликтом ТОЛЬКО в мнимых частях после IFFT.Конфликт во мнимых частях после IFFT

Для реализации моего C/C++ и реализации Matlab я выполняю следующие шаги.

  1. Мой сигнал х имеет размерность MX1 и я выполнить N-точечное FFT (где N = 2 * М) по этому сигналу, чтобы получить N-точечное сигнал в частотной области.
  2. Применять настроенный фильтр на этот сигнал частотной области (как действительная, так и мнимая части изменены на шаге).
  3. Выполнение в N-точка обратного БПФ.

реализации Оба C/C++ и Matlab генерировать точно такой же результат, за исключением после стадии обратного БПФ, мнимые части не совпадают, но действительные части действительно совпадают.

Если я пропустил шаг 2 выше, выход IFFT обоих вариантов реализации будет без проблем. Предполагается, что мой входной сигнал для IFFT (то есть после фильтра с шагом 2) не должен быть сопряженным симметричным. Infact этот сигнал может даже не быть эрмитовым/симметричным.

В настоящее время я использую C-реализацию FFT/IFFT, определенную как функцию smbFft, представленную в этом документе CPP-FILE.

Любые подсказки, почему это может произойти?

PS: Было бы здорово, если бы кто-то мог указать мне на реализацию FFT в C/C++, которая точно совпадает с соответствующей реализацией Matlab.

Спасибо.

Редактировать: Я только что протестировал реализацию FFTW вместо smbFfT (упоминалось выше). Реализация FFTW также имеет ту же проблему, которая предполагает, что обе эти тестируемые C-реализации выполняют IFFT с настройкой симметрии эрмитов. Мне нужно выполнить тот же IFFT в C, что и Matlab с IFFT(..., 'nonsymmetric').

+3

Отправьте свой код. Специально, остерегайтесь оператора Matlab '' ', который применяет комплексное сопряжение. –

+2

попробуйте FFT -> IFFT * без * других изменений с обоими кодами, также подтвердите, что обратная операция в вашем коде C верна. Результаты должны быть равны входному значению (с учетом численной точности). – Sebastien

+0

@ Sebastien. Я только что отредактировал выше, я пропустил шаг 2 выше, выход IFFT совпадает с IFFT Matlab. – Junaid

ответ

1

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

Matlab и C обрабатывают индекс 0 или 1 массивов по-разному. Убедитесь, что ваш фильтр также учитывает это.

+0

Спасибо за ваши указатели. Предполагается, что мой входной сигнал для IFFT (то есть после фильтра с шагом 2) не должен быть сопряженным симметричным. Следовательно, я знаю, что после того, как IFFT не даст мнимой части нулю. Это не проблема. Проблема - это мнимая часть, которая по-прежнему важна для меня после IFFT. Но C-реализация (я упоминал выше) вычисляет разные значения мнимой, чем по сравнению с реализацией Matlab.IFFT. Другими словами, эти две реализации IFFT находятся в конфликте при работе с одним и тем же входным несимметричным сигналом. – Junaid