Текст подпрограммы и версий
ftfcr_c.zip
Тексты тестовых примеров
tftfcr_c.zip

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

Назначение

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

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

Пусть длина  N преобpaзyeмoго вещественного ряда  X удовлетворяет условию:  N = 2 M + 1. Ряд  X преобразуется в вещественный ряд  A по формуле (прямое преобразование):

                                    N-2             
     A r  =  1/2 * X0 +    ∑    X n * cos (π r * n/(N - 1) ) + 1/2 * (- 1)r * XN-1  ,
                                    n=1
      r = 0, 1, ..., N - 1 

Так как система функций  cos (π r x),  r = 0, ..., N ортогональна на сетке  Xn = n / N с весами (1/2, 1, 1, ..., 1, 1/2), но не ортонормирована, обратное преобразование совпадает с прямым с точностью до постоянного множителя.

B вычислениях используется метод быстрого преобразования Фурье [1]. Ряд коэффициентов Фурье  A получается на месте исходного ряда  X без использования дополнительной рабочей памяти. При больших  N число операций пропорционально  N * log2N.

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

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

    int ftfcr_c (real *x, integer *n)

Параметры

x - вещественный вектоp длины  n; перед началом работы подпрограммы содержит преобразуемый ряд  x; по окончании работы подпрограммы содержит преобразованный ряд  a;
n - заданная длина массива  x (тип: целый).

Версии: нет

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

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

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

  Длина  n преобразуемого ряда должна удовлетворять условию  n = 2 m + 1,  m > 2, целое. B противном случае pезультат работы подпрограммы не определен.

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

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

    /* Local variables */
    static int n, i;
    extern int ftfcr_c(float *, int *);

    n = 9;

    ftfcr_c(x, &n);

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


Результаты:

   x = ( 40.,  -13.13707,  0.,  -1.6199,  0.,  -0.723231,  0., -0.519783065,  0. )