计算两条曲线之间的面积

时间:2016-02-09 02:36:47

标签: matlab

我有一个PSD图,我正在尝试计算两个不同频率范围(8-30 Hz和70-100 Hz)的MATLAB中两条曲线之间的区域。每个频率范围的一个面积计算。

要计算每个频率范围内所有部分的曲线之间的区域,我使用:

r1=(f>=8 & f<=30);
r2=(f>=70 & f<=100);
areaLF = trapz(f(r1),Z(r1)-Zm(r1));
areaHF = trapz(f(r2),Z(r2)-Zm(r2));

f =频率和Zm,Z表示两个条件的Z分数(归一化功率)。

我可以计算每个频率范围内曲线之间所有区域的曲线之间的面积,但我只想计算当Zm Zm用于更高频率(图中的阴影区域)。

是否有人建议如何执行此操作?

这是显示我想要计算的区域的图表:enter image description here

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您需要将逻辑掩码从f定义为由ZZm定义:

r1= Zm < Z;
r2= Z  < Zm;
area1 = trapz(f(r1),Z(r1)-Zm(r1));
area2 = trapz(f(r2),Z(r2)-Zm(r2));

对于您发布的示例等不连续的块,您可能需要逐个集成块。在这种情况下,我将这些代码汇总在一起(我不确定它是否健壮,或者Matlab是否具有执行任务的简单功能):

%   Predicate
mask    = Zm < Z;

%   Determine index windows for the contiguous blocks.
ind     = 1:numel(f);
dmask   = xor(mask(1:end-1),mask(2:end));
iSwitch = ind(dmask)+1;
nSwitch = nnz(dmask);

if mask(1) == true  % start true
    iLo = [ind(1) , iSwitch(2:2:end)];
    iHi = iSwitch(1:2:end)-1;

    if mod(nSwitch,2) == 0 %    end true
        iHi = [ iHi , ind(end)];
    end

else  % start false
    iLo = iSwitch(1:2:end);
    iHi = iSwitch(2:2:end)-1;

    if mod(nSwitch,2) ~= 0 %    end true
        iHi = [ iHi , ind(end)];
    end
end
nBlocks = numel(iLo);


%   Iterate over blocks
total = 0;
for k = 1:nBlocks;
    mask  = iLo(k):iHi(k);
    total = total + trapz(f(mask),Z(mask) - Zm(mask));
end