2015-11-30 143 views
2

鉴于数据是这样的:倍频/ MATLAB绘制数字信号

>> x = [0,3.0001,7,9]; 
>> y = [0 1 0 1]; 
>> plot(x, y); 

我需要的情节看起来像一个数字信号,而不是像线性内插(见灰色和蓝色线)。

Enter image description here

为什么? (你并不需要读这个):

我正在绘制传感器给出的事件,所以我必须绘制传感器的当前状态与时间的关系。事件不会以给定的频率刷新。当传感器的状态发生变化时,我只是有时间。我的数据是这样的:

传感器1在时间0

传感器2在时间0.05

传感器1,关机时间,1.15

传感器2,关机时间,1.55

..

我不知道MATLAB或Octave是否适用于绘制这些类型的信号。

回答

1

使用楼梯

figure; 
stairs(x,y); 

或者

x = [0,3,7,9]; 
y = [0 1 0 1]; % Input 

绘制之前添加以下代码:

x1(1) = x(1); 
j = 2; 
for i=2:numel(x) 
    x1(j) = x(i); 
    j =j+1; 
    x1(j) = x(i); 
    j=j+1; 
end 
x1 

j = 1; 
for i=1:numel(y)-1 
    y1(j) = y(i); 
    j =j+1; 
    y1(j) = y(i); 
    j=j+1; 
end 
y1(j) = y(end); 
y1 

结果:

x1 = [0, 3, 3, 7, 7, 9, 9] 
y1 = [0, 0, 1, 1, 0, 0, 1] 

plot(x1, y1); 
+1

x = [0,3.0001,7,9]; y = [0 1 0 1]; figure; stairs(x,y) –

+1

楼梯是这个的matlab图。你可以直接使用它。不需要任何额外的代码。 –

+0

这是一个很好的解决方案'楼梯'。你可以编辑它到你的文章上面。 – mikkola

1

我不知道在MATLAB中是否有这样的情节。但是你可以将这个情节与细分结合起来。

x=[0,3.0001,7,9]; 
y=[0 1 0 1]; 
ax = axes; 
for iSegment = 1:numel(x)-1 
    jump = y(iSegment)+1 - y(iSegment); 
    line([x(iSegment) x(iSegment+1)], [y(iSegment), y(iSegment)]); 
    if jump < 0 
     line([x(iSegment) x(iSegment)], [y(iSegment), y(iSegment+1)]); 
    elseif jump > 0 
     line([x(iSegment+1) x(iSegment+1)], [y(iSegment), y(iSegment+1)]); 
    end 
end 
2

本质上,您的采样频率太低,无法显示信号中的急剧电平变化。您可以通过定义具有更高采样频率的x值向量并适当修改传感器开/关时间来缓解该问题。例如:

Ns = 1000; % number of points to use 
x = linspace(0, 12, Ns); 
y = zeros(1,Ns); %// initialize to all zeros 
y(x >= 3 & x <= 7) = 1; %// signal high when x in range [3,7] 
y(x > 9) = 1; %// signal high when x greater than 9 

figure; 
plot(x, y);