Пpеобpазование Хаpтли

From
Evgenij Masherov (2:5020/175.2)
To
Илья Кантор
Date
2002-11-20T21:50:50Z
Area
RU.ALGORITHMS
From: "Evgenij Masherov" <EMasherow@nsi.ru>

Wed Nov 20 2002 21:35, Илья Кантор wrote to Evgenij Masherov:

 EM>> Двукратный выигрыш получается из того, что БПФ по К точкам может быть
 EM>> применено для вычисления действительного преобразования Фурье по 2К
 EM>> точках.
 EM>> Оно же может быть вычислено при помощи БПФ по 2К точкам.
 EM>> Число элементарных операций для Фурье составляет C*(K*log K)+O(), для
 EM>> Хартли C*(2*K*log(2*K))+O(). Однако комплексное умножение-сложение
 EM>> требует вчетверо больше операций, чем действительное, что и дает
 EM>> (пренебрегая разницей между логарифмом К и 2*К) примерно двойной
 EM>> выигрыш.

 ИК> Ок. Вот подробно расписанные оценки. Здесь доказывается, что количество
 ИК> операций почти одинаково, за исключением O(N) с малой константой. Все
 ИК> данные по количеству операций относятся к действиям с действительными
 ИК> числами.

 ИК> В БПФ на каждом уровне рекурсии делается N/2 бабочек, каждая из 4
 ИК> умножений и 6 сложений, всего 2N* и 3N+ на уровень.

 ИК> В БПХ на каждом уровне делается N/4 спаренных бабочки (иначе не "на
 ИК> месте" выходит). Каждая спаренная бабочка - это 4 умножения и 6 сложений.
 ИК> #define FHT_T2Butterfly(N1,N2,C,S) {\ 
 ИК>         double Rx,Ri;                   \
 ИК>         int i1=N1,i2=N2;                        \
 ИК>         Rx=Right[i1];Ri=Right[i2];    \
 ИК>         {                                       \ 
 ИК>                 double cas1,Lx;         \
 ИК>                 cas1=Rx*(C)+Ri*(S);     \
 ИК>                 Lx=Left[i1];            \
 ИК>                 Left[i1]  = Lx+cas1;    \ 
 ИК>                 Right[i1] = Lx-cas1;    \
 ИК>         }                             \
 ИК>         {                                       \
 ИК>                 double cas2,Li;         \ 
 ИК>                 cas2=Rx*(S)-Ri*(C);     \ 
 ИК>                 Li=Left[i2];            \
 ИК>                 Left[i2]  = Li+cas2;    \
 ИК>                 Right[i2] = Li-cas2;    \
 ИК>         }                             \
 ИК> }
 ИК> Так что всего N умножений и 3N/2 сложений.

 ИК> Комплексный вектор в 2 раза короче действительного, поэтому БПФ
 ИК> действительного вектора состоит также из N умножений и 3N/2 сложений.

 ИК> Если не учитывать затраты O(N) с малой константой на FFT Real wrapper, то
 ИК> получается одинаково...

Ну так не надо добиваться "наместности". Используем вспомогательный буфер.

Евгений Машеров АКА СанитарЖеня

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)