Документ взят из кэша поисковой машины. Адрес оригинального документа : http://num-anal.srcc.msu.ru/lib_na/cat/ft_htm_p/ftfrr_p.htm
Дата изменения: Thu Nov 5 12:32:43 2015
Дата индексирования: Sun Apr 10 03:39:13 2016
Кодировка: Windows-1251
БЧА НИВЦ МГУ. FTFRR_P. Ускоренные дискретные преобразования Фурье
Текст подпрограммы и версий
ftfrr_p.zip
Тексты тестовых примеров
tftfrr_p.zip

Подпрограмма:  FTFRR (модуль FTFRR_p)

Назначение

Вычисление коэффициентов действительного преобразования Фурье или вычисление значений функции по ее действительным коэффициентам Фурье. Длина действительного ряда (преобразуемого или вычисляемого) должна быть целой степенью двух.

Математическое описание

Пусть задан действительный ряд  X длины  2 * N. При вычислении действительного преобразования Фурье ряд  X преобразуется в два действительных ряда  A и  B длины  N + 1 по формулам

                              2N-1             
        A r  =  (1/N)     ∑    X n cos (π r n / N)  ,    r = 0, 1, ..., N
                               n=0
                              2N-1             
        B r  =  (1/N)     ∑    X n sin (π r n / N)  ,    r = 0, 1, ..., N
                               n=0 

при этом  B0 = BN = 0. . Для восстановления ряда  X по заданным действительным коэффициентам Фурье, элементы ряда  Х вычисляются по формуле

        X r  =  (A0 / 2) + ((- 1) r AN / 2) +
                       N-1             
                  +   ∑  (A n cos (π r n / N) + B n sin (π r n / N))  ,    
                       n=1
       r = 0, 1, ..., 2N - 1 

B вычислениях используется метод быстрого преобразования Фурье. При больших N число операций пропорционально  N * log2N. Данная подпрограмма подробно описана в [1, стp. 47] под именем  RFFT.

1.  В.А.Морозов, Н.Н.Кирсанова, А.Ф.Сысоев, Комплекс алгоритмов быстрого преобразования Фурье дискретных рядов. Сб. "Численный анализ на ФОРТРАНе". вып. 15. Изд - во МГУ, 1976 г.

Использование

procedure FTFRR(var P :Real; N1 :Integer; N2 :Integer;
                var A :Array of Real; var B :Array of Real;
                var X :Array of Real);

Параметры

P - заданная вещественная переменная, признак преобразования Фурье. Если на входе  P > 0., то вычисляются коэффициенты Фурье. Если на входе  P < 0., то вычисляются значения функции;
N1 - заданная длина массивов действительных коэффициентов Фурье,  N1 = N2 / 2 + 1 (тип: целый);
N2 - заданная длина массива значений функции, целая степень двух (тип: целый);
A - вещественный массив длины  N1, содержащий коэффициенты разложения Фурье по четным гармоникам. При  P < 0. задается на входе подпрограммы, при  P > 0. - вычисляется;
B - вещественный массив длины  N1, содержащий коэффициенты разложения Фурье по нечетным гармоникам. При  P < 0. задается на входе подпрограммы, при  P > 0. - вычисляется;
X - вещественный массив длины  N2, содержащий значения функции. При  P > 0. задается на входе подпрограммы, при  P < 0. - вычисляется.

Версии: нет

Вызываемые подпрограммы

FTF1C - вычисление дискретного или обратного дискретного преобразования Фурье комплексного ряда длины, равной степени двух, методом быстрого преобразования Фурье.

Замечания по использованию

  1. 

При вычислении коэффициентов Фурье (P > 0.) исходная информация (ряд значений функции) сохраняется.

  2. 

При вычислении значений функции (P < 0.) исходная информация (ряды коэффициентов Фурье) не сохраняется.

  3. 

Если на входе подпрограммы задано  P = 0., то никаких вычислений не производится.

  4.  При вычислении коэффициентов Фурье первый и последний коэффициенты разложения Фурье по нечетным гармоникам равны нулю.

Пример использования

Unit TFTFRR_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, FTFRR_p;

function TFTFRR: String; 

implementation

function TFTFRR: String;
var
N1,N2,_i :Integer;
P :Real;
X :Array [0..7] of Real;
const
A :Array [0..4] of Real = ( 0.0,0.0,1.0,0.0,0.0 );
B :Array [0..4] of Real = ( 0.0,1.0,0.0,0.0,0.0 );
begin
Result := '';
P := -1.0;
N1 := 5;
N2 := 8;
FTFRR(P,N1,N2,A,B,X);
Result := Result + #$0D#$0A;
for _i:=0 to 7 do
 begin
  Result := Result + Format('%20.16f ',[X[_i]]);
  if ( ((_i+1) mod 2)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TFTFRR',Result);  { вывод результатов в файл TFTFRR.res }
exit;
end;

end.

Результаты:

      X(1)  =   1.0,    X(2)  =   0.70710678, 
      X(3)  =   0.0,    X(4)  =   0.70710678, 
      X(5)  =   1.0,    X(6)  =  -0.70710678, 
      X(7)  =  -2.0,    X(8)  =  -0.70710678