IFFT для комплексного N Сигнал - вывод: реальный Сигнал длиной 2N - PullRequest
1 голос
/ 05 марта 2011

В своей книге «Цифровая обработка сигналов» Проакис и Манолакис описывают метод вычисления БПФ реального сигнала длиной 2N с использованием БПФ длины N. Это в основном делается путем разделения сигнала на его нечетные и четные части.Четные части являются входными данными для реальной части БПФ, а нечетные части являются мнимыми.Оба сигнала извлекаются из выходных данных БПФ с использованием метода, который иногда известен как «Два по цене одного» * ​​1001 *http://www.engineeringproductivitytools.com/stuff/T0001/PT10.HTM

После этого для вычисления вычислений используется последний этап прореживания во временном БПФ.сигнал в частотной области.Я реализовал, и я думаю, что я также понял, как работает этот метод.Однако я застрял, выполняя IFFT аналогичным образом.

У меня есть сигнал в частотной области с длиной 2N.Поскольку это реальное представление частотной области, его левая и правая стороны симметричны.Теперь я хочу использовать первую половину сигнала и использовать IFFT с длиной N для вычисления представления этого сигнала во временной области.Я провел всю прошлую ночь, пытаясь выяснить, как это работает и пытаясь реализовать это, однако я никогда не получал числа, которые я должен был.Страница, которую я упомянул, является единственным источником, который я нашел, который дает расплывчатое объяснение, как должно работать нечто подобное, однако это не сильно помогло в его понимании.

Что мне нужно сделать, чтобы использовать IFFT длиной N для преобразования комплексного и симметричного сигнала частотной области длиной 2N в его представление в реальном времени длины 2N за один проход?

Ответы [ 2 ]

1 голос
/ 05 марта 2011

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

ДОБАВЛЕНО:

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

0 голосов
/ 22 марта 2011

В случае, если у кого-то есть тот же вопрос, что и у меня, вот мой неоптимизированный исходный код на C. Надеюсь, я иногда найду время, чтобы добавить некоторые объяснения.(код использует 2 * n сигнала в качестве действительного и 2 * n + 1 в качестве мнимой части). Обратите внимание, что массив, который содержит комплексный спектр, должен иметь длину realInputSignal + 2, чтобы сохранить смещение DC.Однако можно сохранить последнее действительное значение вместо первого комплексного значения (поскольку оно не используется), и вам не нужно добавлять еще 2 образца в массив.Тем не менее, ваш DFT также должен знать об этом.

N = lData/2;

double X1R = 0.5*(outData[0] + outData[N*2]);
double X1I = 0.0;
double X2Ra = 0.5*(outData[0] - outData[N*2]);
double X2Ib =0.0;//

double wr = cos((double)0 * M_PI / (double)N);
double wi = -sin((double)0 * M_PI / (double)N);
double X2R = (X2Ra*wr + X2Ib*wi)/(wr*wr + wi*wi);
double X2I = (X2Ib*wr - X2Ra*wi)/(wr*wr + wi*wi);
outData2[0*2] = X1R - X2I;
outData2[0*2+1] = X1I + X2R;


for (int i=1; i<N; i++){

    double X1R = 0.5*(outData[i*2] + outData[N*2-2*i]);
    double X1I = 0.5*(outData[i*2+1] - outData[N*2-2*i+1]);
    double X2Ra = 0.5*(outData[i*2] - outData[N*2-2*i]);
    double X2Ib = 0.5*(outData[i*2+1] + outData[N*2-2*i+1]);
    double wr = cos((double)i * M_PI / (double)N);
    double wi = -sin((double)i * M_PI / (double)N);
    double X2R = (X2Ra*wr + X2Ib*wi)/(wr*wr + wi*wi);
    double X2I = (X2Ib*wr - X2Ra*wi)/(wr*wr + wi*wi);
    outData2[i*2] = X1R - X2I;
    outData2[i*2+1] = X1I + X2R;

}

ifft(outData2);
...