Моделирование коррелированных гауссовых СВ
При моделировании следящих систем НАП, а так же сигналов многоантенных НАП, возникает задача создания нормальных случайных величин с заданным коэффициентом корреляции.
Рассмотрим решение данной задачи на примере модели шумов статистического эквивалента корреляционных сумм , и .
Содержание |
Статистический эквивалент коррелятора
Статистический эквивалент коррелятора синфазных корреляционных сумм в отсутствии помех можно описать выражениями:
которые для полной картины необходимо дополнить определениями , и т.д., а так же описанием шумов , , .
Математические ожидания СВ , , равны нулю, их дисперсии есть
,
где - дисперсия шумов на выходе АЦП, - число суммируемых отсчетов в корреляторе, эти величины считаются известными.
Нетрудно рассчитать попарные взаимные дисперсии:
,
,
Требуется на ЭВМ, имея генератор случайных нормальных чисел, формировать реализации СВ , , .
Примечание. Задача формирования шумов квадратурных сумм - абсолютно аналогична и независима, т.к. шумы между I и Q компонентами не коррелируют и независимы.
Многомерная нормальная СВ или вектор случайных величин?
При синтезе радиотехнических систем часто используются модели, оперирующие с многомерными нормальными случайными величинами. Определение из Википедии:
Случайный вектор имеет многомерное нормальное распределение, если выполняется одно из следующих эквивалентных условий:
- Произвольная линейная комбинация компонентов вектора имеет нормальное распределение или является константой.
- Существует вектор независимых стандартных нормальных случайных величин , вещественный вектор и матрица размерности , такие что:
- .
- Существует вектор и неотрицательно определённая симметричная матрица размерности , такие что характеристическая функция вектора имеет вид:
- .
Из первого условия следует, что каждая из компонент нормальной векторной СВ имеет нормальное распределение (для компоненты это вытекает при и остальных коэффициентах комбинации, равных 0). Отсюда часто возникает иллюзия, что нормальность распределений компонент влечет нормальность совместного распределения. Этот тезис не выполняется, на контрпример можно взглянуть тут.
Шумы корреляционных сумм , , получены сворачиванием входного шума с тремя опорными сигналами. Таким образом, выполняется второе необходимое и достаточное условие того, что тройка , , имеет многомерное нормальное распределение (если выборку обозначить как , опорные сигналы записать в виде трех строк матрицы , - вектор-столбец из трех нулей)
Итого, компоненты образуют многомерную нормальную СВ с нулевым мат. ожиданием и ковариационной матрицей:
.
Разложение Холецкого
Существует разложение матрицы в виде , где — нижняя треугольная матрица со строго положительными элементами на диагонали. Данное представление называется разложением Холецкого и относительно легко рассчитывается. Разложение Холецкого всегда существует и единственно для любой симметричной положительно-определённой матрицы.
Применим разложение Холецкого к ковариационной матрице:
.
Умножим полученную матрицу на вектор-столбец из трех независимых нормальных стандартных СВ:
.
Компоненты вектора образуют многомерную нормальную случайную величину, т.к. выполняется второе необходимое и достаточное условие.
Нетрудно показать, что вектор математических ожиданий - нулевой, а ковариационная матрица . Таким образом, - требуемая многомерная СВ.
Реализация в MATLAB
Пример использования:
N = 10000;
stdn = 8;
stdn_IQ = sqrt(stdn^2 * N /2);
ro1 = 0.75;
ro2 = 0.5;
Dp=stdn_IQ^2; Dpe=ro1*stdn_IQ^2; Del=ro2*stdn_IQ^2;
L=chol([Dp Dpe Dpe;
Dpe Dp Del;
Dpe Del Dp])';
Nj = 1000000;
nIp = nan(1,Nj);
nIe = nan(1,Nj);
nIl = nan(1,Nj);
for j = 1:Nj
nI = L*randn(3,1);
nIp(j) = nI(1);
nIe(j) = nI(2);
nIl(j) = nI(3);
end
fprintf('Corrcoeff nIp nIe = %f\n', mean(nIp.*nIe / std(nIp) / std(nIe) ));
fprintf('Corrcoeff nIl nIe = %f\n', mean(nIl.*nIe / std(nIl) / std(nIe) ));
Вывод:
Corrcoeff nIl nIe = 0.500801
Реализация в виде функции (не стоит использовать в цикле, т.к. каждый раз будет вычисляться разложение):
%GETCORRELATEDRV Returns gaussian corralated random vector
sizeD = size(D);
if (sizeD(1) ~= sizeD(2))
error('Covariance matrix must be square.')
end
if (nargin == 1)
m = zeros(sizeD(1), 1);
elseif ((nargin < 1) || (nargin > 2))
error('Incorrect number of inputs.');
end
if nargin == 2
sizem = size(m);
if sizem(1) == 1
m = m';
sizem = size(m);
end
if sizem(2) > 1
error('Second argument must be vector.');
end
if (sizem(1) ~= sizeD(1))
error('Dimensions of D and m are not consistent.');
end
end
L = chol(D)';
X = L * randn(sizeD(1), 1) + m;
end