Текст подпрограммы и версий fta3r_p.zip , fta3e_p.zip |
Тексты тестовых примеров tfta3r_p.zip , tfta3e_p.zip |
Выполнение прямого и обратного быстрых преобразований Фурье одномерного массива вещественных чисел длины 2N, где N равняется целой степени двух.
Пусть известны значения f j = f ( t j ) вещественной функции f (t) на равномерной сетке t j = j Δt, j = 0, 1, 2, ..., 2N - 1 (где Δt - шаг сетки, а N равняется целой степени двух), заданные в виде одномерного массива вещественных чисел ARRAY длины 2N.
Подпрограмма FTA3R имеет два режима работы, задаваемых при обращении к ней значением параметра IREG. В первом режиме (IREG = 1) выполняется прямое быстрое дискретное преобразование Фурье заданного массива ARRAY, рассматриваемого как комплексный массив длины N, компоненты которого h j, тем самым, выражаются через компоненты f j, следующим образом:
h j = f 2j + i f 2j+1 , j = 0, 1, 2, ..., N-1 .
В результате этого прямого преобразования строится промежуточный комплексный массив длины N, компоненты которого Hn (n = 0, 1, 2, ..., N - 1) определяются формулой:
N-1 Hn = ∑ f 2k e2π i k n / N + k =0 N-1 + i ∑ f 2k+1 e2π i k n / N k =0
Затем на основе полученных компонент Hn вычисляются компоненты Fn (n = 0, 1, 2, ..., 2N - 1) искомого комплексного массива, являющегося прямым преобразованием исходного вещественного массива ARRAY.
Поскольку имеет место равенство F*2N - 1 = Fn (где символ * означает комплексное сопряжение), то достаточно хранить не все 2N компонент Fn, а только N + 1 компоненту F0, F1, F2, ..., FN. Поэтому результирующий комплексный массив подпрограммой FTA3R помещается на место исходного вещественного массива ARRAY, причем в элементах массива ARRAY (1) и ARRAY (2) располагаются значения F0 и FN соответственно, которые всегда являются вещественными.
Во втором режиме (IREG = - 1) выполняется обратное быстрое дискретное преобразование Фурье, состоящее в восстановлении из комплексных значений Fn (n = 0, 1, 2, ..., N), заданных в виде вещественного массива ARRAY, вещественных значений f j (j = 0, 1, 2, ..., 2N - 1). В этом случае элементы массива ARRAY должны задаваться следующим образом: ARRAY (1) = F0, ARRAY (2) = FN, ARRAY (3) = Re (F1), ARRAY (4) = Im (F1), ..., ARRAY (2N - 1) = Re (FN - 1), ARRAY (2N) = Im (FN - 1).
Восстановленные значения f j помещаются в массиве ARRAY.
Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков. Численные методы. Изд - во "Наука", 1987.
procedure FTA3R(var ARRAY_ :Array of Real; var N :Integer; IREG :Integer);
Параметры
ARRAY_ - | вещественный одномерный массив длины 2N, содержащий на входе значения f j (IREG = 1) или Fn (IREG = - 1), а на выходе значения Fn (IREG = 1) или f j (IREG = - 1); |
N - | половина длины массива ARRAY_, равная целой степени двух (тип: целый); |
IREG - | задает режим работы подпрограммы (тип: целый); при этом: |
IREG= 1 - | когда выполняется прямое преобразование; |
IREG= -1 - | когда выполняется обратное преобразование. |
Версии
FTA3E - | выполнение прямого и обратного быстрых дискретных преобразований Фурье одномерного массива вещественных чисел длины 2N, где N является целой степени двух, в режиме расширенной (Extended) точности; при этом параметр ARRAY_ должен иметь тип Extended. |
Вызываемые подпрограммы
FTA1C - FTA1Z | выполнение прямого и обратного быстрых дискретных преобразований Фурье одномерного массива комплексных чисел длины N, равной целой степени двух, в режимах одинарной и расширенной (Extended) точности; используются в подпрограммах FTA3R и FTA3E соответственно. |
Замечания по использованию
В подпрограммах FTA3R и FTA3E проверка того, что значение N должно быть целой степенью двух, не производится. |
Unit TFTA3R_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, FTA3R_p; function TFTA3R: String; implementation function TFTA3R: String; var N,_i :Integer; ARRАУ_ :Array [0..3] of Real; begin Result := ''; N := 2; ARRAY_[0] := 1.0; ARRAY_[1] := 4.0; ARRАУ_[2] := 7.0; ARRAY_[3] := 10.0; FTA3R(ARRAY_,N,1); Result := Result + #$0D#$0A; for _i:=0 to 3 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('TFTA3R',Result); { вывод результатов в файл TFTA3R.res } exit; end; end. Результаты: ARRAY_(1) = 22.0 , ARRAY_(2) = - 6.0 , ARRAY_(3) = - 6.0 , ARRAY_(4) = - 6.0