Текст подпрограммы и версий
fta4r_c.zip , fta4d_c.zip
Тексты тестовых примеров
tfta4r_c.zip , tfta4d_c.zip

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

Назначение

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

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

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

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

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

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

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

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

                             N-1
                  Rk  =   ∑    yj cos ( 2π j k / N )  =  F2k+1 - F2k-1
                             j =0 
                            N-1
                  Ik   =   ∑    yj sin ( 2π j k / N )  =  F2k
                            j =0 

Таким образом, компоненты искомого массива определяются из соотношений:

                             N-1
                  F1  =   ∑    f j sin ( j π / N )
                             j =0 

                  F2k =  Ik ,    F2k+1  =  F2k-1 + Rk ,      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. Используется та же схема счета, что и в первом режиме, только на последнем этапе результирующий массив ARRAY умножается на множитель 2/N.

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

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

    int fta4r_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 - когда выполняется обратное преобразование.

Версии

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

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

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

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

 

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

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

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

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 fta4r_c(float *, int *, int *);
    static int n;
    static int c__1 = 1;
    static int c_n1 = -1;

    n = 8;
    fta4r_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]);

    fta4r_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 = (0.0, 25.1367, - 9.65685, 7.48303, - 4.0, 3.34089,  
                         - 1.65685, 0.994563) 

   б) в случае обратного преобразования:
      array = (0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0)