Update some other utilites from upstream

pull/678/head
Mark Jessop 2022-09-25 18:56:12 +09:30
rodzic a65820d697
commit cf3ca33b6c
4 zmienionych plików z 119 dodań i 51 usunięć

Wyświetl plik

@ -12,7 +12,7 @@ from queue import Queue
# MINOR - New sonde type support, other fairly big changes that may result in telemetry or config file incompatability issus.
# PATCH - Small changes, or minor feature additions.
__version__ = "1.6.0-beta10"
__version__ = "1.6.0-beta11"
# Global Variables

Wyświetl plik

@ -42,6 +42,7 @@ typedef int i32_t;
#ifndef M_PI
#define M_PI (3.1415926535897932384626433832795)
#endif
#define _2PI (6.2831853071795864769252867665590)
#define LP_IQ 1
#define LP_FM 2
@ -184,8 +185,9 @@ typedef struct {
int decM;
ui32_t sr_base;
ui32_t dectaps;
ui32_t sample_dec;
ui32_t sample_decX;
ui32_t lut_len;
ui32_t sample_decM;
float complex *decXbuffer;
float complex *decMbuf;
float complex *ex; // exp_lut
@ -373,7 +375,7 @@ static int lowpass_init(float f, int taps, float **pws) {
ws = (float*)calloc( 2*taps+1, sizeof(float)); if (ws == NULL) return -1;
for (n = 0; n < taps; n++) {
w[n] = 7938/18608.0 - 9240/18608.0*cos(2*M_PI*n/(taps-1)) + 1430/18608.0*cos(4*M_PI*n/(taps-1)); // Blackmann
w[n] = 7938/18608.0 - 9240/18608.0*cos(_2PI*n/(taps-1)) + 1430/18608.0*cos(4*M_PI*n/(taps-1)); // Blackmann
h[n] = 2*f*sinc(2*f*(n-(taps-1)/2));
ws[n] = w[n]*h[n];
norm += ws[n]; // 1-norm
@ -393,7 +395,7 @@ static int lowpass_init(float f, int taps, float **pws) {
}
static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t s = sample % taps;
double complex w = 0;
@ -403,6 +405,22 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps,
return (float complex)w;
// symmetry: ws[n] == ws[taps-1-n]
}
static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
float complex w = 0; // -Ofast
int n;
int s = sample % taps; // lpIQ
int S1 = s+1;
int S1N = S1-taps;
int n0 = taps-1-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}
for (n = n0; n < taps; n++) {
w += buffer[S1N+n]*ws[n];
}
return w;
// symmetry: ws[n] == ws[taps-1-n]
}
static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
@ -445,24 +463,25 @@ int f32_sample(dsp_t *dsp, float *out) {
if (dsp->opt_nolut) {
double _s_base = (double)(_sample*dsp->decM+j); // dsp->sample_dec
double f0 = dsp->xlt_fq*_s_base - dsp->Df*_s_base/(double)dsp->sr_base;
z = dsp->decMbuf[j] * cexp(f0*2*M_PI*I);
z = dsp->decMbuf[j] * cexp(f0*_2PI*I);
}
else {
z = dsp->decMbuf[j] * dsp->ex[dsp->sample_dec % dsp->lut_len];
z = dsp->decMbuf[j] * dsp->ex[dsp->sample_decM];
}
dsp->decXbuffer[dsp->sample_dec % dsp->dectaps] = z;
dsp->sample_dec += 1;
if (dsp->sample_dec == s_reset) dsp->sample_dec = 0;
dsp->sample_decM += 1; if (dsp->sample_decM >= dsp->lut_len) dsp->sample_decM = 0;
dsp->decXbuffer[dsp->sample_decX] = z;
dsp->sample_decX += 1; if (dsp->sample_decX >= dsp->dectaps) dsp->sample_decX = 0;
}
if (dsp->decM > 1)
{
z = lowpass(dsp->decXbuffer, dsp->sample_dec, dsp->dectaps, ws_dec);
z = lowpass(dsp->decXbuffer, dsp->sample_decX, dsp->dectaps, ws_dec);
}
}
else if ( f32read_csample(dsp, &z) == EOF ) return EOF;
if (dsp->opt_dc && !dsp->opt_nolut) {
z *= cexp(-t*2*M_PI*dsp->Df*I);
z *= cexp(-t*_2PI*dsp->Df*I);
}
@ -649,7 +668,7 @@ int init_buffers(dsp_t *dsp) {
if (dsp->ex == NULL) return -1;
for (n = 0; n < dsp->lut_len; n++) {
t = f0*(double)n;
dsp->ex[n] = cexp(t*2*M_PI*I);
dsp->ex[n] = cexp(t*_2PI*I);
}
}
@ -1303,6 +1322,7 @@ int main(int argc, char *argv[]) {
double bitlen; // sample_rate/BAUD_RATE
int len;
double f1, f2;
double complex iw1, iw2;
int n;
double t = 0.0;
@ -1503,6 +1523,8 @@ int main(int argc, char *argv[]) {
f1 = 2200.0; // bit0: 2200Hz
f2 = 1200.0; // bit1: 1200Hz
iw1 = _2PI*I*f1;
iw2 = _2PI*I*f2;
N = 2*bitlen + 0.5;
buffer = calloc( N+1, sizeof(float)); if (buffer == NULL) return -1;
@ -1523,13 +1545,13 @@ int main(int argc, char *argv[]) {
x0 = buffer[(sample_count - n + N) % N];
// f1
X0 = x0 * cexp(-tn*2*M_PI*f1*I); // alt
X = x * cexp(-t *2*M_PI*f1*I); // neu
X0 = x0 * cexp(-tn*iw1); // alt
X = x * cexp(-t *iw1); // neu
F1sum += X - X0;
// f2
X0 = x0 * cexp(-tn*2*M_PI*f2*I); // alt
X = x * cexp(-t *2*M_PI*f2*I); // neu
X0 = x0 * cexp(-tn*iw2); // alt
X = x * cexp(-t *iw2); // neu
F2sum += X - X0;
xbit = cabs(F2sum) - cabs(F1sum);
@ -1612,3 +1634,4 @@ int main(int argc, char *argv[]) {
return 0;
}

Wyświetl plik

@ -44,6 +44,7 @@
#ifndef M_PI
#define M_PI (3.1415926535897932384626433832795)
#endif
#define _2PI (6.2831853071795864769252867665590)
#define LP_IQ 1
#define LP_FM 2
@ -111,6 +112,9 @@ typedef struct {
float complex *rot_iqbuf;
float complex F1sum;
float complex F2sum;
//
double complex iw1;
double complex iw2;
//
char *rawbits;
@ -138,8 +142,9 @@ typedef struct {
int decM;
ui32_t sr_base;
ui32_t dectaps;
ui32_t sample_dec;
ui32_t sample_decX;
ui32_t lut_len;
ui32_t sample_decM;
float complex *decXbuffer;
float complex *decMbuf;
float complex *ex; // exp_lut
@ -303,14 +308,14 @@ static int dft_window(dft_t *dft, int w) {
dft->win[n] = 1.0;
break;
case 1: // Hann
dft->win[n] = 0.5 * ( 1.0 - cos(2*M_PI*n/(float)(dft->N2-1)) );
dft->win[n] = 0.5 * ( 1.0 - cos(_2PI*n/(float)(dft->N2-1)) );
break ;
case 2: // Hamming
dft->win[n] = 25/46.0 - (1.0 - 25/46.0)*cos(2*M_PI*n / (float)(dft->N2-1));
dft->win[n] = 25/46.0 - (1.0 - 25/46.0)*cos(_2PI*n / (float)(dft->N2-1));
break ;
case 3: // Blackmann
dft->win[n] = 7938/18608.0
- 9240/18608.0*cos(2*M_PI*n / (float)(dft->N2-1))
- 9240/18608.0*cos(_2PI*n / (float)(dft->N2-1))
+ 1430/18608.0*cos(4*M_PI*n / (float)(dft->N2-1));
break ;
}
@ -708,7 +713,7 @@ static int lowpass_init(float f, int taps, float **pws) {
ws = (float*)calloc( 2*taps+1, sizeof(float)); if (ws == NULL) return -1;
for (n = 0; n < taps; n++) {
w[n] = 7938/18608.0 - 9240/18608.0*cos(2*M_PI*n/(taps-1)) + 1430/18608.0*cos(4*M_PI*n/(taps-1)); // Blackmann
w[n] = 7938/18608.0 - 9240/18608.0*cos(_2PI*n/(taps-1)) + 1430/18608.0*cos(4*M_PI*n/(taps-1)); // Blackmann
h[n] = 2*f*sinc(2*f*(n-(taps-1)/2));
ws[n] = w[n]*h[n];
norm += ws[n]; // 1-norm
@ -728,7 +733,7 @@ static int lowpass_init(float f, int taps, float **pws) {
}
static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t s = sample % taps;
double complex w = 0;
@ -738,6 +743,22 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps,
return (float complex)w;
// symmetry: ws[n] == ws[taps-1-n]
}
static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
float complex w = 0; // -Ofast
int n;
int s = sample % taps; // lpIQ
int S1 = s+1;
int S1N = S1-taps;
int n0 = taps-1-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}
for (n = n0; n < taps; n++) {
w += buffer[S1N+n]*ws[n];
}
return w;
// symmetry: ws[n] == ws[taps-1-n]
}
static float re_lowpass(float buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
@ -774,31 +795,30 @@ int f32buf_sample(dsp_t *dsp, int inv) {
if (dsp->opt_iq)
{
if (dsp->opt_iq >= 5) {
ui32_t s_reset = dsp->dectaps*dsp->lut_len;
int j;
if ( f32read_cblock(dsp) < dsp->decM ) return EOF;
for (j = 0; j < dsp->decM; j++) {
if (dsp->opt_nolut) {
double _s_base = (double)(_sample*dsp->decM+j); // dsp->sample_dec
double f0 = dsp->xlt_fq*_s_base - dsp->Df*_s_base/(double)dsp->sr_base;
z = dsp->decMbuf[j] * cexp(f0*2*M_PI*I);
z = dsp->decMbuf[j] * cexp(f0*_2PI*I);
}
else {
z = dsp->decMbuf[j] * dsp->ex[dsp->sample_dec % dsp->lut_len];
z = dsp->decMbuf[j] * dsp->ex[dsp->sample_decM];
}
dsp->decXbuffer[dsp->sample_dec % dsp->dectaps] = z;
dsp->sample_dec += 1;
if (dsp->sample_dec == s_reset) dsp->sample_dec = 0;
dsp->sample_decM += 1; if (dsp->sample_decM >= dsp->lut_len) dsp->sample_decM = 0;
dsp->decXbuffer[dsp->sample_decX] = z;
dsp->sample_decX += 1; if (dsp->sample_decX >= dsp->dectaps) dsp->sample_decX = 0;
}
if (dsp->decM > 1)
{
z = lowpass(dsp->decXbuffer, dsp->sample_dec, dsp->dectaps, ws_dec);
z = lowpass(dsp->decXbuffer, dsp->sample_decX, dsp->dectaps, ws_dec);
}
}
else if ( f32read_csample(dsp, &z) == EOF ) return EOF;
if (dsp->opt_dc && !dsp->opt_nolut) {
z *= cexp(-t*2*M_PI*dsp->Df*I);
z *= cexp(-t*_2PI*dsp->Df*I);
}
@ -821,8 +841,8 @@ int f32buf_sample(dsp_t *dsp, int inv) {
if (0) { // not L band
double xbit = 0.0;
//float complex xi = cexp(+I*M_PI*dsp->h/dsp->sps);
double f1 = -dsp->h*dsp->sr/(2*dsp->sps);
double f2 = -f1;
//double f1 = -dsp->h*dsp->sr/(2*dsp->sps);
//double f2 = -f1;
float complex X0 = 0;
float complex X = 0;
@ -834,13 +854,13 @@ int f32buf_sample(dsp_t *dsp, int inv) {
z0 = dsp->rot_iqbuf[(_sample-n + dsp->N_IQBUF) % dsp->N_IQBUF];
// f1
X0 = z0 * cexp(-tn*2*M_PI*f1*I); // alt
X = z * cexp(-t *2*M_PI*f1*I); // neu
X0 = z0 * cexp(-tn*dsp->iw1); // alt
X = z * cexp(-t *dsp->iw1); // neu
dsp->F1sum += X - X0;
// f2
X0 = z0 * cexp(-tn*2*M_PI*f2*I); // alt
X = z * cexp(-t *2*M_PI*f2*I); // neu
X0 = z0 * cexp(-tn*dsp->iw2); // alt
X = z * cexp(-t *dsp->iw2); // neu
dsp->F2sum += X - X0;
xbit = cabs(dsp->F2sum) - cabs(dsp->F1sum);
@ -851,8 +871,8 @@ int f32buf_sample(dsp_t *dsp, int inv) {
double xbit = 0.0;
float _sps = dsp->sps * decFM;
//float complex xi = cexp(+I*M_PI*dsp->h/dsp->sps);
double f1 = -dsp->h*dsp->sr/(2*_sps);
double f2 = -f1;
//double f1 = -dsp->h*dsp->sr/(2*_sps);
//double f2 = -f1;
float complex X1 = 0;
float complex X2 = 0;
@ -866,8 +886,8 @@ int f32buf_sample(dsp_t *dsp, int inv) {
{
t = -n / (double)dsp->sr;
z = dsp->rot_iqbuf[(_sample - n + dsp->N_IQBUF) % dsp->N_IQBUF];
X1 += z*cexp(-t*2*M_PI*f1*I);
X2 += z*cexp(-t*2*M_PI*f2*I);
X1 += z*cexp(-t*dsp->iw1);
X2 += z*cexp(-t*dsp->iw2);
}
}
@ -1115,7 +1135,7 @@ int init_buffers_Lband(dsp_t *dsp) {
float b0, b1, b2, b;
float normMatch;
double t;
double sigma = sqrt(log(2)) / (2*M_PI*dsp->BT);
double sigma = sqrt(log(2)) / (_2PI*dsp->BT);
int p2 = 1;
int K, L, M;
@ -1196,7 +1216,7 @@ int init_buffers_Lband(dsp_t *dsp) {
if (dsp->ex == NULL) return -1;
for (n = 0; n < dsp->lut_len; n++) {
t = f0*(double)n;
dsp->ex[n] = cexp(t*2*M_PI*I);
dsp->ex[n] = cexp(t*_2PI*I);
}
}
@ -1400,6 +1420,14 @@ int init_buffers_Lband(dsp_t *dsp) {
dsp->fm_buffer = (float *)calloc( M+1, sizeof(float)); if (dsp->fm_buffer == NULL) return -1; // dsp->bufs[]
if (dsp->opt_iq)
{
double f1 = -dsp->h*dsp->sr/(2.0*dsp->sps);
double f2 = -f1;
dsp->iw1 = _2PI*I*f1;
dsp->iw2 = _2PI*I*f2;
}
return K;
}
@ -1937,7 +1965,7 @@ static void print_frame(gpx_t *gpx, int len, dsp_t *dsp) {
}
printf("\n");
}
//else // - Print raw *and* JSON data if enabled.
else //
{
if (gpx->frame_bytes[OFS] == 0x4D && len/BITS > pos_FullID+4) {
if ( !crc_err ) {
@ -2023,7 +2051,6 @@ static void print_frame(gpx_t *gpx, int len, dsp_t *dsp) {
if (ver_jsn && *ver_jsn != '\0') printf(", \"version\": \"%s\"", ver_jsn);
printf(" }\n");
printf("\n");
fflush(stdout);
gpx->prev_frnr = gpx->frnr;
}
}
@ -2404,3 +2431,4 @@ int main(int argc, char **argv) {
return 0;
}

Wyświetl plik

@ -206,12 +206,13 @@ static char *rawbits = NULL;
// decimation
static ui32_t dsp__sr_base;
static ui32_t dsp__dectaps;
static ui32_t dsp__sample_dec;
static ui32_t dsp__sample_decX;
static int dsp__decM = 1;
static float complex *dsp__decXbuffer;
static float complex *dsp__decMbuf;
static float complex *dsp__ex; // exp_lut
static ui32_t dsp__lut_len;
static ui32_t dsp__sample_decM;
static float *ws_dec;
static double dsp__xlt_fq = 0.0;
@ -649,7 +650,7 @@ static float complex lowpass0(float complex buffer[], ui32_t sample, ui32_t taps
}
return (float complex)w;
}
static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
static float complex lowpass1(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
ui32_t n;
ui32_t s = sample % taps;
double complex w = 0;
@ -659,6 +660,22 @@ static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps,
return (float complex)w;
// symmetry: ws[n] == ws[taps-1-n]
}
static float complex lowpass(float complex buffer[], ui32_t sample, ui32_t taps, float *ws) {
float complex w = 0; // -Ofast
int n;
int s = sample % taps; // lpIQ
int S1 = s+1;
int S1N = S1-taps;
int n0 = taps-1-s;
for (n = 0; n < n0; n++) {
w += buffer[S1+n]*ws[n];
}
for (n = n0; n < taps; n++) {
w += buffer[S1N+n]*ws[n];
}
return w;
// symmetry: ws[n] == ws[taps-1-n]
}
static int f32buf_sample(FILE *fp, int inv) {
@ -675,15 +692,15 @@ static int f32buf_sample(FILE *fp, int inv) {
if (option_iq)
{
if (option_iq == 5) { // baseband decimation
ui32_t s_reset = dsp__dectaps*dsp__lut_len;
//ui32_t s_reset = dsp__dectaps*dsp__lut_len;
int j;
if ( f32read_cblock(fp) < dsp__decM ) return EOF;
for (j = 0; j < dsp__decM; j++) {
dsp__decXbuffer[dsp__sample_dec % dsp__dectaps] = dsp__decMbuf[j] * dsp__ex[dsp__sample_dec % dsp__lut_len];
dsp__sample_dec += 1;
if (dsp__sample_dec == s_reset) dsp__sample_dec = 0;
dsp__decXbuffer[dsp__sample_decX] = dsp__decMbuf[j] * dsp__ex[dsp__sample_decM];
dsp__sample_decM += 1; if (dsp__sample_decM >= dsp__lut_len) dsp__sample_decM = 0;
dsp__sample_decX += 1; if (dsp__sample_decX >= dsp__dectaps) dsp__sample_decX = 0;
}
z = lowpass(dsp__decXbuffer, dsp__sample_dec, dsp__dectaps, ws_dec);
z = lowpass(dsp__decXbuffer, dsp__sample_decX, dsp__dectaps, ws_dec);
}
else if ( f32read_csample(fp, &z) == EOF ) return EOF;