Текст подпрограммы и версий rss2r_p.zip |
Тексты тестовых примеров trss2r_p.zip |
Построение сглаженных оценок автоспектров и взаимных спектров двух вещественных случайных процессов методом модифицированных периодограмм.
Пусть заданы реализации двух вещественных, стационарных, центрированных случайных процессов 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. |
procedure RSS2R(var X :Array of Real; var Y :Array of Real; var N :Integer; K :Integer; L :Integer; DT :Real; var SX :Array of Real; var SY :Array of Real; var SXY1 :Array of Real; var SXY2 :Array of Real; var Z1 :Array of Real; var Z2 :Array of Real);
Параметры
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 - | подпрограмма вычисления дискретного или обратного дискретного преобразования Фурье комплексного ряда длины, равной степени двух, методом быстрого преобразования Фурье. |
Замечания по использованию
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 используется в подпрограмме как рабочий. |
Unit TRSS2R_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, RSS2R_p; function TRSS2R: String; implementation function TRSS2R: String; var N,K,L,_i :Integer; DТ :Real; SX :Array [0..2] of Real; SУ :Array [0..2] of Real; SXY1 :Array [0..2] of Real; SXY2 :Array [0..2] of Real; Z1 :Array [0..4] of Real; Z2 :Array [0..4] of Real; const X :Array [0..7] of Real = ( 1.0,2.0,3.0,4.0,1.0,2.0,3.0,4.0 ); Y :Array [0..7] of Real = ( 4.0,3.0,2.0,1.0,4.0,3.0,2.0,1.0 ); begin Result := ''; N := 4; K := 2; L := 4; DT := 1.0; RSS2R(X,Y,N,K,L,DT,SX,SY,SXY1,SXY2,Z1,Z2); Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[SX[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[SY[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[SXY1[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[SXY2[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TRSS2R',Result); { вывод результатов в файл TRSS2R.res } exit; end; end. Результаты: SX = (25., 2., 1.), SY = (25., 2., 1.), SXY1 = (25., - 2., - 1.), SXY2 = (0., 0., 0.)