Текст подпрограммы и версий
fta3r_c.zip , fta3d_c.zip
Тексты тестовых примеров
tfta3r_c.zip , tfta3d_c.zip

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

Назначение

Выполнение прямого и обратного быстрых преобразований Фурье одномерного массива вещественных чисел длины 2n, где  n равняется целой степени двух.

Математическое описание

Пусть известны значения  f j = f ( t j ) вещественной функции  f (t) на равномерной сетке  t j = j δt,  j = 0, 1, 2, ..., 2N - 1 (где  δt - шаг сетки, а  N равняется целой степени двух), заданные в виде одномерного массива вещественных чисел ARRAY длины 2N.

Подпрограмма fta3r_c имеет два режима работы, задаваемых при обращении к ней значением параметра IREG. В первом режиме (IREG = 1) выполняется прямое быстрое дискретное преобразование Фурье заданного массива ARRAY, рассматриваемого как комплексный массив длины  N, компоненты которого  h j, тем самым, выражаются через компоненты  f j, следующим образом:

                       h j  =  f 2j  +  i f 2j+1 ,    j = 0, 1, 2, ..., N-1  . 

В результате этого прямого преобразования строится промежуточный комплексный массив длины  N, компоненты которого  Hn (n = 0, 1, 2, ..., N - 1) определяются формулой:

                             N-1
                  Hn  =   ∑    f 2k  e2π i k n / N    +
                             k =0
                                                                      N-1
                                                              +   i   ∑    f 2k+1 e2π i k n / N
                                                                      k =0        

Затем на основе полученных компонент  Hn вычисляются компоненты  Fn (n = 0, 1, 2, ..., 2N - 1) искомого комплексного массива, являющегося прямым преобразованием исходного вещественного массива ARRAY.

Поскольку имеет место равенство  F*2N - 1 = Fn (где символ  * означает комплексное сопряжение), то достаточно хранить не все 2N компонент  Fn, а только N + 1 компоненту  F0, F1, F2, ..., FN. Поэтому результирующий комплексный массив подпрограммой fta3r_c помещается на место исходного вещественного массива ARRAY, причем в элементах массива ARRAY (1) и ARRAY (2) располагаются значения  F0 и FN соответственно, которые всегда являются вещественными.

Во втором режиме (IREG = - 1) выполняется обратное быстрое дискретное преобразование Фурье, состоящее в восстановлении из комплексных значений  Fn (n = 0, 1, 2, ..., N), заданных в виде вещественного массива ARRAY, вещественных значений  f j (j = 0, 1, 2, ..., 2N - 1). В этом случае элементы массива ARRAY должны задаваться следующим образом: ARRAY (1) = F0, ARRAY (2) = FN, ARRAY (3) = Re (F1), ARRAY (4) = Im (F1),  ..., ARRAY (2N - 1) = Re (FN - 1), ARRAY (2N) = Im (FN - 1).

Восстановленные значения  f j помещаются в массиве ARRAY.

Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков. Численные методы. Изд - во "Наука", 1987.

Использование

    int fta3r_c (real *array, integer *n, integer *ireg)

Параметры

array - вещественный одномерный массив длины 2n, содержащий на входе значения  f j (ireg = 1) или  fn (ireg = - 1), а на выходе значения  fn (ireg = 1) или  f j (ireg = - 1);
n - половина длины массива array, равная целой степени двух (тип: целый);
ireg - задает режим работы подпрограммы (тип: целый); при этом:
ireg=  1 - когда выполняется прямое преобразование;
ireg= -1 - когда выполняется обратное преобразование.

Версии

fta3d_c - выполнение прямого и обратного быстрых дискретных преобразований Фурье одномерного массива вещественных чисел длины 2n, где  n является целой степени двух, в режиме удвоенной точности; при этом параметр array должен иметь тип double.

Вызываемые подпрограммы

       fta1c_c -
       fta1p_c  
выполнение прямого и обратного быстрых дискретных преобразований Фурье одномерного массива комплексных чисел длины  n, равной целой степени двух, в режимах одинарной и удвоенной точности; используются в подпрограммах fta3r_c и fta3d_c соответственно.

Замечания по использованию

  В подпрограммах fta3r_c и fta3d_c проверка того, что значение  n должно быть целой степенью двух, не производится.

Пример использования

int main(void)
{
    /* Local variables */
    extern int fta3r_c(float *, int *, int *);
    static int n;
    static float array[4];
    static int c1 = 1;

    n = 2;
    array[0] = 1.f;
    array[1] = 4.f;
    array[2] = 7.f;
    array[3] = 10.f;
    fta3r_c(array, &n, &c1);

    printf("\n  %15.6e %15.6e %15.6e %15.6e \n",
           array[0],array[1],array[2],array[3]);
    return 0;
} /* main */


Результаты:

        array(1) = 22.0 ,   array(2) = - 6.0 , 
        array(3) = - 6.0 ,   array(4) = - 6.0