Текст подпрограммы и версий ftfgc_c.zip |
Тексты тестовых примеров tftfgc_c.zip |
Вычисление всех значений прямого или обратного дискретного преобразования Фурье комплексного ряда длины k * l, l = 2 j, только l последовательно задаваемых значений которого могут быть отличны от нуля, с использованием метода быстрого преобразования Фурье.
Пусть комплексный ряд An, n = 0, 1, ..., N - 1, где N = K * L, L = 2 J, J - натуральное, такое, что только L его последовательных элементов AML+S, S = 0, 1, ..., L - 1, могут быть отличны от нуля (M - заданная константа, 0 ≤ M ≤ K - 1).
B качестве исходной информации задается комплексный ряд А длины L, As = AML+s, s = 0, 1, ..., L - 1, полностью определяющий преобразуемый ряд A. Подпрограмма вычисляет значения
L-1 N-1 X r = ∑ An W r (ML+n) = ∑ A n W r n , n=0 n=0 r = 0, 1, ..., N - 1 ,
где W = e-2π i / N для дискретного преобразования Фурье и W = e2π i / N для обратного дискретного преобразования Фурье. B вычислениях используется метод быстрого преобразования Фурье.
При больших N число операций пропорционально N * (1 + log2L). Данная подпрограмма подробно описана в [1, стp. 42] под именем FFTLN. Подпрограмма может быть использована для вычисления N значений функции по L значениям коэффициентов Фурье.
1. | В.А.Морозов, Н.Н.Кирсанова, А.Ф.Сысоев, Комплекс алгоритмов быстрого преобразования Фурье дискретных рядов. Сб. "Численный анализ на ФОРТРАНе", вып. 15, Изд. МГУ, 1976. |
int ftfgc_c (real *are, real *aim, integer *n, integer *l, integer *m, real *p, real *xre, real *xim)
Параметры
are - aim | одномерные вещественные массивы длины l, компоненты которых являются соответственно действительными и мнимыми частями элементов отрезка длины l, содержащего все отличные от нуля члены преобразуемого ряда a; |
n - | заданная длина преобразуемого ряда a (тип: целый); |
l - | заданная длина рассматриваемого отрезка отличных от нуля элементов преобразуемого ряда, целая степень двух, делитель n (тип: целый); |
m - | заданный параметр, определяющий номеp первого элемента рассматриваемого отрезка преобразуемого ряда. Этот номеp будет pавен m * l (тип: целый); |
p - | заданная вещественная переменная, признак преобразования Фурье. При p > 0. выполняется дискретное преобразование Фурье, при p < 0. выполняется обратное дискретное преобразование Фурье; |
xre - xim | одномерные вещественные массивы длины n, содержащие вычисленные соответственно действительные и мнимые части элементов преобразованного ряда. |
Версии: нет
Вызываемые подпрограммы
ftf1c_c - | вычисление дискретного или обратного дискретного преобразования Фурье комплексного ряда длины равной целой степени двух, методом быстрого преобразования Фурье. |
Замечания по использованию
1. |
Количество l элементов преобразуемого ряда, учитываемых при вычислении коэффициентов Фурье, должно быть целой степенью двух l = 2 j , j - целое , l ≥ 4 . Общая длина преобразуемого ряда должна быть кpатна l n = k * l , k ≥ 2 , 0 ≤ m ≤ k - 1 | |
2. |
Если при обращении к подпрограмме задать p = 0. , то pезультат ее работы не определен. | |
3. | Исходная информация может быть расположена на месте первых l компонент массива, в котоpом получается pезультат (вместо массивов are, aim можно использовать первые l компонент массивов xre, xim). Если в качестве are, aim, xre, xim используются разные массивы, то исходная информация, расположенная в массивах are, aim, сохраняется. |
int main(void) { /* Local variables */ static int i__, l, m, n; static float p; extern int ftfgc_c(float *, float *, int *, int *, int *, float *, float *, float *); static float aim[4], are[4], xim[12], xre[12]; for (i__ = 1; i__ <= 4; ++i__) { are[i__ - 1] = i__ - 1.f; /* l1: */ aim[i__ - 1] = 0.f; } n = 12; l = 4; m = 0; p = 1.f; ftfgc_c(are, aim, &n, &l, &m, &p, xre, xim); for (i__ = 1; i__ <= 4; ++i__) { printf("\n %16.7e %16.7e \n",are[i__-1], aim[i__-1]); } for (i__ = 1; i__ <= 12; ++i__) { printf("\n %16.7e %16.7e \n",xre[i__-1], xim[i__-1]); } return 0; } /* main */ Результаты: xre = (6., 1.866025, -3.5, -2., 1.5, 0.1339746, -2., 0.1339746, 1.5, -2., -3.5, 1.866025) xim(1) = 0., xim(2) = -5.232051, xim(3) = -2.598076, xim(4) = 2., xim(5) = 0.866025, xim(6) = -1.767949, xim(7) = 0., xim(8) = 1.767949, xim(9) = -0.866025, xim(10) = -2., xim(11) = 2.598076, xim(12) = 5.232051