Моделирование случайных процессов при обработке сигналов
Я хотел бы понять одну вещь и, пожалуйста, помогите мне уточнить это, иногда необходимо представить данные данные в виде суммы комплексных экспонент с аддитивным белым шумом, давайте рассмотрим следующую модель с использованием синусоидальной модели
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)';
Я надеюсь, что что-то здесь может помочь вам в вашей дальнейшей работе. И, возможно, я действительно ответил на ваш вопрос. знак равно