Hi,
I have 2 graphs on one figure.
Graph one - subplot(2,1,1) velocities vs ( Time or SampleIndex) depending in input args
Graph two - subplot(2,1,2) psd() - power spectrum to help us find the resonances in velocities
As system goes through a number of different states, the resonances change during the cycle, so I need to zoomIn GraphOne to an area of interest, then re-calc the power spectrum on that portion of data only.
I have something that works in the xaxis=SampleIndex scenario, but fails in the xaxis=Time scenario, I am wondering if I am going about it the right way.
The following page has 4 graphs that show what I have working now (2 graphs of velocity vs SampleNo), and the failing case (2 graphs of Velocity Vs Time)
*http://tinyurl.com/2xpyly
···
*
I'll describe what I got.
I connected my function RecalcPowerSpectrum to ReleaseButton event
pylab.connect( 'button_release_event', RecalcPowerSpectrum)
It's ugly and crude, but if GraphOne is a velocity vs sampleIndex, the following works.
My issues start when you look at how I am slicing (if thats the right word) the array I pass into psd() and where those values come from.
def RecalcPowerSpectrum( event ): global myAxis
global lastXstart
global lastXend
xlim = myAxis.get_xlim()
xstart = int(xlim[0])
xend = int(xlim[1])
if xstart != lastXstart or xend != lastXend:
print '%s event detected, re-calc power spectrum' % event.name
lastXstart, lastXend = xstart, xend
lastXlimits = xlim
print 'xlim1 =', xstart
print 'xlim2 =', xend pylab.cla()
if secondGraph == 'fft':# (plot UDR1 points)
Fs = 2 * targetvel
fftdata = pylab.psd(vel[2*xstart:2*xend], NFFT=winsize, Fs=Fs, detrend=pylab.mlab.detrend_linear, window=pylab.mlab.window_hanning, noverlap=overlap)
else: #must be a fft2 (plot UDR2 points)
Fs = targetvel
fftdata = pylab.psd(combined[xstart:xend], NFFT=winsize, Fs=Fs, detrend=pylab.mlab.detrend_linear, window=pylab.mlab.window_hanning, noverlap=overlap)
This fails when I run my program to plot with xaxis in time as the values returned by get_xlim() are small (0.46408074411240841, 0.53334652681575301), once I int() these values they are both 0
Clearly I am trying to work with the wrong values. I actually want to get the indexes of these values. So I can pass the proper slice of the original array into the psd function.
So my questions.
1) Is there a way to get the indexes (not the values) of the portion of the line actually showing on screen
2) Is there a way to get a copy of the portion of the data displayed on screen (in a new array) ?
3) Is there a better way of linking psd so it performs the spectrum analysis only on the portion of data on screen?
*
*Thanks for your help
Steve