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

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

Назначение

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

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

Пусть заданы реализации двух вещественных, стационарных, центрированных случайных процессов Xq, Yq,  q = 0, 1, ..., M - 1 достаточно большой длины  M на сетке по оси времени  tq = q * DT с шагом DT > 0.

Разобьем каждую реализацию на  K коротких отрезков, возможно перекрывающихся, длины  N: 1 ≤ N ≤ M так, что начальные точки двух соседних отрезков отстоят друг от друга на расстоянии  L: 1 ≤ L ≤ N (т.е. перекрывание коротких отрезков происходит в N - L точках), а значение параметра K ≥ 1 выбирается из соотношения: N + (K - 1) L = M1 ≤ M.
Вообще говоря, не требуется, чтобы конец последнего короткого отрезка длины N совпадал с концами исходных рядов.
Таким образом, получим отрезки временны'х рядов вида:

     Xs( J )  =  Xs + ( J-1) L ,     Ys( J )  =  Ys + ( J-1) L ,

        s = 0, 1, ..., N - 1 ,    J = 1, 2, ..., K ,

 где  J - номеp короткого отрезка. 

Обозначим через Am( J ), Bm( J ),  m = 0, 1, ..., N - 1 их соответствующие дискретные преобразования Фурье, которые вычисляются по формулам:

                        N-1
      Am( J )   =    ∑   Xs( J ) exp(- i λm ts )   =
                        s=0
                                                                   N-1   
                                                               =   ∑  Xs( J ) exp(- 2π i m s / N) ,
                                                                   s=0
                        N-1
      Bm( J )   =    ∑   Ys( J ) exp(- i λm ts )   =
                        s=0
                                                                   N-1   
                                                               =   ∑  Ys( J ) exp(- 2π i m s / N) ,
                                                                   s=0 

где   λm = m * Δλ,   m = 0, 1, ..., N - 1,   Δλ = 2π/(N * DT),   i = √-1.

B качестве оценок для автоспектров SX, SY и взаимного спектра SXY исходных случайных процессов берутся периодограммы, усредненные по  K указанным коротким отрезкам, а именно, величины:

                            K
      SXm = 1/ K   ∑   (DT / N)  | Am( J ) | 2  ,
                           J=1
                            K
      SYm = 1/ K   ∑   (DT / N)  | Bm( J ) | 2  ,            m = 0, 1, ..., N - 1  , 
                           J=1
                               K
      SXYm = 1/ K    ∑  (DT / N)  Am* ( J ) Bm( J )  , 
                              J=1 

где * - знак комплексного сопряжения. При этом функции SХm, SYm и SXY1m = Re SXYm симметричны относительно точки  m = N/2, а функция SXY2m = Im SXYm  антисимметрична относительно  m = N/2.

Данный метод модифицированных периодограмм [1] дает уменьшение дисперсии спектральных оценок порядка  K раз (при  N << M) по сравнению с оценками через периодограммы без усреднения.

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

1.  P.D.Welch, The Use of Fast Fourier Transform for the Estimation of Power Spectra, IEEE Transactions on Audio, Electroacoustics, June, 1967, AU - 15, N 2, 70 - 73.
2.  М.В.Арефьева, Корреляционный и спектральный анализ стационарных случайных процессов (часть 1), сб."Численный анализ на ФОРТРАНе", вып.15. Изд - во МГУ, M., 1976.

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

    int rss2r_c (real *x, real *y, integer *n, integer *k,
            integer *l, real *dt, real *sx, real *sy, real *sxy1, real *sxy2,
            real *z1, real *z2)

Параметры

x, y - одномерные массивы длины m1 = n + (k - 1) * l, содеpжащие последовательные значения исходных реализаций случайных процессов Xq, Yq,  q = 0, 1, ..., m1 - 1 (тип: вещественный);
n - заданная длина короткого отрезка, n ≥ 4 - целая степень числа два (тип: целый);
k - заданное число коротких отрезков (тип: целый);
l - заданное расстояние между начальными точками двух соседних коротких отрезков, 1 ≤ l ≤ n (тип: целый);
dt - заданный шаг сетки по оси времени, dt > 0 (тип: вещественный);
sx - одномерный массив длины n/2 + 1, содержащий вычисленные значения автоспектра процесса  X (тип: вещественный);
sy - одномерный массив длины n/2 + 1, содержащий вычисленные значения автоспектра процесса  Y (тип: вещественный);
sxy1 - одномерный массив длины n/2 + 1, содержащий вычисленные значения вещественной части взаимного спектра процессов X, Y - коспектра (тип: вещественный);
sxy2 - одномерный массив длины n/2 + 1, содержащий вычисленные значения мнимой части взаимного спектра процессов X, Y - квадратурного спектра (тип: вещественный);
z1, z2 - одномерные массивы длины n + 1, используемые в подпрограмме как рабочие (тип: вещественный).

Версии: нет

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

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

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

  1. 

Значения параметров k, l, n должны быть связаны соотношением: n + (k - 1) * l = m1 ≤ m, где  m - общее число заданных значений каждого из двух случайных процессов Xq, Yq, m1 - количество этих значений, используемых в подпрограмме для построения оценок спектров. В частности, возможно m = m1.

  2.  B частном случае одного случайного процесса  X допустимы совпадения параметров: x = y,  sy = sxy1 = sxy2, при этом массив sy используется в подпрограмме как рабочий.

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

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

    /* Local variables */
    static float sxy1[3], sxy2[3];
    static int k, l;
    extern int rss2r_c(float *, float *, int *, int *, int *, float *,
                       float *, float *, float *, float *, float *, float *);
    static int n;
    static float z1[5], z2[5], dt, sx[3], sy[3];

    n = 4;
    k = 2;
    l = 4;
    dt = 1.f;
    rss2r_c(x, y, &n, &k, &l, &dt, sx, sy, sxy1, sxy2, z1, z2);

    printf("\n %16.7e %16.7e %16.7e \n", sx[0], sx[1], sx[2]);
    printf("\n %16.7e %16.7e %16.7e \n", sy[0], sy[1], sy[2]);
    printf("\n %16.7e %16.7e %16.7e \n", sxy1[0], sxy1[1], sxy1[2]);
    printf("\n %16.7e %16.7e %16.7e \n", sxy2[0], sxy2[1], sxy2[2]);
    return 0;
} /* main */


Результаты:

      sx  =  (25.,  2.,  1.),             sy  =  (25.,  2.,  1.), 

      sxy1  =  (25.,  - 2.,  - 1.),    sxy2  =  (0.,  0.,  0.)