Текст подпрограммы и версий
fta1c_c.zip , fta1p_c.zip
Тексты тестовых примеров
tfta1c_c.zip , tfta1p_c.zip

Подпрограмма:  fta1c_c

Назначение

Выполнение прямого и обратного быстрых дискретных преобразований Фурье одномерного массива комплексных чисел длины  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)