如果我想在Matlab中绘制一个简单的正弦波的PSD,我会做如下的事情:
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。我做了如下事情:
然后,我得到了一个名为"Sinwave“的变量,,如何应用上述Matlab代码来绘制PSD?。
请注意,变量Sinewave是1x1双时间序列。我试着用辛波代替x,但没有用。
更新:应用答案
我应用了推荐的输出,但是我的输出与使用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输出的正弦波。
但是,matlab代码中的代码如下所示:
我需要输出像这样的matalb 和所有这些涟漪在噪音地板。我怎样才能得到准确的输出?
请注意,我对两者都使用了精确的值。
更新2: SIMULIN正弦波设置
1-正弦波块
2-到工作区块
3-解决方案
发布于 2016-09-20 15:58:54
如果您仔细查看您的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)
事实上,这给了我们一个很好的正弦波图。我们现在可以尝试用Sinewave.Time
代替变量Sinewave.Time
,用Sinewave.Data
代替x
,这样就可以绘制PSD。
如果您不知道采样频率,您可以使用Sinewave.TimeInfo
-它包含样本的数量,以及开始和结束时间,来计算采样频率Fs
。
回答您编辑的问题:用MATLAB代码创建的时间向量t
是0 : 0.001 : 0.999
,长度为1000。但是,您的Simulink仿真从t=0
以0.001
的步骤运行到t=1
,因此您得到的时间和数据向量的长度为1001!计算假定步骤大小为1/1001
而不是1/1000
,从而导致不同的结果。要解决这个问题,请将模拟设置中的停止时间更改为0.999。然后,得到的向量大小是正确的,得到的结果与MATLAB计算的结果相同。
发布于 2016-09-20 15:56:31
Timeseries对象包含一个数据字段,该字段应该包含正弦波数据。您可以执行x = Sinwave.Data;
,然后可以使用其余的代码。或者,您也可以将“to工作区”块的"Save“属性设置为"Array”。这将使辛波成为一个常规的MATLAB阵列。然后,您可以简单地将x替换为Sinwave。
https://stackoverflow.com/questions/39598176
复制相似问题