Average Waves question
sjr51
I have an experiment with several XY pairs that I would like to average. The X data is variable (∆) between waves, but runs from -20ish to 120ish. All have a common point at 0. I would like to use the Average Waves package to generate an average wave trace with scaling such that it has a point at 0 (for curve fitting purposes). Right now, the scaling of the average means the interpolation does not happen at 0. My question is:
How does the panel decide what scaling and how many points to use for the average, and can this be changed?
If I knew how the scaling worked I could create two extra XY pairs for each wave at the beginning and end of the waves at constant X such that the average wave placed a point at 0. Hopefully this makes sense.
Any help would be very much appreciated.
It sounds to me like what you want to do is just beyond the scope of Average Waves. You probably need to write a special-purpose function to do the job.
John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
September 19, 2013 at 09:05 am - Permalink
My solution for now is to check the number of points for the average wave (say 216).
Make a new XY pair with {-20, -10, 0, 10, 195} and {1, nan, 0, nan, 1}. My real data start at >-20 and finish at <+120.
Make the average again. It still generates 216 points, but now ∆=1 so that it puts a point at 0.
September 20, 2013 at 12:09 am - Permalink
That's because scaling is irrelevant if they all have the same scaling.
Since you have waves with different scaling, I would write a script to do the following.
1. Determine common x-range of all waves provided (data points outside this range can't really be averaged). Ignore step 1 if all waves have same outer limits for x.
2. Create waves for results (XY)
3. use the interp function to interpolate the value from each data wave at the desired output x-value
4. Average these interpolated values
5. Repeat 2-4 for each X value in range.
September 20, 2013 at 08:47 am - Permalink
John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
September 20, 2013 at 09:09 am - Permalink
fWaveAverage() has a non-point-for-point mode that kicks in with mismatched waves such as you describe.
The X values generated are interpolated X values to encompass the min x to max x range (computed over all the waves). The number of points in the result is increased to compensate for this interpolation (with safeguarding against too many points):
// can't do point-for-point because of different point range or scaling or there are multiple X waves
Variable firstAvePoint,lastAvePoint,point,xVal,yVal
Variable newLength= 1 + round(abs(maxXmax - minXmin) / minDeltaX)
maxLength= min(maxLength*4,newLength) // avoid the case where one very small deltaX in an XY pair causes a huge wave to be created.
Make/N=(maxLength)/D/O $AveName
Wave/Z AveW=$AveName
AveW= 0
Wave w=$StringFromList(0,ListOfWaves)
CopyScales w, AveW // just to get the data and x units
SetScale/I x, minXmin, maxXmax, AveW // set X scaling to all-encompassing range
Make/O/N=(maxLength)/FREE TempNWave= 0
Then each wave's contribution is computed by Y interpolation and summed into AveW while keeping track of the number of waves contributing to the sum at each point in TempNWave:
for (i = 0; i < numWaves; i += 1)
thisXMin= xRange[i][0]
thisXMax= xRange[i][1]
if( thisXMin > thisXMax ) // swapped X range (X values decrease with increasing point number)
tmp= thisXMin
thisXMin= thisXMax
thisXMax= tmp
endif
firstAvePoint= ceil(x2pnt(AveW,thisXMin)) // truncate the partial point numbers...
lastAvePoint= floor(x2pnt(AveW,thisXMax)) // ... by indenting slightly
WAVE wy=$StringFromList(i,ListOfWaves)
Wave/Z wx= $StringFromList(i,ListOfXWaves)
for (point = firstAvePoint; point <= lastAvePoint; point += 1)
xVal= pnt2x(AveW, point)
if( WaveExists(wx) )
yVal= interp(xVal, wx, wy)
else
yVal= wy(xVal)
endif
if (numtype(yVal) == 0)
AveW[point] += yVal
TempNWave[point] += 1
endif
endfor
endfor
--Jim Prouty
Software Engineer, WaveMetrics, Inc.
September 21, 2013 at 01:00 pm - Permalink
Thank you for this - exactly what I was after. The panel is very useful for our experiments, thanks!
September 22, 2013 at 11:09 pm - Permalink