changeset 133:7540703b8473

Major code cleanup. Implement beatnote recentering.
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Wed, 22 Jan 2014 12:10:17 +0100
parents fbd72d87b4dc
children bd28161e5ac2
files FXAnalyse.c FXAnalyse.h FXAnalyse.uir stat.c stat.h
diffstat 5 files changed, 336 insertions(+), 283 deletions(-) [+]
line wrap: on
line diff
--- a/FXAnalyse.c	Tue Dec 17 17:21:17 2013 +0100
+++ b/FXAnalyse.c	Wed Jan 22 12:10:17 2014 +0100
@@ -14,6 +14,7 @@
 #include "DDS4xAD9912.h"
 #include "DDS_Fox.h" 
 #include "muParserDLL.h"
+#include "stat.h"
 
 #define SR_LOGGER_IP "145.238.204.91"
 #define DATAFOLDER "Z:\\Measures-2013"
@@ -118,38 +119,64 @@
 volatile bool Getsign1=FALSE,Getsign2=FALSE,Getsign3=FALSE;
 double Sign1=1.0, Sign2=1.0, Sign3=0.0;
 
-// slope cancelling
+
+struct stat stat_math1, stat_ch2, stat_ch3, stat_ch4, freq;
+struct rollmean rollmean_ch1, rollmean_ch2, rollmean_ch3, rollmean_ch4;
+
 
-double dedrift_DDS_freq = 70e6;
-int SlopeMeasuring = FALSE;
-int StopSlopeCancellingOnUnlocked = TRUE;
-double TimetoSlope = 60.0;
-double SlopeMeasuringTimeBegin = 0.0;
-double appliedSlope = 0.0; // currently applied frequency dedrifiting slope
-int slopeX2 = FALSE;
-
-double limitotakoff=70.0;
-
-int ratio=10; //Recentre la frequence tous les ratios
-
-int FrequCorrec = FALSE, KeepFrequ = TRUE, KeepSlope = TRUE;
-int Nratio = -1;
-double MoyMath2 = 0.0, CenterFrequencyCh2 = 0.0;
-int CenterFrequencyCh2ToDetermine = FALSE;
+// dedrift
+struct dedrift {
+	int enabled;        // dedrift enabled
+	int reference;      // reference frequency
+	int invert;         // invert applied slope sign
+	int doubleslope;    // double applied slope
+	int keep_freq;      // keep current frequency value when dedrift is disabled
+	int keep_slope;     // keep current slope value when dedrift is disabled
+	double freq0;       // DDS center frequency
+	double threshold;   // maximum allowed frequency change
+	double applied;     // currently applied slope
+	double interval;    // measurement duration
+	double t0;          // beginning of currrent measurement interval
+};
 
 enum {
-	SLOPE_REFERENCE_MICROWAVE = 0,
-	SLOPE_REFERENCE_HG_CAVITY = 1,
+	DEDRIFT_REFERENCE_MICROWAVE = 0,
+	DEDRIFT_REFERENCE_HG = 1,
+};
+
+struct dedrift dedrift = {
+	.enabled = FALSE,
+	.reference = DEDRIFT_REFERENCE_MICROWAVE,
+	.invert = FALSE,
+	.doubleslope = FALSE,
+	.keep_freq = TRUE,
+	.keep_slope = TRUE,
+	.freq0 = 70e6,
+	.threshold = 100.0,
+	.applied = 0.0,
+	.interval = 40.0,
+	.t0 = 0.0
 };
 
-int invertSlopeSign = 0;
-int slopeReference = SLOPE_REFERENCE_MICROWAVE;
 
-int KeepCentering = FALSE; 
-double Timetorecenter275K = 3600.0 * 10;
-double Timetorecenter10K = 3600.0 * 3;
-double CenteringTimeBegin275K = 0.0;
-double CenteringTimeBegin10K = 0.0;
+// recenter
+struct recenter {
+	int enabled;		// recenter enabled
+	int Lo;				// recenter microwave beatnote
+	int Sr;				// recenter Sr beatnote
+	int Hg;				// recenter Hg beatnote
+	double interval;	// interval
+	double t0;			// beginning of current interval
+};
+
+struct recenter recenter = {
+	.enabled = FALSE,
+	.Lo = FALSE,
+	.Sr = FALSE,
+	.Hg = FALSE,
+	.interval = 1800.0,
+	.t0 = 0.0
+};
 
 
 // panels
@@ -184,35 +211,6 @@
 }
 
 
-struct stat {
-	int samples;
-	double mean;
-	double slope;
-	double previous;
-};
-
-void stat_zero(struct stat *s)
-{
-	s->samples = 0;
-	s->mean = 0.0;
-	s->slope = 0.0;
-	s->previous = 0.0;
-}
-
-void stat_accumulate(struct stat *s, double value)
-{
-	s->samples += 1;
-	
-	if (s->samples > 1)
-		s->slope = (s->slope * (s->samples - 2) + 6 * (value - s->mean) / s->samples) / (s->samples + 1);
-					
-	s->mean = ((s->samples - 1) * s->mean + value) / s->samples;
-	
-	s->previous = value;
-}
-
-struct stat stat_math1, stat_ch2, stat_ch4, stat_ch3, freq;
-
 #define MIN(x, y) (x) < (y) ? (x) : (y)
 
 // MJD functiom used by the Sr programs
@@ -377,7 +375,7 @@
 	DDS4xAD9912_SetFrequency(&DDS4xAD9912, 4, frequency);
 	
 	// initialyze 1x AD9956 DDS box
-	DDSFox_Initialize(&DDS1xAD9956, "145.238.205.58", 6665, dedrift_DDS_freq);
+	DDSFox_Initialize(&DDS1xAD9956, "145.238.205.58", 6665, dedrift.freq0);
 	
 	Ch1 = Ch2 = Ch3 = Ch4 = 0.0;
 	
@@ -661,8 +659,6 @@
 				SetCtrlVal(MainPanel, PANEL_CH2, Ch2);
 				SetCtrlVal(MainPanel, PANEL_CH3, Ch3);  
 				SetCtrlVal(MainPanel, PANEL_CH4, Ch4);
-
-				SetCtrlVal(MainPanel, PANEL_CENTERFREQUENCY, CenterFrequencyCh2);
 				
 				// compute
 				Math1 = mupEval(MathParser1);
@@ -1297,105 +1293,112 @@
 				}
 				
 				// select reference
-				double current = 0.0;
-				switch (slopeReference) {
-					case SLOPE_REFERENCE_MICROWAVE:
-						current = Math2;
+				double f = 0.0;
+				switch (dedrift.reference) {
+					case DEDRIFT_REFERENCE_MICROWAVE:
+						f = Math2;
 						break;
-					case SLOPE_REFERENCE_HG_CAVITY:
-						current = Ch2 * 1062.5 / 1542.2;
+					case DEDRIFT_REFERENCE_HG:
+						f = Ch2 * 1062.5 / 1542.2;
 						break;
 				}
 				
-				// stop slope cancelling if the comb is not locked
-				if (SlopeMeasuring & StopSlopeCancellingOnUnlocked
+				// stop dedrift if the comb is not locked
+				if ((dedrift.enabled)
+					& (dedrift.threshold != 0.0)
 					& (freq.previous != 0.0)
-					& (fabs(current - freq.previous) > limitotakoff)) {
+					& (fabs(f - freq.previous) > dedrift.threshold)) {
 						
-					if (! KeepSlope) {
-						appliedSlope = 0.0;
-						DDSFox_SetSweepRate(&DDS1xAD9956, appliedSlope);
-						SetCtrlVal(MainPanel, PANEL_SLOPE_APPLIED, appliedSlope);
+					if (! dedrift.keep_slope) {
+						dedrift.applied = 0.0;
+						DDSFox_SetSweepRate(&DDS1xAD9956, dedrift.applied);
+						SetCtrlVal(MainPanel, PANEL_SLOPE_APPLIED, dedrift.applied);
 					}
-					if (! KeepFrequ) {
-						DDSFox_Set(&DDS1xAD9956, dedrift_DDS_freq, appliedSlope);
+					if (! dedrift.keep_freq) {
+						DDSFox_Set(&DDS1xAD9956, dedrift.freq0, dedrift.applied);
 					}
 					
 					stat_zero(&freq);
 					SetCtrlVal(MainPanel, PANEL_SLOPE_MEASURED, freq.slope);
-					SlopeMeasuring = FALSE;
+					dedrift.enabled = FALSE;
 					SetCtrlVal(MainPanel, PANEL_MEASURE_SLOPE, 0);
 				}
 				
-				// slope measurement 
-				if (SlopeMeasuring)
+				// dedrifting 
+				if (dedrift.enabled)
 				{
 					// update slope measurement
-					stat_accumulate(&freq, current);
+					stat_accumulate(&freq, f);
 					
 					// update indicator
 					SetCtrlVal(MainPanel, PANEL_SLOPE_MEASURED, freq.slope);
 					
 					// update applied slope
-					if ((utc - SlopeMeasuringTimeBegin) > TimetoSlope) {
+					if ((utc - dedrift.t0) > dedrift.interval) {
 						
-						if (invertSlopeSign)
-							appliedSlope = appliedSlope - freq.slope;
+						if (dedrift.invert)
+							dedrift.applied -= freq.slope;
 						else
-							appliedSlope = appliedSlope + freq.slope;
+							dedrift.applied += freq.slope;
 						
-						if (FrequCorrec) {
-							// proportional correction
-							
-							Nratio += 1;
-							if (Nratio >= 1) {
-								MoyMath2 = MoyMath2 + freq.mean;
-							}
-							if (Nratio == 1 && CenterFrequencyCh2ToDetermine == TRUE) {
-								CenterFrequencyCh2 = MoyMath2;
-								CenterFrequencyCh2ToDetermine = FALSE;
-							}
-							if (Nratio == ratio) {
-								double correction = (MoyMath2/ratio-CenterFrequencyCh2)/TimetoSlope;
-								appliedSlope = appliedSlope + correction;
-								Nratio = 0;
-								MoyMath2 = 0.0;
-							}
-						}
+						SetCtrlVal(MainPanel, PANEL_SLOPE_APPLIED, dedrift.applied);
 						
-						SetCtrlVal(MainPanel, PANEL_SLOPE_APPLIED, appliedSlope);
-						if (slopeX2)
-							DDSFox_SetSweepRate(&DDS1xAD9956, appliedSlope * 2.0);
+						if (dedrift.doubleslope)
+							DDSFox_SetSweepRate(&DDS1xAD9956, dedrift.applied * 2.0);
 						else
-							DDSFox_SetSweepRate(&DDS1xAD9956, appliedSlope);
+							DDSFox_SetSweepRate(&DDS1xAD9956, dedrift.applied);
 						
-						logmsg("Slope correction update (%+6g) %6g", freq.slope, appliedSlope);
+						logmsg("dedrift update (%+6g) %6g", freq.slope, dedrift.applied);
 						
 						stat_zero(&freq);
-						SlopeMeasuringTimeBegin = utc;
+						dedrift.t0 = utc;
 					}
 				}
 				
-				// re-centering
-				if (KeepCentering) {
-					if ((utc - CenteringTimeBegin275K) > Timetorecenter275K && CenteringTimeBegin275K > 10) {
-						double frequency;
-						GetCtrlVal(MainPanel, PANEL_DDS2, &frequency);
-						// adjust DDS2 frequency to keep Ch4 reading around 275000
-						frequency = frequency + 275000 - Ch4;
-						SetCtrlVal(MainPanel, PANEL_DDS2, frequency);
-						DDS4xAD9912_SetFrequency(&DDS4xAD9912, 2, frequency);
-						CenteringTimeBegin275K = utc;
+				// recenter
+				if (recenter.enabled)
+				{
+					if (recenter.t0 == 0.0) {
+						recenter.t0 = utc;
+						rollmean_zero(&rollmean_ch2, ROLLMEAN_N_OBS);
+						rollmean_zero(&rollmean_ch3, ROLLMEAN_N_OBS);
+						rollmean_zero(&rollmean_ch4, ROLLMEAN_N_OBS);
 					}
 					
-					if ((utc - CenteringTimeBegin10K) > Timetorecenter10K && CenteringTimeBegin10K > 10) {
-						double frequency;
-						GetCtrlVal(MainPanel, PANEL_DDS3, &frequency);
-						// adjust DDS3 frequency to keep Ch2 reading around 10000
-						frequency = frequency + 10000 - Ch2;
-						SetCtrlVal(MainPanel, PANEL_DDS3, frequency);
-						DDS4xAD9912_SetFrequency(&DDS4xAD9912, 3, frequency);
-						CenteringTimeBegin10K = utc;
+					rollmean_accumulate(&rollmean_ch2, Ch2);
+					rollmean_accumulate(&rollmean_ch3, Ch3);
+					rollmean_accumulate(&rollmean_ch4, Ch4);
+					
+					if ((utc - recenter.t0) > recenter.interval) {
+		
+						if (recenter.Lo) {
+							// adjust DDS2 frequency to keep Ch4 reading at 275 kHz
+							double freq = DDS4xAD9912_GetFrequency(&DDS4xAD9912, 2);
+							freq = freq + 275000.0 - rollmean_ch4.mean;
+							SetCtrlVal(MainPanel, PANEL_DDS2, freq);
+							DDS4xAD9912_SetFrequency(&DDS4xAD9912, 2, freq);
+						}
+					
+						if (recenter.Hg) {
+							// adjust DDS3 frequency to keep Ch2 reading at 10 kHz
+							double freq = DDS4xAD9912_GetFrequency(&DDS4xAD9912, 3);
+							freq = freq + 10000 - rollmean_ch2.mean;
+							SetCtrlVal(MainPanel, PANEL_DDS3, freq);
+							DDS4xAD9912_SetFrequency(&DDS4xAD9912, 3, freq);
+						}
+					
+						if (recenter.Sr) {
+							// adjust DDS3 frequency to keep Ch3 reading at 10 kHz
+							double freq = DDS4xAD9912_GetFrequency(&DDS4xAD9912, 3);
+							freq = freq + 10000 - rollmean_ch3.mean;
+							SetCtrlVal(MainPanel, PANEL_DDS3, freq);
+							DDS4xAD9912_SetFrequency(&DDS4xAD9912, 3, freq);
+						}
+					
+						recenter.t0 = utc;
+						rollmean_zero(&rollmean_ch2, ROLLMEAN_N_OBS);
+						rollmean_zero(&rollmean_ch3, ROLLMEAN_N_OBS);
+						rollmean_zero(&rollmean_ch4, ROLLMEAN_N_OBS);
 					}
 				}
 				
@@ -1955,7 +1958,8 @@
 		void *callbackData, int eventData1, int eventData2)
 {
 	
-	switch (event) {
+	switch (event)
+	{
 		case EVENT_COMMIT:
 			switch (control)
 			{
@@ -2024,7 +2028,8 @@
  int  CVICALLBACK CB_OnChangeNdiv (int panel, int control, int event, 
 		 void *callbackData, int eventData1, int eventData2)
 {
-	switch (event) {
+	switch (event)
+	{
 		case EVENT_COMMIT:
 			GetCtrlVal(MainPanel, PANEL_CHANGENDIV, &Ndiv);
 			FrequDDS1 = 880000000.0 / Ndiv;
@@ -2039,36 +2044,26 @@
  int  CVICALLBACK CB_MeasureSlope (int panel, int control, int event, 
 		 void *callbackData, int eventData1, int eventData2)
 {
-	switch (event) {
+	switch (event)
+	{
 		case EVENT_COMMIT:
-				   
-			GetCtrlVal(panel, control, &SlopeMeasuring);
-			if (SlopeMeasuring) {
-				
-				SlopeMeasuringTimeBegin = utc;
-				
+			GetCtrlVal(panel, control, &dedrift.enabled);
+			if (dedrift.enabled) {
+				dedrift.t0 = utc;
 				stat_zero(&freq);
-				
-				Nratio = -1;
-				MoyMath2 = 0.0; 
-				CenterFrequencyCh2ToDetermine = TRUE ;
-				CenterFrequencyCh2 = 0.0;
-				
-				logmsg("Start slope measurement");
-				
+				logmsg("dedrift start");
 			} else {
-				if (! KeepSlope) {
-					appliedSlope = 0.0;
-					DDSFox_SetSweepRate(&DDS1xAD9956, appliedSlope);
-					SetCtrlVal(MainPanel, PANEL_SLOPE_APPLIED, appliedSlope);
+				if (! dedrift.keep_slope) {
+					dedrift.applied = 0.0;
+					DDSFox_SetSweepRate(&DDS1xAD9956, dedrift.applied);
+					SetCtrlVal(MainPanel, PANEL_SLOPE_APPLIED, dedrift.applied);
 				}
-				if (! KeepFrequ) {
-					DDSFox_Set(&DDS1xAD9956, dedrift_DDS_freq, appliedSlope);
+				if (! dedrift.keep_freq) {
+					DDSFox_Set(&DDS1xAD9956, dedrift.freq0, dedrift.applied);
 				}
 				stat_zero(&freq);
 				SetCtrlVal(panel, PANEL_SLOPE_MEASURED, freq.slope);
-				
-				logmsg("Stop slope measurement");
+				logmsg("dedrift stop");
 			}
 			break;
 	}
@@ -2080,16 +2075,13 @@
 		void *callbackData, int eventData1, int eventData2)
 {
 
-	switch (event) {
+	switch (event)
+	{
 		case EVENT_COMMIT:
-			CenterFrequencyCh2 = 0.0;
-			MoyMath2 = 0.0;
-			Nratio = -1;
-			CenterFrequencyCh2ToDetermine = TRUE ;
-			appliedSlope = 0.0; 
-			SetCtrlVal(panel, PANEL_SLOPE_APPLIED, appliedSlope);
-			DDSFox_Set(&DDS1xAD9956, dedrift_DDS_freq, appliedSlope);
-			logmsg("Reset slope measurement");
+			dedrift.applied = 0.0; 
+			SetCtrlVal(panel, PANEL_SLOPE_APPLIED, dedrift.applied);
+			DDSFox_Set(&DDS1xAD9956, dedrift.freq0, dedrift.applied);
+			logmsg("dedrift reset");
 			break;
 	}
 	return 0;
@@ -2100,9 +2092,10 @@
 		void *callbackData, int eventData1, int eventData2)
 {
 
-	switch (event) {
+	switch (event)
+	{
 		case EVENT_COMMIT:
-			GetCtrlVal(MainPanel, PANEL_SLOPETIME, &TimetoSlope); 
+			GetCtrlVal(MainPanel, PANEL_SLOPETIME, &dedrift.interval); 
 			break;
 	}
 	return 0;
@@ -2112,23 +2105,24 @@
 int  CVICALLBACK CB_OnCROX (int panel, int control, int event, 
 		 void *callbackData, int eventData1, int eventData2)
 {
-	switch (event) {
+	switch (event)
+	{
 		case EVENT_COMMIT:
 			switch (control) {
 				
 				case PANEL_CHECKBOX_CORRFREQU:
 					// enable frequency correction
-				   	GetCtrlVal(MainPanel, PANEL_CHECKBOX_CORRFREQU, &FrequCorrec);
+				   	// GetCtrlVal(MainPanel, PANEL_CHECKBOX_CORRFREQU, &FrequCorrec);
 					break;
 			
 				case PANEL_CHECKBOX_KEEP:
 					// keep current dedrifting frequency when dedrifting is disabled
-				   	GetCtrlVal(MainPanel, PANEL_CHECKBOX_KEEP, &KeepFrequ);
+				   	GetCtrlVal(MainPanel, PANEL_CHECKBOX_KEEP, &dedrift.keep_freq);
 					break;
 					
 				case PANEL_CHECKBOX_KEEPSLOPE:
 					// keep current dedrifting slope when dedrifting is disabled
-				   	GetCtrlVal(MainPanel, PANEL_CHECKBOX_KEEPSLOPE, &KeepSlope);
+				   	GetCtrlVal(MainPanel, PANEL_CHECKBOX_KEEPSLOPE, &dedrift.keep_slope);
 					break;
 			}
  			break;
@@ -2141,28 +2135,13 @@
 int  CVICALLBACK CB_OnReCentering (int panel, int control, int event, 
 		 void *callbackData, int eventData1, int eventData2)
 {
-		bool BoxChecked = FALSE; 
-
 	switch (event)
-		{
+	{
 		case EVENT_COMMIT:
-			
-			if (control== PANEL_CHECKBOX_RECENTER)  
-			{
-				   	GetCtrlVal(MainPanel, PANEL_CHECKBOX_RECENTER, &BoxChecked) ;
-						if (BoxChecked) {
-							KeepCentering=TRUE ;
-							CenteringTimeBegin275K=utc;
-							CenteringTimeBegin10K=utc;
-							}
-						else {KeepCentering=FALSE ;}
-							
-			}
-			
-			
+			GetCtrlVal(panel, control, &recenter.enabled);
+			recenter.t0 = 0.0;
  			break;
-			
-		}
+	}
 	return 0;
 }
 
@@ -2170,10 +2149,12 @@
 int  CVICALLBACK CB_OnStopSlopeCancellingOnUnlocked (int panel, int control, int event, 
 		 void *callbackData, int eventData1, int eventData2)
 {
+	int value;
 	switch (event)
 	{
 		case EVENT_COMMIT:
-			GetCtrlVal(MainPanel, PANEL_CHECKBOX_STOPIFAUTODE, &StopSlopeCancellingOnUnlocked);
+			GetCtrlVal(MainPanel, PANEL_CHECKBOX_STOPIFAUTODE, &value);
+			dedrift.threshold = value ? 100.0 : 0.0;
 			break;
 	}
 	return 0;
@@ -2185,7 +2166,7 @@
 	switch (event)
 	{
 		case EVENT_COMMIT:
-			GetCtrlVal(MainPanel, PANEL_SLOPE_REFERENCE, &slopeReference);
+			GetCtrlVal(MainPanel, PANEL_SLOPE_REFERENCE, &dedrift.reference);
 			break;
 	}
 	return 0;
@@ -2278,8 +2259,8 @@
 	switch (event)
 	{
 		case EVENT_COMMIT:
-			GetCtrlVal(panel, control, &appliedSlope);
-			DDSFox_SetSweepRate(&DDS1xAD9956, appliedSlope);
+			GetCtrlVal(panel, control, &dedrift.applied);
+			DDSFox_SetSweepRate(&DDS1xAD9956, dedrift.applied);
 			break;
 	}
 	return 0;
@@ -2291,7 +2272,7 @@
 	switch (event)
 	{
 		case EVENT_COMMIT:
-			GetCtrlVal(panel, control, &invertSlopeSign);
+			GetCtrlVal(panel, control, &dedrift.invert);
 			break;
 	}
 	return 0;
@@ -2304,19 +2285,15 @@
 	{
 		case EVENT_COMMIT:
 			// stop slope measurement and reset slope 
-			SlopeMeasuring = 0;
-			SetCtrlVal(panel, PANEL_MEASURE_SLOPE, SlopeMeasuring);
-			CenterFrequencyCh2 = 0.0;
-			MoyMath2 = 0.0;
-			Nratio = -1;
-			CenterFrequencyCh2ToDetermine = TRUE ;
-			appliedSlope = 0.0;
-			SetCtrlVal(panel, PANEL_SLOPE_APPLIED, appliedSlope);
+			dedrift.enabled = FALSE;
+			SetCtrlVal(panel, PANEL_MEASURE_SLOPE, 0);
+			dedrift.applied = 0.0;
+			SetCtrlVal(panel, PANEL_SLOPE_APPLIED, dedrift.applied);
 			// reset DDS
 			DDSFox_Reset(&DDS1xAD9956);
 			DDSFox_SetProfile(&DDS1xAD9956);
 			DDSFox_SetDiv(&DDS1xAD9956, 1);
-			DDSFox_Set(&DDS1xAD9956, dedrift_DDS_freq, appliedSlope);
+			DDSFox_Set(&DDS1xAD9956, dedrift.freq0, 0.0);
 			break;
 	}
 	return 0;
@@ -2367,7 +2344,7 @@
 	switch (event)
 	{
 		case EVENT_COMMIT:
-			GetCtrlVal(panel, control, &slopeX2);
+			GetCtrlVal(panel, control, &dedrift.doubleslope);
 			break;
 	}
 	return 0;
@@ -2379,8 +2356,8 @@
 	switch (event)
 	{
 		case EVENT_COMMIT:
-			GetCtrlVal(panel, control, &dedrift_DDS_freq);
-			DDSFox_Set(&DDS1xAD9956, dedrift_DDS_freq, appliedSlope);
+			GetCtrlVal(panel, control, &dedrift.freq0);
+			DDSFox_Set(&DDS1xAD9956, dedrift.freq0, dedrift.applied);
 			break;
 	}
 	return 0;
--- a/FXAnalyse.h	Tue Dec 17 17:21:17 2013 +0100
+++ b/FXAnalyse.h	Wed Jan 22 12:10:17 2014 +0100
@@ -1,6 +1,6 @@
 /**************************************************************************/
 /* LabWindows/CVI User Interface Resource (UIR) Include File              */
-/* Copyright (c) National Instruments 2013. All Rights Reserved.          */
+/* Copyright (c) National Instruments 2014. All Rights Reserved.          */
 /*                                                                        */
 /* WARNING: Do not add to, delete from, or otherwise modify the contents  */
 /*          of this include file.                                         */
@@ -57,94 +57,100 @@
 #define  PANEL_DDS2                       20      /* control type: numeric, callback function: CB_ChangeDDSOut */
 #define  PANEL_TEXTMSG                    21      /* control type: textMsg, callback function: (none) */
 #define  PANEL_TEXTMSG_2                  22      /* control type: textMsg, callback function: (none) */
-#define  PANEL_SLOPETIME                  23      /* control type: numeric, callback function: CB_ChangeSlopeTime */
-#define  PANEL_DEDRIFT_DDS_FREQ           24      /* control type: numeric, callback function: CB_DedriftDDSFreq */
-#define  PANEL_DDS1                       25      /* control type: numeric, callback function: CB_ChangeDDSOut */
-#define  PANEL_CHANGENDIV                 26      /* control type: numeric, callback function: CB_OnChangeNdiv */
-#define  PANEL_N3CHOICE                   27      /* control type: numeric, callback function: CB_ChangeN */
-#define  PANEL_N3CALCULUS                 28      /* control type: command, callback function: CB_OnNCalculus */
-#define  PANEL_N1CHOICE                   29      /* control type: numeric, callback function: CB_ChangeN */
-#define  PANEL_N2CHOICE                   30      /* control type: numeric, callback function: CB_ChangeN */
-#define  PANEL_N2CALCULUS                 31      /* control type: command, callback function: CB_OnNCalculus */
-#define  PANEL_DDS4STEP                   32      /* control type: ring, callback function: CB_ChangeDDSStep */
-#define  PANEL_DDS3STEP                   33      /* control type: ring, callback function: CB_ChangeDDSStep */
-#define  PANEL_DDS2STEP                   34      /* control type: ring, callback function: CB_ChangeDDSStep */
-#define  PANEL_CENTERFREQUENCY            35      /* control type: numeric, callback function: (none) */
-#define  PANEL_SLOPE_APPLIED              36      /* control type: numeric, callback function: CB_SetSlope */
-#define  PANEL_CHECKBOX_MATH5PLOT         37      /* control type: radioButton, callback function: CB_OnFreqPlot */
-#define  PANEL_CHECKBOX_MATH4PLOT         38      /* control type: radioButton, callback function: CB_OnFreqPlot */
-#define  PANEL_CHECKBOX_MATH4ALLAN        39      /* control type: radioButton, callback function: CB_OnAllanPlot */
-#define  PANEL_DDS1STEP                   40      /* control type: ring, callback function: CB_ChangeDDSStep */
-#define  PANEL_TEXTMSG_15                 41      /* control type: textMsg, callback function: (none) */
-#define  PANEL_CHECKBOX_MATH5ALLAN        42      /* control type: radioButton, callback function: CB_OnAllanPlot */
-#define  PANEL_CHECKBOX_MATH3PLOT         43      /* control type: radioButton, callback function: CB_OnFreqPlot */
-#define  PANEL_CHECKBOX_MATH5SAVE         44      /* control type: radioButton, callback function: (none) */
-#define  PANEL_SR_LOGGER                  45      /* control type: radioButton, callback function: (none) */
-#define  PANEL_CHECKBOX_MATH4SAVE         46      /* control type: radioButton, callback function: (none) */
-#define  PANEL_CHECKBOX_MATH3ALLAN        47      /* control type: radioButton, callback function: CB_OnAllanPlot */
-#define  PANEL_MATHSTRING4                48      /* control type: string, callback function: CB_ChangeMath */
-#define  PANEL_CHECKBOX_MATH2PLOT         49      /* control type: radioButton, callback function: CB_OnFreqPlot */
-#define  PANEL_CHECKBOX_MATH3SAVE         50      /* control type: radioButton, callback function: (none) */
-#define  PANEL_CHECKBOX_MATH2SAVE         51      /* control type: radioButton, callback function: (none) */
-#define  PANEL_CHECKBOX_MATH2ALLAN        52      /* control type: radioButton, callback function: CB_OnAllanPlot */
-#define  PANEL_MATHSTRING3                53      /* control type: string, callback function: CB_ChangeMath */
-#define  PANEL_MATHSTRING1                54      /* control type: string, callback function: CB_ChangeMath */
-#define  PANEL_MATHSTRING2                55      /* control type: string, callback function: CB_ChangeMath */
-#define  PANEL_TEXTMSG_16                 56      /* control type: textMsg, callback function: (none) */
-#define  PANEL_MINUS10KDDS1               57      /* control type: command, callback function: CB_OnMinus10k */
-#define  PANEL_MINUS10KDDS4               58      /* control type: command, callback function: CB_OnMinus10k */
-#define  PANEL_MINUS10KDDS3               59      /* control type: command, callback function: CB_OnMinus10k */
-#define  PANEL_MINUS10KDDS2               60      /* control type: command, callback function: CB_OnMinus10k */
-#define  PANEL_PLUS10KDDS4                61      /* control type: command, callback function: CB_OnPlus10k */
-#define  PANEL_PLUS10KDDS3                62      /* control type: command, callback function: CB_OnPlus10k */
-#define  PANEL_PLUS10KDDS1                63      /* control type: command, callback function: CB_OnPlus10k */
-#define  PANEL_PLUS10KDDS2                64      /* control type: command, callback function: CB_OnPlus10k */
-#define  PANEL_MATHSTRING5                65      /* control type: textBox, callback function: CB_ChangeMath */
-#define  PANEL_UTC                        66      /* control type: numeric, callback function: (none) */
-#define  PANEL_TIME                       67      /* control type: string, callback function: (none) */
-#define  PANEL_DDS4                       68      /* control type: numeric, callback function: CB_ChangeDDSOut */
-#define  PANEL_DDS3                       69      /* control type: numeric, callback function: CB_ChangeDDSOut */
-#define  PANEL_N1CALCULUS                 70      /* control type: command, callback function: CB_OnNCalculus */
-#define  PANEL_FINDSIGN3                  71      /* control type: command, callback function: CB_OnFindSign */
-#define  PANEL_SIGN3                      72      /* control type: numeric, callback function: CB_Sign3 */
-#define  PANEL_FINDSIGN2                  73      /* control type: command, callback function: CB_OnFindSign */
-#define  PANEL_SIGN2                      74      /* control type: numeric, callback function: (none) */
-#define  PANEL_FINDSIGN1                  75      /* control type: command, callback function: CB_OnFindSign */
-#define  PANEL_SIGN1                      76      /* control type: numeric, callback function: (none) */
-#define  PANEL_FIND10K3                   77      /* control type: command, callback function: CB_OnFind275K */
-#define  PANEL_FIND275K2                  78      /* control type: command, callback function: CB_OnFind275K */
-#define  PANEL_RESETSLOPE                 79      /* control type: command, callback function: CB_OnResetSlope */
-#define  PANEL_CHECKBOX_STOPIFAUTODE      80      /* control type: radioButton, callback function: CB_OnStopSlopeCancellingOnUnlocked */
-#define  PANEL_CHECKBOX_RECENTER          81      /* control type: radioButton, callback function: CB_OnReCentering */
+#define  PANEL_RECENTER_INTERVAL          23      /* control type: numeric, callback function: CB_ChangeSlopeTime */
+#define  PANEL_SLOPETIME                  24      /* control type: numeric, callback function: CB_ChangeSlopeTime */
+#define  PANEL_DEDRIFT_DDS_FREQ           25      /* control type: numeric, callback function: CB_DedriftDDSFreq */
+#define  PANEL_DDS1                       26      /* control type: numeric, callback function: CB_ChangeDDSOut */
+#define  PANEL_CHANGENDIV                 27      /* control type: numeric, callback function: CB_OnChangeNdiv */
+#define  PANEL_N3CHOICE                   28      /* control type: numeric, callback function: CB_ChangeN */
+#define  PANEL_N3CALCULUS                 29      /* control type: command, callback function: CB_OnNCalculus */
+#define  PANEL_N1CHOICE                   30      /* control type: numeric, callback function: CB_ChangeN */
+#define  PANEL_N2CHOICE                   31      /* control type: numeric, callback function: CB_ChangeN */
+#define  PANEL_N2CALCULUS                 32      /* control type: command, callback function: CB_OnNCalculus */
+#define  PANEL_DDS4STEP                   33      /* control type: ring, callback function: CB_ChangeDDSStep */
+#define  PANEL_DDS3STEP                   34      /* control type: ring, callback function: CB_ChangeDDSStep */
+#define  PANEL_DDS2STEP                   35      /* control type: ring, callback function: CB_ChangeDDSStep */
+#define  PANEL_CENTERFREQUENCY            36      /* control type: numeric, callback function: (none) */
+#define  PANEL_SLOPE_APPLIED              37      /* control type: numeric, callback function: CB_SetSlope */
+#define  PANEL_CHECKBOX_MATH5PLOT         38      /* control type: radioButton, callback function: CB_OnFreqPlot */
+#define  PANEL_CHECKBOX_MATH4PLOT         39      /* control type: radioButton, callback function: CB_OnFreqPlot */
+#define  PANEL_CHECKBOX_MATH4ALLAN        40      /* control type: radioButton, callback function: CB_OnAllanPlot */
+#define  PANEL_DDS1STEP                   41      /* control type: ring, callback function: CB_ChangeDDSStep */
+#define  PANEL_TEXTMSG_15                 42      /* control type: textMsg, callback function: (none) */
+#define  PANEL_CHECKBOX_MATH5ALLAN        43      /* control type: radioButton, callback function: CB_OnAllanPlot */
+#define  PANEL_CHECKBOX_MATH3PLOT         44      /* control type: radioButton, callback function: CB_OnFreqPlot */
+#define  PANEL_CHECKBOX_MATH5SAVE         45      /* control type: radioButton, callback function: (none) */
+#define  PANEL_SR_LOGGER                  46      /* control type: radioButton, callback function: (none) */
+#define  PANEL_CHECKBOX_MATH4SAVE         47      /* control type: radioButton, callback function: (none) */
+#define  PANEL_CHECKBOX_MATH3ALLAN        48      /* control type: radioButton, callback function: CB_OnAllanPlot */
+#define  PANEL_MATHSTRING4                49      /* control type: string, callback function: CB_ChangeMath */
+#define  PANEL_CHECKBOX_MATH2PLOT         50      /* control type: radioButton, callback function: CB_OnFreqPlot */
+#define  PANEL_CHECKBOX_MATH3SAVE         51      /* control type: radioButton, callback function: (none) */
+#define  PANEL_CHECKBOX_MATH2SAVE         52      /* control type: radioButton, callback function: (none) */
+#define  PANEL_CHECKBOX_MATH2ALLAN        53      /* control type: radioButton, callback function: CB_OnAllanPlot */
+#define  PANEL_MATHSTRING3                54      /* control type: string, callback function: CB_ChangeMath */
+#define  PANEL_MATHSTRING1                55      /* control type: string, callback function: CB_ChangeMath */
+#define  PANEL_MATHSTRING2                56      /* control type: string, callback function: CB_ChangeMath */
+#define  PANEL_TEXTMSG_16                 57      /* control type: textMsg, callback function: (none) */
+#define  PANEL_MINUS10KDDS1               58      /* control type: command, callback function: CB_OnMinus10k */
+#define  PANEL_MINUS10KDDS4               59      /* control type: command, callback function: CB_OnMinus10k */
+#define  PANEL_MINUS10KDDS3               60      /* control type: command, callback function: CB_OnMinus10k */
+#define  PANEL_MINUS10KDDS2               61      /* control type: command, callback function: CB_OnMinus10k */
+#define  PANEL_PLUS10KDDS4                62      /* control type: command, callback function: CB_OnPlus10k */
+#define  PANEL_PLUS10KDDS3                63      /* control type: command, callback function: CB_OnPlus10k */
+#define  PANEL_PLUS10KDDS1                64      /* control type: command, callback function: CB_OnPlus10k */
+#define  PANEL_PLUS10KDDS2                65      /* control type: command, callback function: CB_OnPlus10k */
+#define  PANEL_MATHSTRING5                66      /* control type: textBox, callback function: CB_ChangeMath */
+#define  PANEL_UTC                        67      /* control type: numeric, callback function: (none) */
+#define  PANEL_TIME                       68      /* control type: string, callback function: (none) */
+#define  PANEL_DDS4                       69      /* control type: numeric, callback function: CB_ChangeDDSOut */
+#define  PANEL_DDS3                       70      /* control type: numeric, callback function: CB_ChangeDDSOut */
+#define  PANEL_N1CALCULUS                 71      /* control type: command, callback function: CB_OnNCalculus */
+#define  PANEL_FINDSIGN3                  72      /* control type: command, callback function: CB_OnFindSign */
+#define  PANEL_SIGN3                      73      /* control type: numeric, callback function: CB_Sign3 */
+#define  PANEL_FINDSIGN2                  74      /* control type: command, callback function: CB_OnFindSign */
+#define  PANEL_SIGN2                      75      /* control type: numeric, callback function: (none) */
+#define  PANEL_FINDSIGN1                  76      /* control type: command, callback function: CB_OnFindSign */
+#define  PANEL_SIGN1                      77      /* control type: numeric, callback function: (none) */
+#define  PANEL_FIND10K3                   78      /* control type: command, callback function: CB_OnFind275K */
+#define  PANEL_FIND275K2                  79      /* control type: command, callback function: CB_OnFind275K */
+#define  PANEL_RESETSLOPE                 80      /* control type: command, callback function: CB_OnResetSlope */
+#define  PANEL_CHECKBOX_STOPIFAUTODE      81      /* control type: radioButton, callback function: CB_OnStopSlopeCancellingOnUnlocked */
 #define  PANEL_CHECKBOX_KEEPSLOPE         82      /* control type: radioButton, callback function: CB_OnCROX */
 #define  PANEL_CHECKBOX_KEEP              83      /* control type: radioButton, callback function: CB_OnCROX */
 #define  PANEL_SLOPE_REFERENCE            84      /* control type: ring, callback function: CB_OnSlopeReference */
 #define  PANEL_ESTIMATE_N3                85      /* control type: command, callback function: CB_OnEstimateN */
 #define  PANEL_INVERT_SLOPE_SIGN          86      /* control type: radioButton, callback function: CB_InvertSlopeSign */
-#define  PANEL_MEASURE_SLOPE              87      /* control type: LED, callback function: CB_MeasureSlope */
-#define  PANEL_SLOPE_MEASURED             88      /* control type: numeric, callback function: (none) */
-#define  PANEL_RESET_DEDRIFT_DDS          89      /* control type: command, callback function: CB_ResetDedriftDDS */
-#define  PANEL_SAVE_RAW_DATA              90      /* control type: radioButton, callback function: (none) */
-#define  PANEL_SHOWLOG                    91      /* control type: radioButton, callback function: CB_ShowLog */
-#define  PANEL_SLOPEX2                    92      /* control type: radioButton, callback function: CB_SlopeX2 */
-#define  PANEL_SAVE_DDS_FREQS             93      /* control type: radioButton, callback function: (none) */
-#define  PANEL_DECORATION_2               94      /* control type: deco, callback function: (none) */
-#define  PANEL_DECORATION                 95      /* control type: deco, callback function: (none) */
-#define  PANEL_DECORATION_3               96      /* control type: deco, callback function: (none) */
-#define  PANEL_TEXTMSG_6                  97      /* control type: textMsg, callback function: (none) */
-#define  PANEL_TEXTMSG_21                 98      /* control type: textMsg, callback function: (none) */
-#define  PANEL_TEXTMSG_7                  99      /* control type: textMsg, callback function: (none) */
-#define  PANEL_DECORATION_4               100     /* control type: deco, callback function: (none) */
-#define  PANEL_DECORATION_7               101     /* control type: deco, callback function: (none) */
-#define  PANEL_DECORATION_6               102     /* control type: deco, callback function: (none) */
-#define  PANEL_DECORATION_5               103     /* control type: deco, callback function: (none) */
-#define  PANEL_TEXTMSG_20                 104     /* control type: textMsg, callback function: (none) */
-#define  PANEL_TEXTMSG_19                 105     /* control type: textMsg, callback function: (none) */
-#define  PANEL_MATH4                      106     /* control type: string, callback function: (none) */
-#define  PANEL_MATH5                      107     /* control type: string, callback function: (none) */
-#define  PANEL_MATH3                      108     /* control type: string, callback function: (none) */
-#define  PANEL_MATH2                      109     /* control type: string, callback function: (none) */
-#define  PANEL_MATH1                      110     /* control type: string, callback function: (none) */
+#define  PANEL_RECENTER                   87      /* control type: LED, callback function: CB_OnReCentering */
+#define  PANEL_MEASURE_SLOPE              88      /* control type: LED, callback function: CB_MeasureSlope */
+#define  PANEL_SLOPE_MEASURED             89      /* control type: numeric, callback function: (none) */
+#define  PANEL_RESET_DEDRIFT_DDS          90      /* control type: command, callback function: CB_ResetDedriftDDS */
+#define  PANEL_SAVE_RAW_DATA              91      /* control type: radioButton, callback function: (none) */
+#define  PANEL_SHOWLOG                    92      /* control type: radioButton, callback function: CB_ShowLog */
+#define  PANEL_SLOPEX2                    93      /* control type: radioButton, callback function: CB_SlopeX2 */
+#define  PANEL_SAVE_DDS_FREQS             94      /* control type: radioButton, callback function: (none) */
+#define  PANEL_DECORATION_2               95      /* control type: deco, callback function: (none) */
+#define  PANEL_DECORATION_8               96      /* control type: deco, callback function: (none) */
+#define  PANEL_DECORATION                 97      /* control type: deco, callback function: (none) */
+#define  PANEL_DECORATION_3               98      /* control type: deco, callback function: (none) */
+#define  PANEL_TEXTMSG_6                  99      /* control type: textMsg, callback function: (none) */
+#define  PANEL_TEXTMSG_22                 100     /* control type: textMsg, callback function: (none) */
+#define  PANEL_TEXTMSG_21                 101     /* control type: textMsg, callback function: (none) */
+#define  PANEL_TEXTMSG_7                  102     /* control type: textMsg, callback function: (none) */
+#define  PANEL_DECORATION_4               103     /* control type: deco, callback function: (none) */
+#define  PANEL_DECORATION_7               104     /* control type: deco, callback function: (none) */
+#define  PANEL_DECORATION_6               105     /* control type: deco, callback function: (none) */
+#define  PANEL_DECORATION_5               106     /* control type: deco, callback function: (none) */
+#define  PANEL_TEXTMSG_20                 107     /* control type: textMsg, callback function: (none) */
+#define  PANEL_TEXTMSG_19                 108     /* control type: textMsg, callback function: (none) */
+#define  PANEL_MATH4                      109     /* control type: string, callback function: (none) */
+#define  PANEL_MATH5                      110     /* control type: string, callback function: (none) */
+#define  PANEL_MATH3                      111     /* control type: string, callback function: (none) */
+#define  PANEL_MATH2                      112     /* control type: string, callback function: (none) */
+#define  PANEL_MATH1                      113     /* control type: string, callback function: (none) */
+#define  PANEL_CHECKBOX_3                 114     /* control type: radioButton, callback function: (none) */
+#define  PANEL_CHECKBOX_2                 115     /* control type: radioButton, callback function: (none) */
+#define  PANEL_CHECKBOX                   116     /* control type: radioButton, callback function: (none) */
 
 
      /* Control Arrays: */
Binary file FXAnalyse.uir has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stat.c	Wed Jan 22 12:10:17 2014 +0100
@@ -0,0 +1,43 @@
+#include "stat.h"
+
+void stat_zero(struct stat *s)
+{
+	s->samples = 0;
+	s->mean = 0.0;
+	s->slope = 0.0;
+	s->previous = 0.0;
+}
+
+
+void stat_accumulate(struct stat *s, double value)
+{
+	s->samples += 1;
+	
+	if (s->samples > 1)
+		s->slope = (s->slope * (s->samples - 2) + 6 * (value - s->mean) / s->samples) / (s->samples + 1);
+					
+	s->mean = ((s->samples - 1) * s->mean + value) / s->samples;
+	
+	s->previous = value;
+}
+
+
+void rollmean_zero(struct rollmean *s, int wlen)
+{
+	s->wlen = wlen;
+	s->nobs = 0;
+	s->mean = 0.0;
+	s->acc = 0.0;
+	s->prev = 0.0;
+}
+
+
+void rollmean_accumulate(struct rollmean *s, double value)
+{
+	s->acc = s->acc - s->prev + value;
+	if (s->nobs < s->wlen)
+		s->nobs++;
+	else
+		s->prev = s->acc;
+	s->mean = s->acc / s->nobs;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stat.h	Wed Jan 22 12:10:17 2014 +0100
@@ -0,0 +1,27 @@
+#ifndef __STAT_H__
+#define __STAT_H__
+
+struct stat {
+	int samples;
+	double mean;
+	double slope;
+	double previous;
+};
+
+void stat_zero(struct stat *s);
+void stat_accumulate(struct stat *s, double value);
+
+#define ROLLMEAN_N_OBS 10
+
+struct rollmean {
+	int wlen;
+	int nobs;
+	double mean;
+	double acc;
+	double prev;
+};
+
+void rollmean_zero(struct rollmean *s, int wlen);
+void rollmean_accumulate(struct rollmean *s, double value);
+
+#endif