Документ взят из кэша поисковой машины. Адрес оригинального документа : http://num-anal.srcc.msu.ru/lib_na/cat/ft_htm_c/ftfrr_c.htm
Дата изменения: Wed Oct 29 17:04:40 2014
Дата индексирования: Sun Apr 10 02:28:50 2016
Кодировка: Windows-1251
БЧА НИВЦ МГУ. FTFRR_C. Ускоренные дискретные преобразования Фурье
Текст подпрограммы и версий
ftfrr_c.zip
Тексты тестовых примеров
tftfrr_c.zip

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

Назначение

Вычисление коэффициентов действительного преобразования Фурье или вычисление значений функции по ее действительным коэффициентам Фурье. Длина действительного ряда (преобразуемого или вычисляемого) должна быть целой степенью двух.

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

Пусть задан действительный pяд  X длины  2 * N. При вычислении действительного преобразования Фурье ряд  X преобразуется в два действительных ряда  A и  B длины  N + 1 по формулам

                              2N-1             
        A r  =  (1/N)     ∑    X n cos (π r n / N)  ,    r = 0, 1, ..., N
                               n=0
                              2N-1             
        B r  =  (1/N)     ∑    X n sin (π r n / N)  ,    r = 0, 1, ..., N
                               n=0 

при этом  B0 = BN = 0. . Для восстановления ряда  X по заданным действительным коэффициентам Фурье, элементы ряда  Х вычисляются по формуле

        X r  =  (A0 / 2) + ((- 1) r AN / 2) +
                       N-1             
                  +   ∑  (A n cos (π r n / N) + B n sin (π r n / N))  ,    
                       n=1
       r = 0, 1, ..., 2N - 1 

B вычислениях используется метод быстрого преобразования Фурье. При больших N число операций пропорционально  N * log2N. Данная подпрограмма подробно описана в [1, стp. 47] под именем  RFFT.

1.  В.А.Морозов, Н.Н.Кирсанова, А.Ф.Сысоев, Комплекс алгоритмов быстрого преобразования Фурье дискретных рядов. Сб. "Численный анализ на ФОРТРАНе". вып. 15. Изд - во МГУ, 1976 г.

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

    int ftfrr_c (real *p, integer *n1, integer *n2, real *a,
            real *b, real *x)

Параметры

p - заданная вещественная переменная, признак преобразования Фурье. Если на входе  p > 0., то вычисляются коэффициенты Фурье. Если на входе  p < 0., то вычисляются значения функции;
n1 - заданная длина массивов действительных коэффициентов Фурье,  n1 = n2 / 2 + 1 (тип: целый);
n2 - заданная длина массива значений функции, целая степень двух (тип: целый);
a - вещественный массив длины  n1, содержащий коэффициенты разложения Фурье по четным гармоникам. При  p < 0. задается на входе подпрограммы, при  p > 0. - вычисляется;
b - вещественный массив длины  n1, содержащий коэффициенты разложения Фурье по нечетным гармоникам. При  p < 0. задается на входе подпрограммы, при  p > 0. - вычисляется;
x - вещественный массив длины  n2, содержащий значения функции. При  p > 0. задается на входе подпрограммы, при  p < 0. - вычисляется.

Версии: нет

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

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

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

  1. 

При вычислении коэффициентов Фурье (p > 0.) исходная информация (ряд значений функции) сохраняется.

  2. 

При вычислении значений функции (p < 0.) исходная информация (ряды коэффициентов Фурье) не сохраняется.

  3. 

Если на входе подпрограммы задано  p = 0., то никаких вычислений не производится.

  4.  При вычислении коэффициентов Фурье первый и последний коэффициенты разложения Фурье по нечетным гармоникам равны нулю.

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

int main(void)
{
    /* Initialized data */
    static float a[5] = { 0.f,0.f,1.f,0.f,0.f };
    static float b[5] = { 0.f,1.f,0.f,0.f,0.f };

    /* Local variables */
    static float p, x[8];
    extern int ftfrr_c(float *, int *, int *, float *, float *, float *);
    static int n1, n2, i;

    p = -1.f;
    n1 = 5;
    n2 = 8;

    ftfrr_c(&p, &n1, &n2, a, b, x);

    for (i = 1; i <= 8; ++i) {
        printf("\n %16.7e \n",x[i-1]);
    }
    return 0;
} /* main */


Результаты:

      x(1)  =   1.0,    x(2)  =   0.70710678, 
      x(3)  =   0.0,    x(4)  =   0.70710678, 
      x(5)  =   1.0,    x(6)  =  -0.70710678, 
      x(7)  =  -2.0,    x(8)  =  -0.70710678