Sliding Window Over Wave
rhjpires
I have started to write a piece of code to help me with an analysis of some time series data, and I am stumbling with something which is likely to be pretty simple. The code is below, relevant info in comment sections:
// This aims at defining a window (or bin) that will slide along a waveform,
// perform FFT analysis and curve fitting and to retrieve fit values at each window position
// before moving on to the next position as defined by a given step-size and looping until
// all data-points are exhausted.
Function TestForSlide()
Wave Wave_WF
//Find window size in terms of points for an input seconds
Variable N = numpnts(Wave_WF)
Variable L = 60 //window size in seconds has to be prompted to user
variable size, j, k
For (size=0; size<N+1; size+=1)
j = pnt2x(Wave_WF, size)
If(j<L)
continue
else
print "window size of ", j, "seconds, corresponds to ", size, "points"
break
endIf
endfor
// slide the window over data in defined stepsizes and do something (currently, do average) at each step
// at each step also gather info and store it in a wave.
variable wleft, wright
variable step = 1 //stepsize in datapoints
Wave Averages
For (wleft=0; wleft<=N; wleft+=step)
wright = wleft+size
WaveStats /Q /R=[wleft, wright] Wave_WF
print "Window from ", wleft, "to ", wright, "has an average of ", V_avg
Averages[wleft]=V_avg
If (wright<N)
continue
else
break
endIF
endFor
end
// perform FFT analysis and curve fitting and to retrieve fit values at each window position
// before moving on to the next position as defined by a given step-size and looping until
// all data-points are exhausted.
Function TestForSlide()
Wave Wave_WF
//Find window size in terms of points for an input seconds
Variable N = numpnts(Wave_WF)
Variable L = 60 //window size in seconds has to be prompted to user
variable size, j, k
For (size=0; size<N+1; size+=1)
j = pnt2x(Wave_WF, size)
If(j<L)
continue
else
print "window size of ", j, "seconds, corresponds to ", size, "points"
break
endIf
endfor
// slide the window over data in defined stepsizes and do something (currently, do average) at each step
// at each step also gather info and store it in a wave.
variable wleft, wright
variable step = 1 //stepsize in datapoints
Wave Averages
For (wleft=0; wleft<=N; wleft+=step)
wright = wleft+size
WaveStats /Q /R=[wleft, wright] Wave_WF
print "Window from ", wleft, "to ", wright, "has an average of ", V_avg
Averages[wleft]=V_avg
If (wright<N)
continue
else
break
endIF
endFor
end
I get an error of trying to operate on a null or missing wave.
I guess this has to do with my Averages wave. What am I doing wrong?
Cheers,
R.
Couldn't you replace the first for loop with
x2pnt
? It seems like you are looking for the point corresponding to an x-value of 'L'You could also include your additional continue/break condition into the loop using
for (wleft=0; (wleft<=N) && (wright<N); wleft+=step)
or something similar, but since wright is always larger than wleft, you could skip the wleft condition altogether
for (wleft=0; (wright<N); wleft+=step)
or even better base the for loop on wright instead of wleft
for (wright=size; (wright<N); wright+=step)
March 4, 2017 at 11:38 am - Permalink
I'm guessing that when you run the function you don't have the averages wave? If so then you need to make it with the
Make
command. This will also declare the wave. If I'm right, you are just declaring a wave which doesn't exist so Igor doesn't know what to do with the assignments in your loop.So instead of
Wave Averages
Go for
Make/O/N=(N) Averages
for(wleft = 0; wleft < N; wleft += 1)
//...
March 6, 2017 at 04:30 am - Permalink
I made alterations in the
FOR
loops and went forMAKE
the wave instead of simply declaring it and it now works.So, I have also implemented the FFTs and gaussian fits to this, and am testing it now. I will probably put here more questions on this later!
Cheers,
R.
March 6, 2017 at 02:56 am - Permalink