Текст подпрограммы и версий fta1c_c.zip , fta1p_c.zip |
Тексты тестовых примеров tfta1c_c.zip , tfta1p_c.zip |
Выполнение прямого и обратного быстрых дискретных преобразований Фурье одномерного массива комплексных чисел длины n, равной целой степени двух.
Пусть известны значения hk = h (tk) комплексно - значной функции h (t) на равномерной сетке tk = k δt, k = 0, 1, 2, ..., N - 1 (где δt - шаг сетки, а N равняется целой степени двух), заданные в виде одномерного массива комплексных чисел ARRAY длины N.
Подпрограмма fta1c_c имеет два режима работы, задаваемых при обращении к ней значением параметра IREG. В первом режиме (IREG = 1) выполняется прямое быстрое дискретное преобразование Фурье заданного массива ARRAY, состоящее в получении N комплексных чисел Hn (n = 0, 1, 2, ..., N - 1) из N комплексных чисел hk (k = 0, 1, 2, ..., N - 1), являющихся элементами этого массива, по формуле:
N-1 Hn = ∑ hk e 2π i k n / N k =0
Вычисленные значения Hn располагаются в том же массиве ARRAY. Во втором режиме (IREG = - 1) выполняется обратное быстрое дискретное преобразование Фурье, состоящее в восстановлении из значений Hn (n = 0, 1, 2, ..., N - 1), заданных в виде одномерного массива комплексных чисел ARRAY длины N, значений hk (k = 0, 1, 2, ..., N - 1) по формуле:
N-1 hk = 1/N ∑ Hn e -2π i k n / N n =0
Вычисленные значения hk располагаются в том же массиве ARRAY.
Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков. Численные методы. Изд - во "Наука", 1987.
int fta1c_c (real *array, integer *n, integer *ireg)
Параметры
array - | комплексный одномерный массив длины n, содержащий на входе значения hk (ireg = 1) или hn (ireg = - 1), а на выходе значения hn (ireg = 1) или hk (ireg = - 1); |
n - | длина массива array, равная целой степени двух (тип: целый); |
ireg - | задает режим работы подпрограммы (тип: целый); при этом: |
ireg= 1 - | когда выполняется прямое преобразование; |
ireg= -1 - | когда выполняется обратное преобразование |
Версии
fta1p_c - | выполнение прямого и обратного быстрых преобразований Фурье одномерного массива комплексных чисел длины n, равной целой степени двух, в режиме удвоенной точности; при этом параметр array должен иметь тип double и иметь длину, равную 2n (см.также "Замечания по использованию") |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограммах fta1c_c и fta1p_c проверка того, что значение n должно быть целой степенью двух, не производится | |
2. |
При обращении к подпрограмме fta1c_c массив array можно задать вещественным. В этом случае его длина должна равняться 2n, а его элементы должны формироваться по следующему правилу: array( i ) = re (h i) , если ireg= 1 array( i ) = re (h i) , если ireg= - 1 array(i+1) = im (h i) , если ireg= 1 array(i+1) = im (h i) , если ireg= - 1 Здесь re означает вещественную часть комплексного числа, im - мнимую часть, i = 1, 2, ..., 2n - 1; i = 0, 1, ..., n - 1. | |
3. |
При обращении к подпрограмме fta1p_c массив array должен быть вещественным удвоенной точности длины 2n. Правила задания его содержимого такие же, как и в замечании 2. Если это допускает входной язык компилятора, массив array может быть описан как double complex длины n. | |
4. | Для того чтобы избежать вычислений с использованием комплексной арифметики, подпрограммы fta1c_c и fta1p_c рассматривают массив array всегда не как комплексный, а как вещественный длины 2n одинарной или удвоенной точности соответственно. |
int main(void) { /* Local variables */ extern int fta1c_c(complex *, integer *, integer *); static complex a[4]; a[0].r = 1.f, a[0].i = 0.f; a[1].r = 4.f, a[1].i = 0.f; a[2].r = 7.f, a[2].i = 0.f; a[3].r = 10.f, a[3].i = 0.f; fta1c_c(a, &c__4, &c__1); printf("\n %16.7e %16.7e \n %16.7e %16.7e \n", a[0].r,a[0].i,a[1].r,a[1].i); printf("\n %16.7e %16.7e \n %16.7e %16.7e \n", a[2].r,a[2].i,a[3].r,a[3].i); return 0; } /* main */ Результаты: a(1) = ( 22.0, 0.0), a(2) = (- 6.0, - 6.0), a(3) = (- 6.0, 0.0), a(4) = (- 6.0, 6.0)