Моделирование случайных процессов при обработке сигналов

Я хотел бы понять одну вещь и, пожалуйста, помогите мне уточнить это, иногда необходимо представить данные данные в виде суммы комплексных экспонент с аддитивным белым шумом, давайте рассмотрим следующую модель с использованием синусоидальной модели

clear all;
A1=24;
A2=23;
A3=23;
A4=23;
A5=10;
 f1=11.01;
 f2=11.005;
 f3= 10;
 f4=10.9
 phi=2*pi*(rand(1,4)-0.5);
 t=0:0.01:2.93;
 k=1:1:294;
x=rand([1,length(t)]);
 y(k)=A1.*sin(2*pi*f1*t+phi(1))+A2.*cos(2*pi*f2*t+phi(2))+A3.*sin(2*pi*f3*t+phi(3))+A4.*cos(2*pi*f4*t+phi(4))+A5.*x;
 [pxx,f]=periodogram(y,[],[],100);
 plot(f,pxx)

там фазы распределены равномерно в диапазоне [-pi pi], но мой главный вопрос связан со следующим фактом: представлять данные как линейную комбинацию сложных экспонент с фазами, равномерно распределенными в интервале [-pi pi], если мы генерируем эти фазы вне выборки или при каждом процессе выборки мы должны генерировать новый список фаз? пожалуйста, помогите мне прояснить это

1 ответ

Решение

Как я сказал в своем комментарии, я не совсем понимаю, о чем вы спрашиваете. Но я отвечу на это так, как если бы вы спросили об этом при просмотре кода.

Следующее не является хорошей практикой в ​​MATLAB:

A1=24;
A2=23;
A3=23;
A4=23;
A5=10;

Есть очень мало случаев (если таковые имеются), когда вам действительно нужны такие имена переменных. Вместо этого следующее будет намного лучше:

A = [24 23 23 23 10];

Теперь, если вы хотите использовать A1, ты сделаешь A(1) вместо.

Эти две строки:

t=0:0.01:2.93;
k=1:1:294;

Они, конечно, одного размера (1x294), но когда вы делаете это таким образом, легко ошибиться. Конечно, позже вы получите ошибки, если они не одинакового размера, поэтому очень важно убедиться, что вы исправили их с первой попытки, поэтому использование linspace может быть хорошей идеей. Следующая строка даст вам то же самое t как строка выше. Таким образом, легче быть уверенным, что у вас есть ровно 294 элемента, а не 293, 295 или 2940 (иногда это легко пропустить).

t = linspace(0,2.93,294);

Не очень важно, но k = 1:1:294 можно упростить до k = 1:294Размер шага по умолчанию равен 1.

Синтаксис .*, используется для поэлементных операций. То есть, если вы хотите умножить каждый элемент вектора (или матрицы) на соответствующий элемент в другом. Поэтому использовать его при умножении векторов на скаляры не нужно, * достаточно.

Опять не важный момент, но x=rand([1,length(t)]); проще написано x=rand(1, length(t)); (без скобок).

Вам не нужен индекс k в y(k) = ..., поскольку k непрерывно, начиная с 1, с шагом 1. Это поведение по умолчанию в MATLAB, поэтому y = ... достаточно. Однако, если вы хотите заполнить только одно число от 1 до 100, вы можете сделать y(1:2:100),

Это далеко не идеально, но, на мой взгляд, большой шаг в правильном направлении:

A = [24 23 23 23 10];
f = [11.01 11.005 10 10.9];   % You might want to use , as a separator here
phi = 2*pi*(rand(1,4)-0.5);
t = linspace(0,2.93,294);
x = rand(1, length(t));

w = 2*pi*f;   % For simplicity
y = A(1)*sin(w(1)*t+phi(1)) + A(2)*cos(w(2)*t+phi(2)) + ...
    A(3)*sin(w(3)*t+phi(3)) + A(4)*cos(w(4)*t+phi(4))+A(5)*x;

Другой вариант будет:

z = [sin(w(1)*t+phi(1)); cos(w(2)*t+phi(2)); sin(w(3)*t+phi(3)); ...
    cos(w(4)*t+phi(4)); x];
y = A.*z;

Это даст вам то же самое y как первый. Имея то же самое w, t а также phi как указано выше, следующее также даст вам те же результаты:

c = bsxfun(@times,w,t') + kron(phi,ones(294,1));
y = sum(bsxfun(@times,A,[sin(c(:,1)), cos(c(:,2)), sin(c(:,3)), cos(c(:,4)), x']),2)';

Я надеюсь, что что-то здесь может помочь вам в вашей дальнейшей работе. И, возможно, я действительно ответил на ваш вопрос. знак равно

Другие вопросы по тегам