我有一个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
是否有人建议如何执行此操作?
答案 0 :(得分:1)
如果我正确理解您的问题,您需要将逻辑掩码从f
定义为由Z
和Zm
定义:
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