Wave arithmetic for mismatched XY wave pairs
johnweeks
Performs addition, subtraction, multiplication or division on two XY pairs of waves. Determines the overlap X range and creates an XY output pair with names determined by the string outwavename; the X wave of the output pair has "_X" appended the the specified name. The output X wave contains all X values from both input pairs that fall within the common range. To do the arithmetic operations, a Y value is interpolated from each input Y wave at each of the output X values. The arithmetic is done using this pair of interpolated Y values. No attempt is made to eliminate duplicated X values.
// Constants to use for the "operation" input
Constant XYArith_Add=0
Constant XYArith_Subtract=1
Constant XYArith_Multiply=2
Constant XYArith_Divide=3
Function UnmatchedXYPairArithmetic(axwave, aywave, bxwave, bywave, operation, outwavename)
WAVE axwave, aywave, bxwave, bywave
Variable operation
String outwavename
Sort axwave, axwave, aywave
Sort bxwave, bxwave, bywave
WaveStats/Q axwave
Variable amin = V_min
Variable aminloc = V_minloc
Variable amax = V_max
Variable amaxloc = V_maxloc
WaveStats/Q bxwave
Variable bmin = V_min
Variable bminloc = V_minloc
Variable bmax = V_max
Variable bmaxloc = V_maxloc
if ((amin > bmax) || (amax < bmin))
DoAlert 0, "X waves don't overlap"
endif
Variable beginx = amin < bmin ? bmin : amin
Variable endx = amax < bmax ? amax : bmax
Variable beginp = binarysearch(axwave, beginx)+1
Variable endp = binarysearch(axwave, endx)
Duplicate/FREE/R=[beginp, endp] axwave,srcax
Duplicate/FREE/R=[beginp, endp] aywave,srcay
beginp = binarysearch(bxwave, beginx)+1
endp = binarysearch(bxwave, endx)
Duplicate/FREE/R=[beginp, endp] bxwave,srcbx
Duplicate/FREE/R=[beginp, endp] bywave,srcby
KillWaves/Z $(outwavename+"_X")
Concatenate/NP/O {srcax, srcbx}, $(outwavename+"_X")/WAVE=xw
Duplicate/O xw, $outwavename/WAVE=yw
switch(operation)
case 0:
yw = aywave[binarysearchinterp(axwave, xw[p])] + bywave[binarysearchinterp(bxwave, xw[p])]
break;
case 1:
yw = aywave[binarysearchinterp(axwave, xw[p])] - bywave[binarysearchinterp(bxwave, xw[p])]
break;
case 2:
yw = aywave[binarysearchinterp(axwave, xw[p])] * bywave[binarysearchinterp(bxwave, xw[p])]
break;
case 3:
yw = aywave[binarysearchinterp(axwave, xw[p])] / bywave[binarysearchinterp(bxwave, xw[p])]
break;
endswitch
end
// IsMonotonic() returns true if the wave has dwave(x)/dx >= 0 for all x.
Static Function IsMonotonic(WAVE wv)
Differentiate/METH=1/EP=1 wv/D=difwave
WAVE difwave
Variable wmin = WaveMin(difwave)
Variable wmax = WaveMax(difwave)
KillWaves difwave
return (wmin < 0 && wmax <= 0) || (wmin >= 0 && wmax > 0)
End
Constant XYArith_Add=0
Constant XYArith_Subtract=1
Constant XYArith_Multiply=2
Constant XYArith_Divide=3
Function UnmatchedXYPairArithmetic(axwave, aywave, bxwave, bywave, operation, outwavename)
WAVE axwave, aywave, bxwave, bywave
Variable operation
String outwavename
Sort axwave, axwave, aywave
Sort bxwave, bxwave, bywave
WaveStats/Q axwave
Variable amin = V_min
Variable aminloc = V_minloc
Variable amax = V_max
Variable amaxloc = V_maxloc
WaveStats/Q bxwave
Variable bmin = V_min
Variable bminloc = V_minloc
Variable bmax = V_max
Variable bmaxloc = V_maxloc
if ((amin > bmax) || (amax < bmin))
DoAlert 0, "X waves don't overlap"
endif
Variable beginx = amin < bmin ? bmin : amin
Variable endx = amax < bmax ? amax : bmax
Variable beginp = binarysearch(axwave, beginx)+1
Variable endp = binarysearch(axwave, endx)
Duplicate/FREE/R=[beginp, endp] axwave,srcax
Duplicate/FREE/R=[beginp, endp] aywave,srcay
beginp = binarysearch(bxwave, beginx)+1
endp = binarysearch(bxwave, endx)
Duplicate/FREE/R=[beginp, endp] bxwave,srcbx
Duplicate/FREE/R=[beginp, endp] bywave,srcby
KillWaves/Z $(outwavename+"_X")
Concatenate/NP/O {srcax, srcbx}, $(outwavename+"_X")/WAVE=xw
Duplicate/O xw, $outwavename/WAVE=yw
switch(operation)
case 0:
yw = aywave[binarysearchinterp(axwave, xw[p])] + bywave[binarysearchinterp(bxwave, xw[p])]
break;
case 1:
yw = aywave[binarysearchinterp(axwave, xw[p])] - bywave[binarysearchinterp(bxwave, xw[p])]
break;
case 2:
yw = aywave[binarysearchinterp(axwave, xw[p])] * bywave[binarysearchinterp(bxwave, xw[p])]
break;
case 3:
yw = aywave[binarysearchinterp(axwave, xw[p])] / bywave[binarysearchinterp(bxwave, xw[p])]
break;
endswitch
end
// IsMonotonic() returns true if the wave has dwave(x)/dx >= 0 for all x.
Static Function IsMonotonic(WAVE wv)
Differentiate/METH=1/EP=1 wv/D=difwave
WAVE difwave
Variable wmin = WaveMin(difwave)
Variable wmax = WaveMax(difwave)
KillWaves difwave
return (wmin < 0 && wmax <= 0) || (wmin >= 0 && wmax > 0)
End
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More