Текст подпрограммы и версий rsc1r_c.zip |
Тексты тестовых примеров trsc1r_c.zip |
Построение автокорреляционных и взаимных корреляционных функций двух случайных процессов по оценкам их спектров.
Пусть 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)