Acquisition procedure
Carlo
function master(experimenttime, recordingtime, duration, rate, savedrate, plotresolution,savepath)
variable experimenttime, recordingtime, duration, rate, savedrate, plotresolution
string savepath
variable psdflag=1 // first time, make the periodogram
NewPath/O Path1,savepath//defines where to save the file
// rate= sampling rate for data acquiring, like 40000 Hz
// savedrate= rate for high time-resolution data recording, like 200 Hz
// plotresolution= interval between each point on strip graph
// recordingtime= interval for saving on disk, like 10s or 30s
// experimenttime= global experiment time, after which acquisition stops, like 3600 s (break stops before and saves)
<!--break-->
string timenow=date()+" "+time() // date and time now
string filename
variable t0 = stopMSTimer(-2)/10^6 // consults the microseconds timer, from the moment of PC startup
variable t1=0, dt1=0, dt2=0 // time init
if (plotresolution<duration)
plotresolution=duration // cannot update faster than acquire
endif
make/O/N=0 timestrip //store the time
make/O/N=0 deflstrip //where to store the deflection every plotresolution>duration
make /O/N=0 variancestrip //where to store the variance every plotresolution>duration
setscale/P x, t1, (plotresolution), "s", timestrip, deflstrip, variancestrip
setscale/P y, 0,1,"V" deflstrip, variancestrip
setscale/P y,0,1,"s",timestrip
//display
display/W=(1,1,800,150) deflstrip vs timestrip
AppendToGraph/L=L2 variancestrip vs timestrip
ModifyGraph axisEnab(left)={0,0.45}
ModifyGraph axisEnab(L2)={0.55,1}
ModifyGraph freePos(L2)=0
ModifyGraph lblPosMode(L2)=2
ModifyGraph rgb(deflstrip)=(0,0,0)
make /O/N=0 storeaverage, storevariance, storetime, waveaverage, wavevariance, wavetime
display/W=(8, 310, 400,550) storeaverage vs storetime
variable acq_cycle=0 // counter for acquisition cycle
do //big loop for acquisition and plot
t1=stopMSTimer(-2)/10^6-t0 // evaluate the experimental time
//print "t1=",t1
waveacquire(t1, duration, rate, savedrate, psdflag) // DATA ACQUISITION
dt1+=stopMSTimer(-2)/10^6-t0-t1 // increment the delta time for plotting
dt2+=stopMSTimer(-2)/10^6-t0-t1 // increment the delta time for saving
insertpoints numpnts(storeaverage), numpnts(waveaverage), storeaverage // extends storeaverage
storeaverage[numpnts(storeaverage)-numpnts(waveaverage),
&&linewrap numpnts(storeaverage)-1]=waveaverage[p-numpnts(storeaverage)+numpnts(waveaverage)-1]
insertpoints numpnts(storevariance), numpnts(wavevariance), storevariance // extends storevariance
storevariance[numpnts(storevariance)-numpnts(wavevariance),
&&linewrap numpnts(storevariance)-1]=wavevariance[p-numpnts(storeaverage)+numpnts(waveaverage)-1]
insertpoints numpnts(storetime), numpnts(wavetime), storetime // extends storetime
storetime[numpnts(storetime)-numpnts(wavetime),
&&linewrap numpnts(storetime)-1]=wavetime[p-numpnts(storeaverage)+numpnts(waveaverage)-1]
acq_cycle=+1 //increment the counter for acquisition cycle
if (psdflag==1)
psdflag=0
endif // switches off psd
//print dt1," ",dt2
if (dt1>=plotresolution) // after exiting this loops, it adds a plot point ...
// insertpoints numpnts(deflstrip), 1, deflstrip, variancestrip // makes room
timestrip[numpnts(timestrip)]={stopMSTimer(-2)/10^6-t0} // to store the time too
deflstrip[numpnts(deflstrip)]={mean(storeaverage, pnt2x(storeaverage,
&&linewrap numpnts(storeaverage)-acq_cycle*rate/savedrate), pnt2x(storeaverage, numpnts(storeaverage)))}
variancestrip[numpnts(variancestrip)]={mean(storevariance, pnt2x(storevariance,
&&linewrap numpnts(storevariance)-acq_cycle*rate/savedrate), pnt2x(storevariance,
&&linewrap numpnts(storevariance)))/sqrt(acq_cycle*rate/savedrate)}
doupdate // explicitly ask to update the plots (in hope it has not done it before at insertpoint)
// print "plotplot"
dt1=0 //resets delta time for plotting
acq_cycle=0 // resets acquisition cycle, so it later knows what to use for plotting
endif
if (dt2>=recordingtime)
// saves storeaverage and storevariance on file with automatic names
// empty storeaverage and storevariance for next acquisitions
timenow=date()+" "+time() // updates time
filename="DeflectionStrip "+num2str(savedrate)+"Hz on "+timenow+"-"+num2istr(dt2)+".txt"
save /G/P=Path1 storetime storeaverage storevariance as filename
redimension/N=0 storetime, storeaverage, storevariance //clean up
dt2=0 //resets delta time for recording
psdflag=1
endif
while (t1<experimenttime)
// now save storeaverage and storevariance,
timenow=date()+" "+time() // updates time
filename="DeflectionStrip "+num2str(savedrate)+"Hz on "+timenow+"-"+num2istr(dt2)+".txt" // for saving
save /G/P=Path1 storetime storeaverage storevariance as filename
// and also save deflstrip and variancestrip
timenow=date()+" "+time() // updates time
filename="ExperimentStrip "+"finished on "+timenow+".txt" // for saving
save /G/P=Path1 timestrip deflstrip variancestrip as filename
//print "I want to save deflstrip and variancestrip"
// now acquire last PSD
waveacquire(t1, duration, rate, savedrate, 1) // DATA ACQUISITION (and saving of PSD)
end // of function
function waveacquire(t1, duration, rate, savedrate, psdflag)
variable t1, duration, rate, savedrate, psdflag
string timenow, filename
variable i=0
variable blocksize=rate/savedrate // blocksize for block averaging
variable segmentsize=0
if (duration*rate>8192*4)
segmentsize=8192// segment size for Periodogram calculation
else
segmentsize=(duration*rate)/5
endif
//print segmentsize
make/O/N=(rate*duration) wave0
make/O/N=(rate*duration/blocksize) wavevariance // wave variance decimated
make/O/N=(rate*duration/blocksize) waveaverage // wave after decimation
make/O/N=(rate*duration/blocksize) wavetime // to store the time points
make/O/N=0 media //to store the recordings
make/O/N=0 timepoints //to store the time of recordings
make/O/N=(segmentsize/2+1) periodogramdomain
// variable timezero=(stopMSTimer(-2)-t0)/10^6 // resets the time
//print timezero
setscale/P x, t1, (1/rate), "s", wave0 // sets the spacing of the wave, so the sampling rate
// next is commented so this is a SIMULATION for acquisition
DAQmx_scan/DEV="dev4" WAVES="wave0, 2;" //acquires from DEV device on channel 2 and puts in wave0
// must create a rate*duration size wave0
// for adding a frequency, use sin(freq*x*2*Pi) x is already scaled in 1/rate seconds
// variable phase=Pi*gnoise(1) // to start the noise at different phases
// wave0=gnoise(1)+10*sin(3000*x*2*Pi)+sin(0.1*x*2*Pi+phase)// 3000 Hz vibration+ 0.1Hz vibration + gaussian noise
// sleep/S duration // pause to simulate acquisition and do not mess the timings
if (psdflag==1)
DSPPeriodogram/Q/DLSG/NOR=(segmentsize*segmentsize/2)/SEGN={(segmentsize),(segmentsize/2)}/Win=hanning wave0
timenow=date()+" "+time() // updates time
filename="PSD "+num2str(savedrate)+"Hz on "+timenow+".txt" // for saving
periodogramdomain=pnt2x(W_periodogram, p)
save /G/P=Path1 periodogramdomain W_periodogram as filename
endif
wavevariance=variance(wave0, pnt2x(wave0, blocksize*p), pnt2x(wave0, (blocksize*(p+1))-1))/blocksize
setscale/P x, t1, blocksize*(1/rate), "s", wavevariance // sets the spacing of the wave, so the sampling rate
waveaverage=sum(wave0, pnt2x(wave0, blocksize*p), pnt2x(wave0, (blocksize*(p+1))-1))/blocksize
setscale/P x, t1, blocksize*(1/rate), "s", waveaverage // sets the spacing of the wave, so the sampling rate
wavetime=pnt2x(wavevariance, p) // timings from the scale (?)
variable stoptimer=stopMSTimer(-2) // stops the microseconds timer
end
<!--break-->
variable experimenttime, recordingtime, duration, rate, savedrate, plotresolution
string savepath
variable psdflag=1 // first time, make the periodogram
NewPath/O Path1,savepath//defines where to save the file
// rate= sampling rate for data acquiring, like 40000 Hz
// savedrate= rate for high time-resolution data recording, like 200 Hz
// plotresolution= interval between each point on strip graph
// recordingtime= interval for saving on disk, like 10s or 30s
// experimenttime= global experiment time, after which acquisition stops, like 3600 s (break stops before and saves)
<!--break-->
string timenow=date()+" "+time() // date and time now
string filename
variable t0 = stopMSTimer(-2)/10^6 // consults the microseconds timer, from the moment of PC startup
variable t1=0, dt1=0, dt2=0 // time init
if (plotresolution<duration)
plotresolution=duration // cannot update faster than acquire
endif
make/O/N=0 timestrip //store the time
make/O/N=0 deflstrip //where to store the deflection every plotresolution>duration
make /O/N=0 variancestrip //where to store the variance every plotresolution>duration
setscale/P x, t1, (plotresolution), "s", timestrip, deflstrip, variancestrip
setscale/P y, 0,1,"V" deflstrip, variancestrip
setscale/P y,0,1,"s",timestrip
//display
display/W=(1,1,800,150) deflstrip vs timestrip
AppendToGraph/L=L2 variancestrip vs timestrip
ModifyGraph axisEnab(left)={0,0.45}
ModifyGraph axisEnab(L2)={0.55,1}
ModifyGraph freePos(L2)=0
ModifyGraph lblPosMode(L2)=2
ModifyGraph rgb(deflstrip)=(0,0,0)
make /O/N=0 storeaverage, storevariance, storetime, waveaverage, wavevariance, wavetime
display/W=(8, 310, 400,550) storeaverage vs storetime
variable acq_cycle=0 // counter for acquisition cycle
do //big loop for acquisition and plot
t1=stopMSTimer(-2)/10^6-t0 // evaluate the experimental time
//print "t1=",t1
waveacquire(t1, duration, rate, savedrate, psdflag) // DATA ACQUISITION
dt1+=stopMSTimer(-2)/10^6-t0-t1 // increment the delta time for plotting
dt2+=stopMSTimer(-2)/10^6-t0-t1 // increment the delta time for saving
insertpoints numpnts(storeaverage), numpnts(waveaverage), storeaverage // extends storeaverage
storeaverage[numpnts(storeaverage)-numpnts(waveaverage),
&&linewrap numpnts(storeaverage)-1]=waveaverage[p-numpnts(storeaverage)+numpnts(waveaverage)-1]
insertpoints numpnts(storevariance), numpnts(wavevariance), storevariance // extends storevariance
storevariance[numpnts(storevariance)-numpnts(wavevariance),
&&linewrap numpnts(storevariance)-1]=wavevariance[p-numpnts(storeaverage)+numpnts(waveaverage)-1]
insertpoints numpnts(storetime), numpnts(wavetime), storetime // extends storetime
storetime[numpnts(storetime)-numpnts(wavetime),
&&linewrap numpnts(storetime)-1]=wavetime[p-numpnts(storeaverage)+numpnts(waveaverage)-1]
acq_cycle=+1 //increment the counter for acquisition cycle
if (psdflag==1)
psdflag=0
endif // switches off psd
//print dt1," ",dt2
if (dt1>=plotresolution) // after exiting this loops, it adds a plot point ...
// insertpoints numpnts(deflstrip), 1, deflstrip, variancestrip // makes room
timestrip[numpnts(timestrip)]={stopMSTimer(-2)/10^6-t0} // to store the time too
deflstrip[numpnts(deflstrip)]={mean(storeaverage, pnt2x(storeaverage,
&&linewrap numpnts(storeaverage)-acq_cycle*rate/savedrate), pnt2x(storeaverage, numpnts(storeaverage)))}
variancestrip[numpnts(variancestrip)]={mean(storevariance, pnt2x(storevariance,
&&linewrap numpnts(storevariance)-acq_cycle*rate/savedrate), pnt2x(storevariance,
&&linewrap numpnts(storevariance)))/sqrt(acq_cycle*rate/savedrate)}
doupdate // explicitly ask to update the plots (in hope it has not done it before at insertpoint)
// print "plotplot"
dt1=0 //resets delta time for plotting
acq_cycle=0 // resets acquisition cycle, so it later knows what to use for plotting
endif
if (dt2>=recordingtime)
// saves storeaverage and storevariance on file with automatic names
// empty storeaverage and storevariance for next acquisitions
timenow=date()+" "+time() // updates time
filename="DeflectionStrip "+num2str(savedrate)+"Hz on "+timenow+"-"+num2istr(dt2)+".txt"
save /G/P=Path1 storetime storeaverage storevariance as filename
redimension/N=0 storetime, storeaverage, storevariance //clean up
dt2=0 //resets delta time for recording
psdflag=1
endif
while (t1<experimenttime)
// now save storeaverage and storevariance,
timenow=date()+" "+time() // updates time
filename="DeflectionStrip "+num2str(savedrate)+"Hz on "+timenow+"-"+num2istr(dt2)+".txt" // for saving
save /G/P=Path1 storetime storeaverage storevariance as filename
// and also save deflstrip and variancestrip
timenow=date()+" "+time() // updates time
filename="ExperimentStrip "+"finished on "+timenow+".txt" // for saving
save /G/P=Path1 timestrip deflstrip variancestrip as filename
//print "I want to save deflstrip and variancestrip"
// now acquire last PSD
waveacquire(t1, duration, rate, savedrate, 1) // DATA ACQUISITION (and saving of PSD)
end // of function
function waveacquire(t1, duration, rate, savedrate, psdflag)
variable t1, duration, rate, savedrate, psdflag
string timenow, filename
variable i=0
variable blocksize=rate/savedrate // blocksize for block averaging
variable segmentsize=0
if (duration*rate>8192*4)
segmentsize=8192// segment size for Periodogram calculation
else
segmentsize=(duration*rate)/5
endif
//print segmentsize
make/O/N=(rate*duration) wave0
make/O/N=(rate*duration/blocksize) wavevariance // wave variance decimated
make/O/N=(rate*duration/blocksize) waveaverage // wave after decimation
make/O/N=(rate*duration/blocksize) wavetime // to store the time points
make/O/N=0 media //to store the recordings
make/O/N=0 timepoints //to store the time of recordings
make/O/N=(segmentsize/2+1) periodogramdomain
// variable timezero=(stopMSTimer(-2)-t0)/10^6 // resets the time
//print timezero
setscale/P x, t1, (1/rate), "s", wave0 // sets the spacing of the wave, so the sampling rate
// next is commented so this is a SIMULATION for acquisition
DAQmx_scan/DEV="dev4" WAVES="wave0, 2;" //acquires from DEV device on channel 2 and puts in wave0
// must create a rate*duration size wave0
// for adding a frequency, use sin(freq*x*2*Pi) x is already scaled in 1/rate seconds
// variable phase=Pi*gnoise(1) // to start the noise at different phases
// wave0=gnoise(1)+10*sin(3000*x*2*Pi)+sin(0.1*x*2*Pi+phase)// 3000 Hz vibration+ 0.1Hz vibration + gaussian noise
// sleep/S duration // pause to simulate acquisition and do not mess the timings
if (psdflag==1)
DSPPeriodogram/Q/DLSG/NOR=(segmentsize*segmentsize/2)/SEGN={(segmentsize),(segmentsize/2)}/Win=hanning wave0
timenow=date()+" "+time() // updates time
filename="PSD "+num2str(savedrate)+"Hz on "+timenow+".txt" // for saving
periodogramdomain=pnt2x(W_periodogram, p)
save /G/P=Path1 periodogramdomain W_periodogram as filename
endif
wavevariance=variance(wave0, pnt2x(wave0, blocksize*p), pnt2x(wave0, (blocksize*(p+1))-1))/blocksize
setscale/P x, t1, blocksize*(1/rate), "s", wavevariance // sets the spacing of the wave, so the sampling rate
waveaverage=sum(wave0, pnt2x(wave0, blocksize*p), pnt2x(wave0, (blocksize*(p+1))-1))/blocksize
setscale/P x, t1, blocksize*(1/rate), "s", waveaverage // sets the spacing of the wave, so the sampling rate
wavetime=pnt2x(wavevariance, p) // timings from the scale (?)
variable stoptimer=stopMSTimer(-2) // stops the microseconds timer
end
<!--break-->
Does it fail at run-time? If so, is there an error message? You should tell us what it is. A screen shot of an error alert is fine way to do that.
Maybe there is no message, but it doesn't do what you expect. If so, you should tell us what you expect and what it actually does.
That's a lot of code to look at if we have no guidance as to what is intended, and what goes wrong.
John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
July 14, 2015 at 09:32 am - Permalink
July 14, 2015 at 09:42 pm - Permalink
what kind of unfilled line?
July 15, 2015 at 12:45 am - Permalink
So, the problem is not due to an error that is to compile, because everything is working without error.
The problem is due to the fact that I may have made some mistakes in the PSD.
(I state that I am making acquisitions with national card and an AFM.)
sw creates a series of waves, of which the major that I need are deflection vs. time and variance vs time.
The curve deflection vs. time does not present problems, for the variance vs time curve instead, there are problems.
I expect that the curve should be very steady, without peaks or drift I assure you that is not due to electronic noise as the AFM is isolated and placed in a Faraday cage.
July 15, 2015 at 01:11 am - Permalink
In the mean time: Are all cables and connectors OK? Does the "artifact" arise from cross talk between the channels?
HJ
July 15, 2015 at 02:19 am - Permalink
experiment time: 3600s
duration: 30s
recording time: 30 seconds
saved rate: 200 Hz
plot resolution: 2
rate: 10000 hz
- Red = deflection vs. time (the correct curve because there is a thermal drift of the tip, and it is normal that it is negative)
- In blue = variance vs time that should not be so
all cables and connectors are OK, and I'm also acquiring from only one channel
July 15, 2015 at 02:34 am - Permalink
Your signal is in the order of 1e0 = 1.
Your variance is around 10e-9 and 8 orders of magnitude smaller. (I would consider this as smooth.)
Maybe you want similar axis ranges for both traces for checking
SetAxis right 0,1
HJ
July 15, 2015 at 02:43 am - Permalink
So why you see all those peaks? especially at different heights, and also there is a certain periodicity .....
However now I try, where should I put the "set axisis"?
here the first "display"?
display / W = (1,1,800,150) deflstrip vs Timestrip
AppendToGraph / L = L2 variancestrip vs Timestrip
ModifyGraph axisEnab (left) 0,0.45 = {}
ModifyGraph axisEnab (L2) = {0.55,1}
ModifyGraph FreePOS (L2) = 0
ModifyGraph lblPosMode (L2) = 2
ModifyGraph rgb (deflstrip) = (0,0,0)
////////NEW/////
SetAxis left 0,1
SetAxis right 0,1
July 15, 2015 at 03:19 am - Permalink
As the manual says, you can also use the /R flag to use the right axis...
I don't know your experiment and you are generally not providing much information. All I can tell you is that your variance is 8 orders of magnitude smaller than your signal. If you expect it to be 6 orders of magnitude smaller I would say this is good. If you expect it to be 20 orders smaller I would say it's very bad. (Just random numbers for illustration!)
The right axis range should not be smaller than your expected variance. Maybe add some waves to the graph indicating this limit. Otherwise the autoscale feature might make you think that there are peaks but in fact it's just low level noise.
HJ
July 15, 2015 at 03:33 am - Permalink
So I load the file wiht:
loadwave/g
display deflection(deflstrip) vs time(timestrip)
appendtogrpah/r variance(variancestrip) vs time(timestrip)
July 15, 2015 at 06:54 am - Permalink
July 15, 2015 at 10:49 am - Permalink