|
Текст подпрограммы и версий ftfsr_p.zip |
Тексты тестовых примеров tftfsr_p.zip |
Вычисление коэффициентов Фурье по системе нечетных тригонометрических функций вещественного ряда длины, равной степени двух, с использованием метода быстрого преобразования Фурье.
Пусть длина N преобразуемого вещественного ряда X является целой степенью двух: N = 2 M.
Ряд X преобразуется в вещественный ряд A по формуле (прямое преобразование):
N-1
A r = ∑ X n * sin (π r * n / N) ,
n=0
r = 0, ..., N - 1
Tак как система функций sin (π r x), r = 0, ..., N - 1 ортогональна на сетке Xn = n / N, но не ортонормирована, обратное преобразование совпадает с прямым с точностью до постоянного множителя N / 2. B вычислениях используется метод быстрого преобразования Фурье [1].
Ряд коэффициентов Фурье A получается на месте исходного ряда Х без дополнительной рабочей памяти.
При больших N число операций пропорционально N * log2N.
| 1. | В.А.Морозов, Н.Н.Кирсанова, А.Ф.Сысоев. Комплекс алгоритмов быстрого преобразования Фурье дискретных рядов. Сб. "Численный анализ на ФОРТРАНе", вып. 15, Изд - во МГУ, 1976 г. |
procedure FTFSR(var X :Array of Real; N :Integer);
Параметры
| X - | вещественный вектоp длины N; перед началом работы подпрограммы содержит преобразуемый ряд X. По окончании работы подпрограммы содержит преобразованный ряд A; |
| N - | заданная длина вектоpа X (тип: целый). |
Версии: нет
Вызываемые подпрограммы
| FTF1C - | вычисление дискретного или обратного дискретного преобразования Фурье комплексного ряда длины, равной степени двух, методом быстрого преообразования Фурье. |
Замечания по использованию
| 1. |
Длина N преобразуемого ряда должна быть целой степенью двух: N = 2 M, M - натуральное. B противном случае результат работы подпрограммы не определен. | |
| 2. | Первая компонента преобразованного ряда A всегда pавна нулю, т.е. по окончании работы подпрограммы X (1) = 0 . |
Unit TFTFSR_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, FTFSR_p;
function TFTFSR: String;
implementation
function TFTFSR: String;
var
_i :Integer;
const
X :Array [0..7] of Real = ( 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0 );
begin
Result := '';
FTFSR(X,8);
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('TFTFSR',Result); { вывод результатов в файл TFTFSR.res }
exit;
end;
end.
Результаты:
X = (0., 25.136697, -9.656854, 7.4830288, -3.999999,
3.3408931895, -1.656854, 0.994561837)