2014-05-05 10 views
-1

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

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 пи], но мой главный вопрос связан следующий fact.to представляет данные в виде линейной комбинации сложного экспонента с фазами, равномерно распределенных в [-pi пи] интервале , должны ли мы генерировать эти фазы вне выборки или при каждом процессе выборки мы должны генерировать новый список фаз? Пожалуйста, помогите мне прояснить это.

+0

что является причиной downvoting –

+2

У меня нет downvoted, но я могу понять человека, который это сделал. На мой взгляд, этот вопрос плохо сформулирован, содержит как слишком мало, так и слишком много информации одновременно, и трудно точно понять, что вы просите. –

+0

Скомпилирует ли эта строка? '[pxx, f] = periodogram (y, [], [], 100);' Я получаю сообщение об ошибке. – NKN

ответ

2

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

Следующая не является хорошей практикой в ​​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) = ..., так как к непрерывно, начиная с 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)'; 

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

+0

+1 за то, что вы дали такой качественный ответ на вопрос не очень хорошего качества. –

+0

@Robert P спасибо за синтаксис matlab, это, конечно, более профессионально, но это не мой вопрос, смотрите, пожалуйста, у меня есть случайные фазы да? Вообще существуют модели, которые являются синусоидальными с фазами, равномерно распределенными правильно? Я прошу получить это правильно ли я должен сгенерировать их сразу и вставить в модель или на каждой итерации я должен сгенерировать новый образец? Это так неясно? На каком языке я должен говорить? :( –

+0

Другими словами, если я взял цикл вместо векторизации, должен ли я генерировать этот случайный образец фаз на каждой итерации цикла? –

 Смежные вопросы

  • Нет связанных вопросов^_^