Текст подпрограммы и версий
fta4r_p.zip , fta4e_p.zip
Тексты тестовых примеров
tfta4r_p.zip , tfta4e_p.zip

Подпрограмма:  FTA4R (модуль FTA4R_p)

Назначение

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

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

Пусть известны значения  f j = f ( t j ) вещественной функции  f (t) на равномерной сетке  t j = j Δt,  j = 0, 1, 2, ..., N - 1 (где  Δt - шаг сетки, а  N равняется целой степени двух), заданные в виде одномерного массива вещественных чисел ARRAY длины  N.

Подпрограмма FTA4R имеет два режима работы, задаваемых при обращении к ней значением параметра IREG. В первом режиме (IREG = 1)выполняется прямое быстрое дискретное синус - преобразование Фурье заданного массива ARRAY, состоящее в получении  N вещественных чисел  Fk (k = 0, 1, 2, ..., N - 1) из чисел  f j по формуле:

                              N-1
                  Fk   =   ∑    f j sin ( π j k / N ) .
                              j =1 

В этом режиме подпрограмма FTA4R из исходного массива ARRAY строит вспомогательный вещественный массив  Y длины  N, компоненты которого  yj ( j = 0, 1, 2, .., N - 1) определяются формулами:

                y0  =  0 
                yj  =  sin ( j π / N ) ( f j + f N-j ) + 0.5 ( f j - f N-j ) ,    j > 0 . 

В результате применения к полученному массиву  Y подпрограммы FTA3R строится комплексный массив длины N/2, вещественные Rk и мнимые  Ik (k = 0, 1, 2, ..., N/2 - 1) части компонент которого выражаются через компоненты искомого массива следующим образом:

                             N-1
                  Rk  =   ∑    yj cos ( 2π j k / N )  =  F2k+1 - F2k-1
                             j =0 
                            N-1
                  Ik   =   ∑    yj sin ( 2π j k / N )  =  F2k
                            j =0 

Таким образом, компоненты искомого массива определяются из соотношений:

                             N-1
                  F1  =   ∑    f j sin ( j π / N )
                             j =0 

                  F2k =  Ik ,    F2k+1  =  F2k-1 + Rk ,      k = 0, 1, 2, ..., N/2-1 

Вычисленные значения  Fk располагаются в том же массиве ARRAY.

Во втором режиме (IREG = - 1) выполняется обратное быстрое дискретное синус - преобразование Фурье, состоящее в восстановлении из значений  Fk (k = 0, 1, 2, ..., N - 1), заданных в виде одномерного массива вещественных чисел ARRAY длины  N, значений  f j ( j = 0, 1, 2, ..., N - 1), которые располагаются в том же массиве ARRAY. Используется та же схема счета, что и в первом режиме, только на последнем этапе результирующий массив ARRAY умножается на множитель 2/N.

Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков. Численные методы. Изд - во "Наука", 1987.

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

procedure FTA4R(var ARRAY_ :Array of Real; N :Integer; IREG :Integer); 

Параметры

ARRAY_ - вещественный одномерный массив длины  N, содержащий в случае прямого преобразования (IREG = 1) на входе значения  f j и на выходе значения  Fk, а в случае обратного преобразования (IREG = - 1) - на входе значения  Fk и на выходе значения  f j;
N - длина массива ARRAY_, равная целой степени двух (тип: целый)
IREG - задает режим работы подпрограммы (тип: целый); при этом:
IREG=  1 - когда выполняется прямое преобразование;
IREG= -1 - когда выполняется обратное преобразование.

Версии

FTA4E - выполнение прямого и обратного быстрых дискретных синус - преобразований Фурье одномерного массива вещественных чисел длины  N, равной степени двух, в режиме расширенной (Extended) точности; при этом параметр ARRAY_ должен иметь тип Extended.

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

       FTA3R -
       FTA3E  
выполнение прямого и обратного быстрых дискретных преобразований Фурье одномерного массива вещественных чисел длины 2N, где  N равняется целой степени двух, в режимах одинарной и расширенной (Extended) точности; используются в подпрограммах FTA4R и FTA4E соответственно.

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

 

В подпрограммах FTA4R и FTA4E проверка того, что значение  N должно быть целой степенью двух, не производится.

В этих подпрограммах при обратном преобразовании (IREG = - 1) элемент массива ARRAY_ (1) всегда равен нулю, т.е. восстанавливаются все значения  f j из  Fk, кроме  f 0, что вытекает из сущности синус - преобразования.

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

Unit tfta4r_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, FTA4R_p;

function tfta4r: String; 

implementation

function tfta4r: String;
var
N,_i :Integer;
const
ARRAY_ :Array [0..7] of Real = ( 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0 );
begin
Result := '';
N := 8;
FTA4R(ARRAY_,N,1);
Result := Result + #$0D#$0A;
for _i:=0 to 7 do
 begin
  Result := Result + Format('%20.16f ',[ARRAY_[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
FTA4R(ARRAY_,N,-1);
Result := Result + #$0D#$0A;
for _i:=0 to 7 do
 begin
  Result := Result + Format('%20.16f ',[ARRAY_[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('tfta4r',Result);  { вывод результатов в файл tfta4r.res }
exit;
end;

end.


Результаты: 

   а) в случае прямого преобразования:
      ARRAY_ = (0.0, 25.1367, - 9.65685, 7.48303, - 4.0, 3.34089,  
                         - 1.65685, 0.994563) 

   б) в случае обратного преобразования:
      ARRAY_ = (0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0)