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

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

Назначение

Построение автокорреляционных и взаимных корреляционных функций двух случайных процессов по оценкам их спектров.

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

Пусть SXm, SYm, SXYm - заданные значения автоспектров и взаимного спектра двух случайных процессов  X, Y на частoтax  λm = m * Δλ, где  m = 0, 1, ..., NC - 1,  Δλ = 2π/(N * DT) - шаг сетки по частотной оси, N = 2 (NC - 1), DT - шаг сетки по оси времени. Доопределим (внутри подпрограммы) функции SXm, SYm, SXY1m = Re SXYm симметрично относительно точки  m = NC - 1, а функцию SXY2m = Im SXYm антисимметрично относительно  m = NC - 1. Применяя обратное дискретное преобразование Фурье к  N значениям спектров, получаем соответствующие оценки для автокорреляционных и взаимной корреляционной функций [1]:

                                   N-1
   CXs  =  1/(N*DT)    ∑    SXm exp( i λm ts)  =
                                  m=0
                                                                         N-1   
                                                   =  1/(N*DT)    ∑   SXm exp(2π i m s / N) ,
                                                                         m=0
                                   N-1
   CYs  =  1/(N*DT)    ∑    SYm exp( i λm ts)  =
                                  m=0
                                                                         N-1   
                                                   =  1/(N*DT)    ∑   SYm exp(2π i m s / N) ,
                                                                         m=0 
                                      N-1
   CXYs  =  1/(N*DT)    ∑    SXYm exp( i λm ts)  =
                                     m=0
                                                                         N-1   
                                                   =  1/(N*DT)    ∑   SXYm exp(2π i m s / N) ,
                                                                         m=0 

где   ts = S * DT,   s = 0, 1, ..., N - 1,   i = √ -1.

Построенные оценки CXs, CYs, являются вещественными функциями симметричными относительно центра S = N/2 = NC - 1. Эти оценки "циклические" [1, стp.357], поэтому рекомендуется применять данный метод для быстро затухающих корреляций.

Полное описание реализованного алгоритма содержится в статье [2] (подпрограмма CORREL).

1.  Дж.Бендат, А.Пирсол, Измерение и анализ случайных процессов, Изд - во "Мир", M., 1974.
2.  М.В.Арефьева, Корреляционный и спектральный анализ стационарных случайных процессов (часть 1), сб. "Численный анализ на ФОРТРАНе", вып.15, Изд - во МГУ, M., 1976.

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

    int rsc1r_c (real *sx, real *sy, real *sxy1, real *sxy2,
            integer *nc, real *dt, real *cx, real *cy, real *cxy, real *r__)

Параметры

sx - одномерный массив длины nc, содержащий заданные значения автоспектра процесса  X (тип: вещественный);
sy - одномерный массив длины nc, содержащий заданные значения автоспектра процесса  Y (тип: вещественный);
sxy1 - одномерный массив длины nc, содержащий заданные значения вещественной части взаимного спектра процессов  X, Y (тип: вещественный);
sxy2 - одномерный массив длины nc, содержащий заданные значения мнимой части взаимного спектра процессов  X, Y (тип: вещественный);
nc - количество заданных значений автоспектров и взаимного спектра процессов  X, Y,  nc = 2n + 1, где n ≥ 1 - целое число (тип: целый);
dt - заданный шаг сетки по оси времени, dt > 0 (тип: вещественный);
cx - одномерный массив длины nc, содержащий вычисленные значения автокорреляционной функции процесса  X (тип: вещественный);
cy - одномерный массив длины nc, содержащий вычисленные значения автокорреляционной функции процесса  Y (тип: вещественный);
cxy - одномерный массив длины 2 nc - 1, содержащий в первых (2 nc - 2) элементах вычисленные значения взаимной корреляционной функции процессов  X, Y (тип: вещественный);
r - одномерный массив длины 2 nc - 1, используемый в подпрограмме как рабочий (тип: вещественный).

Версии: нет

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

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

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

  1. 

C целью экономии числа используемых массивов результаты можно получать на месте исходной информации, а именно, допустимы совпадения параметров: cx = sx,  cy = sy.

  2.  B частных случаях применения подпрограммы возможны совмещения массивов: sx = sy = sxy1 = sxy2,  cx = cy - при построении автокорреляционной функции одного случайного процесса  X и sy = sxy1 = sxy2 - при построении только автокорреляцонных функций двух случайных процессов  X, Y без вычисления их взаимной корреляции; в этих случаях массив cxy используется в подпрограмме как рабочий.

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

int main(void)
{
    /* Initialized data */
    static float sx[3] = { 25.f,2.f,1.f };
    static float sy[3] = { 25.f,2.f,1.f };
    static float sxy1[3] = { 25.f,-2.f,-1.f };
    static float sxy2[3] = { 0.f,0.f,0.f };

    /* Local variables */
    extern int rsc1r_c(float *, float *, float *, float *, int *, float *,
                       float *, float *, float *, float *);
    static float r__[5];
    static int nc, i;
    static float dt, cx[3], cy[3], cxy[5];

    nc = 3;
    dt = 1.f;
    rsc1r_c(sx, sy, sxy1, sxy2, &nc, &dt, cx, cy, cxy, r__);

    printf("\n %16.7e %16.7e %16.7e \n", cx[0], cx[1], cx[2]);
    printf("\n %16.7e %16.7e %16.7e \n", cy[0], cy[1], cy[2]);
    for (i = 1; i <= 5; ++i) {
         printf("\n %16.7e \n", cxy[i - 1]);
    }
    return 0;
} /* main */


Результаты:

      cx    =  (7.5,  6.,  5.5)
      cy    =  (7.5,  6.,  5.5)
      cxy  =  (5.,  6.5,  7.,  6.5)