Текст подпрограммы и версий rss1r_p.zip |
Тексты тестовых примеров trss1r_p.zip |
Построение автопериодограмм и взаимных периодограмм двух вещественных случайных процессов по одному отрезку их реализаций.
Пусть заданы реализации двух вещественных, стационарных, центрированных случайных процессов Xq, Yq, q = 0, 1, ..., M - 1 на сетке по оси времени tq = q * DT с шагом DT > 0. Рассмотрим отрезки этих реализаций длины N: 1 ≤ N ≤ M, левые границы которых a, b: 0 ≤ a ≤ M - N, 0 ≤ b ≤ M - N, вообще говоря, различны, т.е. отрезки вида: Xa + s, Yb + s, s = 0, 1, ..., N - 1, и вычислим их дискретные преобразования Фурье Am, Bm:
N-1 Am = ∑ Xa + s exp(- i λm ts ) = s=0 N-1 = ∑ Xa + s exp(- 2π i m s / N) , s=0 N-1 Bm = ∑ Yb + s exp(- i λm ts ) = s=0 N-1 = ∑ Yb + s exp(- 2π i m s / N) , s=0
где λm = m * Δλ, m = 0, 1, ..., N - 1, Δλ = 2π/(N * DT), i = √-1.
Соответствующие автопериодограммы и взаимные периодограммы строятся по формулам [1]:
PXm = (DT / N) | Am | 2 , PYm = (DT / N) | Bm | 2 , PXYm = (DT / N) A*m Bm , m = 0, 1, ..., N -1 ,
где * - знак комплексного сопряжения, при этом функции РХm, PYm и PXY1m = Re PXYm симметричны относительно точки m = N/2, а функция PXY2m = Im PXYm антисимметрична относительно m = N/2.
Периодограммы, полученные по одному отрезку реализаций, являются при N → +∞ асимптотически несмещенными оценками спектров случайных процессов, но эти оценки асимптотически несостоятельны.
Полное описание реализованного алгоритма содержится в статье [2] (подпрограмма PERSEG).
1. | Дж.Бендат, А.Пирсол, Измерение и анализ случайных процессов, Изд - во "Мир", M., 1974. |
2. | М.В.Арефьева, Корреляционный и спектральный анализ стационарных случайных процессов (часть 1), сб. "Численный анализ на ФОРТРАНе", вып.15. Изд - во МГУ, M., 1976. |
procedure RSS1R(var X1 :Array of Real; var Y1 :Array of Real; var N :Integer; DT :Real; var PX :Array of Real; var PY :Array of Real; var PXY1 :Array of Real; var PXY2 :Array of Real);
Параметры
X1, Y1 - | одномерные мссивы длины N + 1, первые N элементов которых содержат значения исходных реализаций случайных процессов Xa + s, Yb + s, s = 0, 1, ..., N - 1 (тип: вещественный); |
N - | количество заданных значений каждого из двух исходных рядов, N ≥ 4 - целая степень числа два (тип: целый); |
DT - | заданный шаг сетки по оси времени, DT > 0 (тип: вещественный); |
PX - | одномерный массив длины N/2 + 1, содержащий вычисленные значения автопериодограммы процесса X (тип: вещественный); |
PY - | одномерный массив длины N/2 + 1, содержащий вычисленные значения автопериодограимы процесса Y (тип: вещественный); |
PXY1 - | одномерный массив длины N/2 + 1, содержащий вычисленные значения вещественной части взаимной периодограммы процессов X, Y (тип: вещественный); |
PXY2 - | одномерный массив длины N/2 + 1, содержащий вычисленные значения мнимой части взаимной периодограммы процессов X, Y (тип: вещественный). |
Версии: нет
Вызываемые подпрограммы
FTF1C - | подпрограмма вычисления дискретного или обратного дискретного преобразования Фурье комплексного ряда длины, равной степени двух, методом быстрого преобразования Фурье. |
Замечания по использованию
1. |
После выхода из подпрограммы RSS1R значения исходных случайных процессов в массивах X1, Y1 не сохраняются. | |
2. |
B частном случае построения автопериодограммы одного случайного процесса X в массив Y1 следует заслать нули, при этом допустимы совпадения параметров: PX = PY = PXY1 = PXY2. | |
3. | B частном случае построения только автопериодограмм двух случайных процессов X, Y без вычисления их взаимной периодограммы допустимы совпадения параметров: P = PXY1 = PXY2. |
Unit TRSS1R_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, RSS1R_p; function TRSS1R: String; implementation function TRSS1R: String; var N,_i :Integer; DT :Real; РХ :Array [0..2] of Real; PY :Array [0..2] of Real; PXY1 :Array [0..2] of Real; PXY2 :Array [0..2] of Real; const X1 :Array [0..4] of Real = ( 1.0,2.0,3.0,4.0,0.0 ); Y1 :Array [0..4] of Real = ( 4.0,3.0,2.0,1.0,0.0 ); begin Result := ''; N := 4; DT := 1.0; RSS1R(X1,Y1,N,DT,PX,PY,PXY1,PXY2); Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[PX[_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 ',[PY[_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 ',[PXY1[_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 ',[PXY2[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TRSS1R',Result); { вывод результатов в файл TRSS1R.res } exit; end; end. Результаты: PX = (25., 2., 1) , PY = (25., 2., 1.) , PXY1 = (25., - 2., - 1.) , PXY2 = ( 0., 0., 0.)