2015-11-30 74 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);