|
Текст подпрограммы и версий ftf1c_c.zip , ftf2c_c.zip |
Тексты тестовых примеров tftf1c_c.zip , tftf2c_c.zip |
Вычисление дискретного или обратного дискретного преобразования Фурье комплексного ряда длины, равной степени двух, методом быстрого преобразования Фурье.
Элементы Xr , r = 0, 1, ..., L - 1 преобразуемого комплексного ряда X связаны с элементами A (S) , S = 1, 2, ..., N задаваемого комплексного массива A соотношениями
Xr = A (IN + r * K) , r = 0, 1, ..., L - 1
Здесь натуральное K задает шаг выбора, IN определяет номер первого выбираемого элемента. При этом N = K*L, 1 ≤ IN ≤ K, а L должно быть степенью двух L = 2M, M - натуральное. Заметим, что если IN = 1, K = 1, то ряд X целиком заполняет задаваемый массив A. Ряд X преобразуется в комплексный ряд Y по формуле
L-1
Yr = ∑ Xm*W m r , r = 0, 1, ..., L-1 ,
m=0
где W = e- 2π i / L для дискретного преобразования Фурье (ДПФ) и W = e2π i / L для обратного дискретного преобразования Фурье (OДПФ).
Для вычислений используется метод быстрого преобразования Фурье. Подпрограмма реализует алгоритм Кули - Тьюки с двойной инверсией входных данных. При больших L число операций пропорционально L*log2 L. Данная подпрограмма подробно описана в [1, стp.34] под именем FFT.
| 1. | В.А.Морозов, Н.Н.Кирсанова, А.Ф.Сысоев, Комплекс алгоритмов быстрого преобразования Фурье дискретных рядов. Сб. "Численный анализ на ФОРТРАНе", вып. 15, Изд. МГУ, 1976. |
int ftf1c_c (real *are, real *aim, integer *n, integer *in,
integer *k, real *p)
Параметры
|
are - aim | вещественные одномерные массивы длины n, компоненты которых перед началом работы подпрограммы содержат сооответственно действительные и мнимые части элементов преобразуемого комплексного ряда x. По окончании работы подпрограммы содержат сооответственно действительные и мнимые части элементов преобразованного ряда y на тех же местах, что и преобразуемый ряд x; |
| n - | заданная длина массива a (тип: целый); |
| in - | заданный номеp первого элемента преобразуемого ряда в массиве a (тип: целый); |
| k - | заданный шаг выбора элементов преобразуемого ряда (тип: целый); |
| p - | заданная вещественная переменная, признак преобразования Фурье. При p > 0. выполняется дискретное преобразование Фурье, при p < 0. выполняется обратное дискретное преобразование Фурье. |
Версии
| ftf2c_c - | вычисление дискретного или обратного дискретного преобразования Фурье комплексного ряда длины, равной степени двух методом быстрого преобразования Фурье (в подпрограмме ftf2c_c преобразуемый ряд задается одним комплексным массивом). |
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
Длина преобразуемого ряда l = n / k должна быть целой степенью двух: n / k = 2m ≥ 4 ; 1 ≤ in ≤ k . | |
| 2. |
Если преобразуемый ряд целиком заполняет массив a, то in = k = 1. | |
| 3. |
Если вычислялось ДПФ, то на выходе p = π (= 3.1415...), а если OДПФ, то p = - π. | |
| 4. |
Если на выходе p = 0., то элементы ряда x располагаются в двоично - инверсном порядке, а преобразование Фурье не выполняется. | |
| 5. |
Значения элементов массива a, не используемых при вычислении коэффициентов Фурье, при работе подпрограммы сохраняются. | |
| 6. |
Заголовок подпрограммы ftf2c_c имеет следующий вид:
int ftf2c_c(complex *a, integer *n, integer *in, integer *k,
real *p)
где a - комплексный одномерный массив длины n.
Перед началом работы подпрограммы содержит элементы
преобразуемого ряда x. По окончании работы подпрограммы
содержит элементы преобразованного ряда y на тех же
местах, что и элементы преобразуемого ряда.
Остальные формальные параметры подпрограммы ftf2c_c
имеют тот же смысл, что и соответствующие параметры
подпрограммы ftf1c_c.
|
1.
int main(void)
{
/* Local variables */
extern int ftf1c_c(float *, float *, int *, int *, int *, float *);
static int i__, k, n;
static float p;
static int in;
static float aim[12], are[12];
for (i__ = 1; i__ <= 12; ++i__) {
are[i__ - 1] = (float) (i__ - 1);
/* l1: */
aim[i__ - 1] = 0.f;
}
n = 12;
in = 2;
k = 3;
p = 1.f;
ftf1c_c(are, aim, &n, &in, &k, &p);
for (i__ = 1; i__ <= 12; ++i__) {
printf("\n %16.7e %16.7e \n",are[i__-1], aim[i__-1]);
}
return 0;
} /* main */
Результаты:
p = 3.1415
are = (0., 22., 2., 3., - 6., 5., 6., - 6., 8., 9., - 6., 11.)
aim = (0., 0., 0., 0., 6., 0., 0., 0., 0., 0., - 6., 0.),
то есть преобразование Фурье ряда
1 + 0*i , 4 + 0*i , 7 + 0*i , 10 + 0*i ,
расположенного в массивах are и aim на местах с номерами 2,
5, 8 и 11 дает ряд 22 + 0*i , - 6 + 6*i ,
- 6 + 0*i , - 6 - 6*i , расположенный
в массивах are, aim на тех же местах.
2.
int main(void)
{
/* System generated locals */
int i__1, i__2;
/* Local variables */
extern int ftf2c_c(complex *, int *, int *, int *, float *);
static complex a[12];
static int i, k, n;
static float p;
static int in;
for (i = 1; i <= 12; ++i) {
/* L1: */
i__1 = i - 1;
i__2 = i - 1;
a[i__1].r = (float) i__2, a[i__1].i = 0.f;
}
n = 12;
in = 2;
k = 3;
p = 1.f;
ftf2c_c(a, &n, &in, &k, &p);
for (i = 1; i <= 12; ++i) {
printf("\n %16.7e %16.7e \n",a[i-1].r, a[i-1].i);
}
return 0;
} /* main */
Результаты:
p = 3.1415
a = ( 0. + 0.*i, 22. + 0.*i, 2. + 0.*i, 3. + 0.*i,
- 6. + 6.*i, 5. + 0.*i, 6. + 0.*i, - 6. + 0.*i,
8. + 0.*i, 9. + 0.*i, - 6. - 6.*i, 11. + 0.*i )