Моделирование коррелированных гауссовых СВ — различия между версиями
Korogodin (обсуждение | вклад) (→Статистический эквивалент коррелятора) |
Korogodin (обсуждение | вклад) (→Реализация в MATLAB) |
||
Строка 77: | Строка 77: | ||
== Реализация в MATLAB == | == Реализация в MATLAB == | ||
+ | Пример использования: | ||
+ | <source lang="matlab"> | ||
+ | qcno_dB = 45; | ||
+ | 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) )); | ||
+ | </source> | ||
+ | |||
+ | Вывод: | ||
+ | |||
+ | <source lang="matlab"> | ||
+ | Corrcoeff nIp nIe = 0.750737 | ||
+ | Corrcoeff nIl nIe = 0.500801 | ||
+ | </source> | ||
+ | |||
+ | Реализация в виде функции (не стоит использовать в цикле, т.к. каждый раз будет вычисляться разложение): | ||
+ | <source lang="matlab"> | ||
+ | |||
+ | function [X, L] = getCorrelatedRV( D, m ) | ||
+ | %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 | ||
+ | </source> | ||
[[Category:ММ РУиС (дисциплина)]] | [[Category:ММ РУиС (дисциплина)]] |
Версия 13:32, 22 августа 2013
При моделировании следящих систем НАП, а так же сигналов многоантенных НАП, возникает задача создания нормальных случайных величин с заданным коэффициентом корреляции.
Рассмотрим решение данной задачи на примере модели шумов статистического эквивалента корреляционных сумм , и .
Содержание |
Статистический эквивалент коррелятора
Статистический эквивалент коррелятора синфазных корреляционных сумм в отсутствии помех можно описать выражениями:
которые для полной картины необходимо дополнить определениями , и т.д., а так же описанием шумов , , .
Математические ожидания СВ , , равны нулю, их дисперсии есть
,
где - дисперсия шумов на выходе АЦП, - число суммируемых отсчетов в корреляторе, эти величины считаются известными.
Нетрудно рассчитать попарные взаимные дисперсии:
,
,
Требуется на ЭВМ, имея генератор случайных нормальных чисел, формировать реализации СВ , , .
Примечание. Задача формирования шумов квадратурных сумм - абсолютно аналогична и независима, т.к. шумы между 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