Текст подпрограммы и версий fta4r_p.zip , fta4e_p.zip |
Тексты тестовых примеров tfta4r_p.zip , tfta4e_p.zip |
Выполнение прямого и обратного быстрых дискретных синус - преобразований Фурье одномерного массива вещественных чисел длины 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)