Цитата(Task Solver @ Jan 17 2014, 23:07)

1) Как можно сделать за один её вызов два БПФ для действительного входа той же длины?
Знаю что один вход надо записать в действительную часть, а второй в мнимую. Но что делать после вызова? Как разделить результаты?
(Кое что было написано тут, но непонятно:
http://electronix.ru/forum/index.php?showtopic=71731)2) Как можно сделать за один её вызов один БПФ для действительного входа двойной длины?
Этот вопрос важнее, чем первый.
FFT в своем алгоритмическом воплощении оставляет "мусор" из-за того, что в нем используются преобразования типа "бабочка". Поэтому в старшей части массива мы имеем второе крыло, зеркально отраженное от первого. Вот оно и сослужит нам добрую службу.
Рассмотрим самый примитивный пример (N=8), когда мы преобразуем комплексную функцию, разложенную на два массива:
double Re[8]; // это действительная часть исходной функции
double Im[8]; // это мнимая часть исходной функции
В том случае, когда преобразуется действительная функция, массив мнимых частей Im[] забит нулями. Но это не значит, что он не нужен, т.к. в нем мы получим амплитуды синусов.
После FFT-преобразования результат получится в той же паре массивов, а исходные значения испортятся. Получится вот что:
Re[0] - постоянная составляющая, Im[0] - обычно остается нулем.
Re[1] и Im[1] - амплитуды сos и sin 1-ой гармоники.
Re[2] и Im[2] - амплитуды сos и sin 2-ой гармоники.
Re[3] и Im[3] - амплитуды сos и sin 3-ей гармоники.
Re[4] - амплитуда сos 4-ой гармоники. Это частота Найквиста, т.к. более высокие таблично не представимы. Im[4] - равна нулю, т.к. у частоты Найквиста не может быть sin-составляющей.
Re[5] и Im[5] - мусор, копия Re[3] и -Im[3], соответственно.
Re[6] и Im[6] - мусор, копия Re[2] и -Im[2], соответственно.
Re[7] и Im[7] - мусор, копия Re[1] и -Im[1], соответственно.
Т.е. мусор обладает той особенностью, что амплитуда cos-гармоник отражается зеркально, сохраняя свою амплитуду. А амплитуды sin-гармоник при отражении изменяют свои знаки. Это происходит потому, что функция cos четная (симметричная относительно вертикальной оси), а функция sin нечетная (симметричная относительно точки).
Если у нас есть две действительные функции, то мы можем преобразовать их вдвоем сразу, за один прогон алгоритма FFT. Для этого надо первую действительную функцию запихнуть в Re[], как это и было раньше, а вторую записать в Im[], который раньше был обнулен.
После преобразования получим результат преобразования, соответствующий входной функции F1+i*F2 (множитель i из-за того, что F2 в мнимую часть была записана).
Однако, используя свойство зеркальности, можем выделить из суммы результаты, относящиеся в F1 и F2 по отдельности. Делается это так:
Re[0] – постоянная составляющая F1.
Im[0] – постоянная составляющая F2.
(Re[1]+Re[7])/2 - cos-амплитуда F1 для 1-ой гармоники, т.е. средняя арифметическая результата и зеркального мусора.
Почему так? А потому что cos-амплитуда F1 симметрична и от этой операции и останется прежней. Этой операцией она очистится от вклада sin-амплитуды F2, которая имеет противоположные по знаку амплитуды в Re[1] и Re[7].
(Re[1]-Re[7])/2 - sin-амплитуда F1 для 1-ой гармоники, тут уже симметричные косинусы взаимно уничтожились, а синусы остались живы.
Точно так же обрабатываем зеркальные пары:
(Re[2]+Re[6])/2 - cos-амплитуда F1 для 2-ой гармоники.
(Re[2]-Re[6])/2 - sin-амплитуда F1 для 2-ой гармоники.
(Re[3]+Re[5])/2 - cos-амплитуда F1 для 3-ой гармоники.
(Re[3]-Re[5])/2 - sin-амплитуда F1 для 4-ой гармоники.
Частоты Найквиста зеркального отражения не имеет, с ней проще:
Re[4] - cos-амплитуда F1 для частоты Найквиста.
Im[4] - cos-амплитуда F2 для частоты Найквиста.
В расчетах необходимо только уметь вычислять среднее арифметическое, и более никаких трудностей тут нет.