如何提取上升沿索引脉冲宽度matlab

时间:2017-11-08 15:25:30

标签: matlab

我使用以下命令提取脉冲宽度:

 WidthHigh=pulsewidth(data(:,2),data(:,1));

其中data(:,2)是我从示波器生成的样本矢量,data(:,1)是时间戳矢量。

有没有办法提取data(:,2)中找到的0交叉(或最近样本)的索引?换句话说,有没有办法提取每个测量脉冲宽度的起始指数?

此外,我无法理解帮助菜单中的INITCROSS,FINALCROSS,MIDLEV。它们是上升沿的开始,停止和中间值吗?我可以以某种方式将它们用于我的需要吗?当我看到它们时,给定的值令人困惑。

3 个答案:

答案 0 :(得分:1)

INITCROSS应该是您所需要的。看看这个例子,看看它是否符合你的期望:

t = linspace(0,1,100);
f = double(sin(5*t*pi) > .6) + randn(size(t))*.1;
figure; hold on; plot(t, f);
[~, initCross]=pulsewidth(f, t);
plot(initCross, zeros(size(initCross)), '*');

您还可以通过执行

标记所有这些术语,获得非常好的情节
pulsewidth(f,t);

如果您需要索引而不是时间值,您可以(遵循here的建议):

edges = [-Inf, mean([t(2:end); t(1:end-1)]), +Inf];
inds = discretize(initCross, edges);

答案 1 :(得分:1)

使用MATLAB演示数据pulseex.mat,如果执行此代码:

 load('pulseex.mat','x','t')
data = [x(1:end-5);x(1:end-5)];
data = [data,data];
t = 1:1:size(data,1);
data(:,1) = t;
plot(data(:,1),data(:,2), 'k')

[WidthHigh,INITCROSS,FINALCROSS]=pulsewidth(data(:,2),data(:,1));
hold on

indices = zeros(1,numel(INITCROSS));

for ii=1:numel(INITCROSS)
    plot ( [INITCROSS(ii);INITCROSS(ii)],   ylim, 'r' )
    plot ( [FINALCROSS(ii),FINALCROSS(ii)], ylim, 'b' )
    [~, indices(ii)] = min(abs(t-INITCROSS(ii)));
end

您会注意到indices对应于您要查找的上升沿(下图中的红色垂直线):vertices = [13 42]enter image description here

答案 2 :(得分:1)

脉冲宽度的第二个输出参数initCross是您的初始过零点。 我创建了一些假数据,这样可以更容易理解脉冲宽度:

data(:,1) = 0:0.01:5; % ten sec of data
data(:,2) = cos(data(:,1)*(2*pi)); % sin wave with 1 Hz
[widthHigh,initCross]=pulsewidth(data(:,2),data(:,1));

figure
plot(data(:,1),data(:,2))
hold on
plot([initCross initCross]',repmat(ylim',1,length(initCross)),'k')
plot([initCross initCross+widthHigh]',zeros(2,length(initCross)),'r')
legend('cosine','initial 0 crossing')