2016-09-20 4 views
6

Если я хочу построить PSD простой синусоидальной волны в Matlab, я хотел бы сделать что-то вроде следующего:От SIMULINK до рабочего пространства FFT?

Fs = 1000; 
t = 0:1/Fs:1-(1/Fs); 
x = cos(2*pi*100*t) ; 

N = length(x); 
xdft = fft(x); 
xdft = xdft(1:N/2+1); 
psdx = (1/(Fs*N)) * abs(xdft).^2; 
psdx(2:end-1) = 2*psdx(2:end-1); 
freq = 0:Fs/length(x):Fs/2; 

plot(freq,10*log10(psdx)) 
grid on 

Но предположим, для простоты, у меня есть синусоидальный генератор в SIMULINK и мне нужно, чтобы построить PSD. Я сделал что-то вроде следующего: enter image description here

Затем я получил переменной называется «Sinwave», как я могу возможно применить выше Matlab код для построения PSD?

Обратите внимание, что переменная Sinewave равна 1x1 двойной временной ряд. Я попытался просто заменить x на Sinwave, но это не сработало.

Обновление: Применяя ответы

Я применил то, что рекомендуется вниз, но у меня есть другой выход, чем если бы я сделать это с Matalb. Вот код, который я использовал:

Fs = 1000; 
x = Sinwave.Data; 
N = length(x); 
dft = fft(x); 
dft = dft(1:N/2+1); 
psd = (1/(Fs*N)) * abs(dft).^2; 
psd(2:end-1) = 2*psd(2:end-1); 
freq = 0:Fs/length(x):Fs/2; 

plot(freq,10*log10(psd)) 
grid on 

Это один для SIMULINK экспортируемых синусоид enter image description here

Однако один из кода MatLab подобен следующему: enter image description here

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

Обратите внимание, что я использовал точные значения для обоих.

Обновление 2: SIMULINK установки синусоида

1- Синусоида блок

enter image description here

2- В рабочей области блока

enter image description here

3- Solver

enter image description here

+0

Проверьте частоту дискретизации в синусоидальном блоке. Поместите данные на один и тот же рисунок и посмотрите, где они отличаются. Вы можете опубликовать свое обновление как другой вопрос, так как речь идет о данных синусоидальной волны, а не о регистрации в рабочей области. – Navan

+0

1- Я бы сказал, что это одни и те же вопросы. Потому что речь идет о правильном экспорте данных в Matlab. 2- Мне не нужно рисовать на одной фигуре, потому что различия остаются большими и действительно очевидными. Вы только рисуете на одной фигуре, если различия малы. 3- Частота дискретизации и все точно такие же, как упоминалось ранее. – AhmedWas

+0

Я получаю тот же результат, что и Simulink, используя точный код, который у вас есть. Вы установили решатель Simulink на фиксированный временной интервал и правильную частоту дискретизации? – hbaderts

ответ

2

таймсерии объект содержит поле данных, которое должно содержать данные синусоиды. Вы можете сделать x = Sinwave.Data; и затем использовать остальную часть своего кода. В качестве альтернативы вы также можете установить свойство «Сохранить формат» блока «В рабочее пространство» в «Массив». Это сделает Sinwave регулярным массивом MATLAB. Затем вы можете просто заменить x на Sinwave.

+0

Просьба проверить обновление. У меня все еще проблема с выходом. – AhmedWas

+0

Второе обновление. Просьба проверить, спасибо. – AhmedWas

4

Если вы внимательно посмотрите на свою Sinewave переменную, т.е.просто набрав его имя в командной строке, вы увидите следующее:

>> Sinwave 
    timeseries 

    Common Properties: 
      Name: '' 
      Time: [51x1 double] 
     TimeInfo: [1x1 tsdata.timemetadata] 
      Data: [51x1 double] 
     DataInfo: [1x1 tsdata.datametadata] 

    More properties, Methods 

Он содержит различные поля, например. Time и Data, которые являются одновременно массивами. Мы могли бы просто попытаться построить их, например:

plot(Sinwave.Time, Sinwave.Data) 

И действительно, это дает нам приятный сюжет вашей синусоиды. Теперь мы можем попробовать заменить переменную t на Sinewave.Time и x с Sinewave.Data, что позволяет нам строить PSD.

Если вы не знаете частоту дискретизации, вы можете использовать Sinewave.TimeInfo - который содержит количество образцов, а также время начала и окончания, чтобы рассчитать частоту дискретизации Fs.


В ответ на отредактированном вопрос: вектор времени t, который вы создаете с кодом MATLAB, является 0 : 0.001 : 0.999 и имеет длину 1000. Ваш Simulink моделирования, однако, работает от t=0 до t=1 с шагом 0.001, поэтому ваши результирующие векторы времени и данных имеют длину 1001! Расчет предполагает, что размер шага равен 1/1001 вместо 1/1000, что приводит к разным результатам. Чтобы решить эту проблему, измените значение Stop Time в настройке моделирования до 0.999. Затем полученные векторы имеют правильный размер, и вы получите тот же результат, что и расчет MATLAB.

resulting plot

+0

Спасибо за ответ. Но, пожалуйста, проверьте обновление, так как вывод не совпадает. – AhmedWas