Текст подпрограммы и версий
fta5r_c.zip , fta5d_c.zip
Тексты тестовых примеров
tfta5r_c.zip , tfta5d_c.zip

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

Назначение

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

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

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

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

                              N-1
                  Fk   =   ∑     f j cos(π j k / N) .
                              j =1 

В этом режиме подпрограмма fta5r_c из исходного массива ARRAY строит вспомогательный вещественный массив  Y длины  N, компоненты которого  yj ( j = 0, 1, 2, .., N - 1) определяются формулами:

             y 0  =  f 0 
             y j  =  0.5 ( f j + f N-j ) - sin( j π / N ) ( f j - f N-j ) ,     j > 0 . 

В результате применения к полученному массиву  Y подпрограммы fta3r_c строится комплексный массив длины N/2 с вещественными Rk и мнимыми  Ik (k = 0, 1, 2, ..., N/2 - 1) частями. Компоненты искомого массива определяются через Rk и  Ik следующим образом:

                          N-1
               F1   =   ∑    f j cos ( j π / N )
                          j= 0 
               F2k  =  Rk ,    F2k+1  =  F2k-1 + Ik ,    k = 0, 1, 2, ..., N/2-1 

Вычисленные значения  Fk располагаются в том же массиве ARRAY.

Во втором режиме ( IREG = - 1) выполняется обратное быстрое дискретное косинус - преобразование Фурье, состоящее в восстановлении из значений  Fk (k = 0, 1, 2, ..., N - 1), заданных в виде одномерного массива вещественных чисел ARRAY длины  N, значений  f j ( j = 0, 1, 2, ..., N - 1), которые располагаются в том же массиве array_c. Для этого строится массив  f m ( m = 0, 1, 2, ..., N - 1) по следующей формуле:

                          N-1
               f m  =   ∑    Fk cos ( π k m / N ) .
                          k =0 
   Между значениями  f m и  f m существуют соотношения:

                f 0   =   N f0  +  ∑ f j
                                        по нечетным  j

(1)            f m  =  (N/2) f m  +  ∑ f j    ,            m - нечетные
                                            по четным  j

                f m  =  (N/2) f m  +  ∑ f j    ,             m - четные ,       m ≠ 0
                                            по нечетным  j  

Неизвестные суммы в правых частях этих соотношений определяются следующим образом:

                                                                N-1
                C1 ≡  ∑  f m =  (N/2) ( f 0  +     ∑    f j )
                                                                j =0
                      по четным  m

                                                      N-1
                C2 ≡  ∑  f m =  (N/2)     ∑    f j
                                                      j =0
                      по нечетным  m

  Отсюда следует, что

                (N/2) f 0  =  C1 - C2 .
  Поэтому

                  ∑ f j  =   f 0  - 2 ( C1 - C2 )
          по нечетным  j

                  ∑ f j  =   (2/N) C2 - ∑ f j
          по четным  j             по нечетным  j 

Зная эти суммы, восстанавливаемые значения  f j вычисляются из соотношений (1).

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

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

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

Параметры

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

Версии

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

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

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

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

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

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

int main(void)
{
    /* Initialized data */
    static float array[8] = { 1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f };

    /* Local variables */
    extern int fta5r_c(float *, int *, int *);
    static int n;
    static int c__1 = 1;
    static int c_n1 = -1;

    n = 8;
    fta5r_c(array, &n, &c__1);

    printf("\n  %15.6e %15.6e %15.6e %15.6e ",
           array[0],array[1],array[2],array[3]);
    printf("\n  %15.6e %15.6e %15.6e %15.6e \n",
           array[4],array[5],array[6],array[7]);

    fta5r_c(array, &n, &c_n1);

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


Результаты: 

   а) в случае прямого преобразования:
      array = (36, - 8.13707, - 4, 3.38009, - 4, 4.27677, - 4, 4.48022) 

   б) в случае обратного преобразования:
      array = (1, 2, 3, 4, 5, 6, 7, 8)