diff -Nru airspyhf-1.1.3/debian/changelog airspyhf-1.1.5/debian/changelog --- airspyhf-1.1.3/debian/changelog 2018-03-22 22:46:52.000000000 +0000 +++ airspyhf-1.1.5/debian/changelog 2018-04-29 10:00:40.000000000 +0000 @@ -1,3 +1,9 @@ +airspyhf (1.1.5-myriadrf1~artful) artful; urgency=low + + * New upstream version with improved the IQ correction + + -- Alexandru Csete Sun, 29 Apr 2018 12:00:00 +0200 + airspyhf (1.1.3-myriadrf3~artful) artful; urgency=low * New upstream version with improved the IQ correction diff -Nru airspyhf-1.1.3/libairspyhf/src/airspyhf.c airspyhf-1.1.5/libairspyhf/src/airspyhf.c --- airspyhf-1.1.3/libairspyhf/src/airspyhf.c 2018-03-20 21:00:10.000000000 +0000 +++ airspyhf-1.1.5/libairspyhf/src/airspyhf.c 2018-03-25 06:11:34.000000000 +0000 @@ -101,6 +101,7 @@ volatile uint32_t freq_khz; volatile int32_t freq_shift; volatile int32_t calibration_ppb; + uint8_t enable_dsp; airspyhf_complex_float_t vec; iq_balancer_t iq_balancer; uint32_t transfer_count; @@ -305,15 +306,18 @@ dest[i].im = src[i].im * scale; } - iq_balancer_process(&device->iq_balancer, dest, count); - - for (i = 0; i < count; i++) + if (device->enable_dsp) { - rotate_complex(&vec, &rot); - multiply_complex_complex(&dest[i], &vec); - } + iq_balancer_process(&device->iq_balancer, dest, count); + + for (i = 0; i < count; i++) + { + rotate_complex(&vec, &rot); + multiply_complex_complex(&dest[i], &vec); + } - device->vec = vec; + device->vec = vec; + } } static void* consumer_threadproc(void *arg) @@ -873,6 +877,7 @@ lib_device->freq_shift = 0; lib_device->vec.re = 1.0f; lib_device->vec.im = 0.0f; + lib_device->enable_dsp = 1; if (airspyhf_config_read(lib_device, (uint8_t *) &record, sizeof(record)) == AIRSPYHF_SUCCESS) { @@ -1371,3 +1376,9 @@ return AIRSPYHF_SUCCESS; } + +int ADDCALL airspyhf_set_lib_dsp(airspyhf_device_t* device, uint8_t flag) +{ + device->enable_dsp = flag; + return AIRSPYHF_SUCCESS; +} \ No newline at end of file diff -Nru airspyhf-1.1.3/libairspyhf/src/airspyhf.h airspyhf-1.1.5/libairspyhf/src/airspyhf.h --- airspyhf-1.1.3/libairspyhf/src/airspyhf.h 2018-03-20 21:00:10.000000000 +0000 +++ airspyhf-1.1.5/libairspyhf/src/airspyhf.h 2018-03-25 06:11:34.000000000 +0000 @@ -28,10 +28,10 @@ #include -#define AIRSPYHF_VERSION "1.1.3" +#define AIRSPYHF_VERSION "1.1.5" #define AIRSPYHF_VER_MAJOR 1 #define AIRSPYHF_VER_MINOR 1 -#define AIRSPYHF_VER_REVISION 3 +#define AIRSPYHF_VER_REVISION 5 #define AIRSPYHF_ENDPOINT_IN (1) @@ -127,6 +127,7 @@ extern ADDAPI int ADDCALL airspyhf_stop(airspyhf_device_t* device); extern ADDAPI int ADDCALL airspyhf_is_streaming(airspyhf_device_t* device); extern ADDAPI int ADDCALL airspyhf_set_freq(airspyhf_device_t* device, const uint32_t freq_hz); +extern ADDAPI int ADDCALL airspyhf_set_lib_dsp(airspyhf_device_t* device, const uint8_t flag); extern ADDAPI int ADDCALL airspyhf_get_samplerates(airspyhf_device_t* device, uint32_t* buffer, const uint32_t len); extern ADDAPI int ADDCALL airspyhf_set_samplerate(airspyhf_device_t* device, uint32_t samplerate); extern ADDAPI int ADDCALL airspyhf_get_calibration(airspyhf_device_t* device, int32_t* ppb); diff -Nru airspyhf-1.1.3/libairspyhf/src/iqbalancer.c airspyhf-1.1.5/libairspyhf/src/iqbalancer.c --- airspyhf-1.1.3/libairspyhf/src/iqbalancer.c 2018-03-20 21:00:10.000000000 +0000 +++ airspyhf-1.1.5/libairspyhf/src/iqbalancer.c 2018-03-25 06:11:34.000000000 +0000 @@ -152,8 +152,8 @@ for (i = 0; i < length; i++) { - iavg += DCAlpha * (iq[i].re - iavg); - qavg += DCAlpha * (iq[i].im - qavg); + iavg += DcTimeConst * (iq[i].re - iavg); + qavg += DcTimeConst * (iq[i].im - qavg); iq[i].re -= iavg; iq[i].im -= qavg; @@ -262,7 +262,7 @@ { phase = MaxPhaseCorrection; } - if (phase < -MaxPhaseCorrection) + else if (phase < -MaxPhaseCorrection) { phase = -MaxPhaseCorrection; } @@ -314,16 +314,29 @@ re = iq[i].re * iq[i].re; im = iq[i].im * iq[i].im; - iq_balancer->iampavg += DCAlpha * (re - iq_balancer->iampavg); - iq_balancer->qampavg += DCAlpha * (im - iq_balancer->qampavg); + iq_balancer->iampavg += BalanceTimeConst * (re - iq_balancer->iampavg); + iq_balancer->qampavg_pre += BalanceTimeConst * (im - iq_balancer->qampavg_pre); - if (iq_balancer->qampavg != 0) + if (iq_balancer->qampavg_pre != 0) { - double gain = sqrt(iq_balancer->iampavg / iq_balancer->qampavg); - iq_balancer->gain = iq_balancer->gain + GainAlpha * (gain - iq_balancer->gain); + double gain = sqrt(iq_balancer->iampavg / iq_balancer->qampavg_pre); + iq_balancer->gain = iq_balancer->gain + iq_balancer->gain_alpha * (gain - iq_balancer->gain); } iq[i].im *= (float) iq_balancer->gain; + + iq_balancer->qampavg_post += BalanceTimeConst * (iq[i].im * iq[i].im - iq_balancer->qampavg_post); + + if (iq_balancer->qampavg_post != 0) + { + double gain_balance = sqrt(iq_balancer->iampavg / iq_balancer->qampavg_post); + double alpha_contribution = AlphaContributionScale * fabs(1.0 - gain_balance); + if (alpha_contribution < MinAlphaContribution) + alpha_contribution = MinAlphaContribution; + else if (alpha_contribution > MaxAlphaContribution) + alpha_contribution = MaxAlphaContribution; + iq_balancer->gain_alpha += BalanceTimeConst * (alpha_contribution - iq_balancer->gain_alpha); + } } iq_balancer->last_phase = iq_balancer->phase; @@ -373,8 +386,10 @@ iq_balancer->optimal_bin = 0; iq_balancer->fail = 0; iq_balancer->gain = 1.0; - iq_balancer->iampavg = 1.0; - iq_balancer->qampavg = 1.0; + iq_balancer->gain_alpha = InitialGainAlpha; + iq_balancer->iampavg = 0.0; + iq_balancer->qampavg_pre = 0.0; + iq_balancer->qampavg_post = 0.0; __init_window(); } diff -Nru airspyhf-1.1.3/libairspyhf/src/iqbalancer.h airspyhf-1.1.5/libairspyhf/src/iqbalancer.h --- airspyhf-1.1.3/libairspyhf/src/iqbalancer.h 2018-03-20 21:00:10.000000000 +0000 +++ airspyhf-1.1.5/libairspyhf/src/iqbalancer.h 2018-03-25 06:11:34.000000000 +0000 @@ -27,8 +27,13 @@ #define FFTBins 512 #define BinsToSkip 10 #define BinsToOptimize 20 -#define BoostFactor 1000 +#define BoostFactor 10000 #define SkippedBuffers 4 +#define DcTimeConst 1e-5f +#define BalanceTimeConst 2.5e-6f +#define AlphaContributionScale 0.01f +#define MinAlphaContribution 1e-8f +#define MaxAlphaContribution 1e-3f #define MaximumFail 10 #define MaximumStep 1e-2f #define MinimumStep 1e-7f @@ -36,8 +41,7 @@ #define StepDecrement 0.9f #define MaxPhaseCorrection 0.2f #define PhaseAlpha 0.01f -#define GainAlpha 0.01f -#define DCAlpha 2.68744225e-5f +#define InitialGainAlpha 0.01f typedef struct _iq_balancer_t { @@ -49,8 +53,10 @@ int optimal_bin; int fail; double gain; + double gain_alpha; double iampavg; - double qampavg; + double qampavg_pre; + double qampavg_post; } iq_balancer_t; void iq_balancer_init(iq_balancer_t *iq_balancer);