Octave/MATLAB 绘制数字信号
Octave/MATLAB plotting digital signals
给出这样的数据:
>> x = [0,3.0001,7,9];
>> y = [0 1 0 1];
>> plot(x, y);
我需要绘图看起来像数字信号,而不是线性插值(见灰线和蓝线)。
为什么?? (你真的不需要读这个):
我正在绘制传感器给出的事件,所以我必须绘制传感器的当前状态与时间的关系图。事件不会以给定的频率刷新。我只是有传感器状态发生变化的时候。我的数据集是这样的:
传感器 1 准时 0
传感器 2 开启时间 0.05
传感器 1 关闭时间 1.15
传感器 2 关闭时间 1.55
...
我不知道 MATLAB 或 Octave 是否适合绘制此类信号。
使用楼梯:
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);
不知道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
本质上,您的采样频率太低,无法显示信号中的急剧电平变化。您可以通过定义具有更高采样频率的 x
值的向量并针对您的传感器适当地修改它 on/off 次来缓解该问题。示例:
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);
给出这样的数据:
>> x = [0,3.0001,7,9];
>> y = [0 1 0 1];
>> plot(x, y);
我需要绘图看起来像数字信号,而不是线性插值(见灰线和蓝线)。
为什么?? (你真的不需要读这个):
我正在绘制传感器给出的事件,所以我必须绘制传感器的当前状态与时间的关系图。事件不会以给定的频率刷新。我只是有传感器状态发生变化的时候。我的数据集是这样的:
传感器 1 准时 0
传感器 2 开启时间 0.05
传感器 1 关闭时间 1.15
传感器 2 关闭时间 1.55
...
我不知道 MATLAB 或 Octave 是否适合绘制此类信号。
使用楼梯:
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);
不知道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
本质上,您的采样频率太低,无法显示信号中的急剧电平变化。您可以通过定义具有更高采样频率的 x
值的向量并针对您的传感器适当地修改它 on/off 次来缓解该问题。示例:
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);