Programming help for new user
pareitu3
I'm new to Igor (and programming!) and want to apologize in advance for the basic question. I've just started going through the manual but have a somewhat urgent deadline and would be very grateful for some help pointing me in the right direction.
I have two waves, x and V. I need to find the maximum V for every group of 32 points. These maxima would ideally be interpolated, and I should note that every group of points takes the shape of a smooth, yet antisymmetric peak. I then need to make a wave of the x-values corresponding to these maximum V-values. Because I'm working with a high volume of data, manually plotting/calculating this is not feasible. Every set of 32 x-values is identical.
Where would be the best place to start in order to figure this out quickly? I got Igor today and have been going through the tutorial and programming section to get started. I still feel like I'm a long way away from being able to write a program from scratch and am not sure how to go about my main task.
Thanks!
// Finds the peak in each segment.
// Output waves are named after input wave. For example, if the input wave
// is wave0, the output waves are wave0_spx and wave0_spy.
// Example:
// Make/O/N=1000 wave0
// SetScale/P x 0, .1, "s", wave0
// wave0 = abs(sin(x))
// Display wave0
// FindSegmentPeaks(wave0, 32)
// AppendToGraph wave0_spy vs wave0_spx
// ModifyGraph rgb(wave0_spy)=(0,0,65535)
// ModifyGraph mode(wave0_spy)=2, lsize(wave0_spy)=3
// Edit wave0_spx, wave0_spy
Function FindSegmentPeaks(wIn, segmentLength)
Wave wIn // e.g., wave0
Variable segmentLength // e.g., 32
Variable numPoints = numpnts(wIn)
Variable numSegments = trunc(numPoints / segmentLength) // Partial segment at end is ignored
if (numSegments <= 0)
Abort "Not enough input points"
endif
String wOutNameX = NameOfWave(wIn) + "_spx"
Make/O/D/N=(numSegments) $wOutNameX
Wave wOutX = $wOutNameX
String wOutNameY = NameOfWave(wIn) + "_spy"
Make/O/D/N=(numSegments) $wOutNameY
Wave wOutY = $wOutNameY
Variable i
for(i=0; i<numSegments; i+=1)
Variable startPoint = segmentLength*i, startX = pnt2x(wIn, startPoint)
Variable endPoint = startPoint+segmentLength-1, endX = pnt2x(wIn, endPoint)
// FindPeak sets V_PeakLoc and V_PeakVal
FindPeak /Q/R=(startX,endX) wIn // Find peak for this segment
if (V_flag == 0) // Success
wOutX[i] = V_PeakLoc
wOutY[i] = V_PeakVal
else
wOutX[i] = NaN
wOutY[i] = NaN
endif
endfor
End
Function DemoFindSegmentPeaks()
Make/O/N=1000 wave0
SetScale/P x 0, .1, "s", wave0
wave0 = abs(sin(x))
Display wave0
FindSegmentPeaks(wave0, 32)
AppendToGraph wave0_spy vs wave0_spx
ModifyGraph rgb(wave0_spy)=(0,0,65535)
ModifyGraph mode(wave0_spy)=2, lsize(wave0_spy)=3
Edit wave0_spx, wave0_spy
End
July 22, 2010 at 10:50 pm - Permalink
Wow, thank you so much. I really appreciate it!!
July 26, 2010 at 03:47 pm - Permalink