kopia lustrzana https://github.com/rs1729/RS
mod: IF --iqX dc removal optional, base_sr 900001 approx
rodzic
1b5f384673
commit
d8fda5c97c
|
@ -304,6 +304,7 @@ float read_wav_header(pcm_t *pcm, FILE *fp) {
|
|||
|
||||
if (bits_sample != 8 && bits_sample != 16 && bits_sample != 32) return -1;
|
||||
|
||||
if (sample_rate == 900001) sample_rate -= 1;
|
||||
|
||||
pcm->sr = sample_rate;
|
||||
pcm->bps = bits_sample;
|
||||
|
@ -346,6 +347,7 @@ typedef struct {
|
|||
double sumIQy;
|
||||
float avgIQx;
|
||||
float avgIQy;
|
||||
float complex avgIQ;
|
||||
ui32_t cnt;
|
||||
ui32_t maxcnt;
|
||||
ui32_t maxlim;
|
||||
|
@ -375,16 +377,22 @@ static int f32read_csample(dsp_t *dsp, float complex *z) {
|
|||
y = (u[1]-128)/128.0;
|
||||
}
|
||||
|
||||
*z = (x - IQdc.avgIQx) + I*(y - IQdc.avgIQy);
|
||||
*z = x + I*y;
|
||||
|
||||
IQdc.sumIQx += x;
|
||||
IQdc.sumIQy += y;
|
||||
IQdc.cnt += 1;
|
||||
if (IQdc.cnt == IQdc.maxcnt) {
|
||||
IQdc.avgIQx = IQdc.sumIQx/(float)IQdc.maxcnt;
|
||||
IQdc.avgIQy = IQdc.sumIQy/(float)IQdc.maxcnt;
|
||||
IQdc.sumIQx = 0; IQdc.sumIQy = 0; IQdc.cnt = 0;
|
||||
if (IQdc.maxcnt < IQdc.maxlim) IQdc.maxcnt *= 2;
|
||||
// IQ-dc removal optional
|
||||
if (dsp->opt_iqdc) {
|
||||
*z -= IQdc.avgIQ;
|
||||
|
||||
IQdc.sumIQx += x;
|
||||
IQdc.sumIQy += y;
|
||||
IQdc.cnt += 1;
|
||||
if (IQdc.cnt == IQdc.maxcnt) {
|
||||
IQdc.avgIQx = IQdc.sumIQx/(float)IQdc.maxcnt;
|
||||
IQdc.avgIQy = IQdc.sumIQy/(float)IQdc.maxcnt;
|
||||
IQdc.avgIQ = IQdc.avgIQx + I*IQdc.avgIQy;
|
||||
IQdc.sumIQx = 0; IQdc.sumIQy = 0; IQdc.cnt = 0;
|
||||
if (IQdc.maxcnt < IQdc.maxlim) IQdc.maxcnt *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -395,63 +403,42 @@ static int f32read_cblock(dsp_t *dsp) {
|
|||
int n;
|
||||
int len;
|
||||
float x, y;
|
||||
ui8_t s[4*2*dsp->decM]; //uin8,int16,flot32
|
||||
ui8_t *u = (ui8_t*)s;
|
||||
short *b = (short*)s;
|
||||
float *f = (float*)s;
|
||||
|
||||
len = dsp->decM;
|
||||
|
||||
if (dsp->bps == 8) { //uint8
|
||||
ui8_t u[2*dsp->decM];
|
||||
len = fread( u, dsp->bps/8, 2*dsp->decM, dsp->fp) / 2;
|
||||
//for (n = 0; n < len; n++) dsp->decMbuf[n] = (u[2*n]-128)/128.0 + I*(u[2*n+1]-128)/128.0;
|
||||
// u8: 0..255, 128 -> 0V
|
||||
for (n = 0; n < len; n++) {
|
||||
len = fread( s, dsp->bps/8, 2*dsp->decM, dsp->fp) / 2;
|
||||
|
||||
//for (n = 0; n < len; n++) dsp->decMbuf[n] = (u[2*n]-128)/128.0 + I*(u[2*n+1]-128)/128.0;
|
||||
// u8: 0..255, 128 -> 0V
|
||||
for (n = 0; n < len; n++) {
|
||||
if (dsp->bps == 8) { //uint8
|
||||
x = (u[2*n ]-128)/128.0;
|
||||
y = (u[2*n+1]-128)/128.0;
|
||||
dsp->decMbuf[n] = (x-IQdc.avgIQx) + I*(y-IQdc.avgIQy);
|
||||
IQdc.sumIQx += x;
|
||||
IQdc.sumIQy += y;
|
||||
IQdc.cnt += 1;
|
||||
if (IQdc.cnt == IQdc.maxcnt) {
|
||||
IQdc.avgIQx = IQdc.sumIQx/(float)IQdc.maxcnt;
|
||||
IQdc.avgIQy = IQdc.sumIQy/(float)IQdc.maxcnt;
|
||||
IQdc.sumIQx = 0; IQdc.sumIQy = 0; IQdc.cnt = 0;
|
||||
if (IQdc.maxcnt < IQdc.maxlim) IQdc.maxcnt *= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (dsp->bps == 16) { //int16
|
||||
short b[2*dsp->decM];
|
||||
len = fread( b, dsp->bps/8, 2*dsp->decM, dsp->fp) / 2;
|
||||
for (n = 0; n < len; n++) {
|
||||
else if (dsp->bps == 16) { //int16
|
||||
x = b[2*n ]/32768.0;
|
||||
y = b[2*n+1]/32768.0;
|
||||
dsp->decMbuf[n] = (x-IQdc.avgIQx) + I*(y-IQdc.avgIQy);
|
||||
IQdc.sumIQx += x;
|
||||
IQdc.sumIQy += y;
|
||||
IQdc.cnt += 1;
|
||||
if (IQdc.cnt == IQdc.maxcnt) {
|
||||
IQdc.avgIQx = IQdc.sumIQx/(float)IQdc.maxcnt;
|
||||
IQdc.avgIQy = IQdc.sumIQy/(float)IQdc.maxcnt;
|
||||
IQdc.sumIQx = 0; IQdc.sumIQy = 0; IQdc.cnt = 0;
|
||||
if (IQdc.maxcnt < IQdc.maxlim) IQdc.maxcnt *= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else { // dsp->bps == 32 //float32
|
||||
float f[2*dsp->decM];
|
||||
len = fread( f, dsp->bps/8, 2*dsp->decM, dsp->fp) / 2;
|
||||
for (n = 0; n < len; n++) {
|
||||
else { // dsp->bps == 32 //float32
|
||||
x = f[2*n];
|
||||
y = f[2*n+1];
|
||||
dsp->decMbuf[n] = (x-IQdc.avgIQx) + I*(y-IQdc.avgIQy);
|
||||
IQdc.sumIQx += x;
|
||||
IQdc.sumIQy += y;
|
||||
IQdc.cnt += 1;
|
||||
if (IQdc.cnt == IQdc.maxcnt) {
|
||||
IQdc.avgIQx = IQdc.sumIQx/(float)IQdc.maxcnt;
|
||||
IQdc.avgIQy = IQdc.sumIQy/(float)IQdc.maxcnt;
|
||||
IQdc.sumIQx = 0; IQdc.sumIQy = 0; IQdc.cnt = 0;
|
||||
if (IQdc.maxcnt < IQdc.maxlim) IQdc.maxcnt *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
// baseband: IQ-dc removal mandatory
|
||||
dsp->decMbuf[n] = (x-IQdc.avgIQx) + I*(y-IQdc.avgIQy);
|
||||
|
||||
IQdc.sumIQx += x;
|
||||
IQdc.sumIQy += y;
|
||||
IQdc.cnt += 1;
|
||||
if (IQdc.cnt == IQdc.maxcnt) {
|
||||
IQdc.avgIQx = IQdc.sumIQx/(float)IQdc.maxcnt;
|
||||
IQdc.avgIQy = IQdc.sumIQy/(float)IQdc.maxcnt;
|
||||
IQdc.avgIQ = IQdc.avgIQx + I*IQdc.avgIQy;
|
||||
IQdc.sumIQx = 0; IQdc.sumIQy = 0; IQdc.cnt = 0;
|
||||
if (IQdc.maxcnt < IQdc.maxlim) IQdc.maxcnt *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -67,6 +67,7 @@ typedef struct {
|
|||
|
||||
// IQ-data
|
||||
int opt_iq;
|
||||
int opt_iqdc;
|
||||
int N_IQBUF;
|
||||
float complex *rot_iqbuf;
|
||||
float complex F1sum;
|
||||
|
|
|
@ -897,6 +897,7 @@ int main(int argc, char **argv) {
|
|||
int option_auto = 0;
|
||||
int option_min = 0;
|
||||
int option_iq = 0;
|
||||
int option_iqdc = 0;
|
||||
int option_lp = 0;
|
||||
int option_dc = 0;
|
||||
int option_bin = 0;
|
||||
|
@ -1009,6 +1010,7 @@ int main(int argc, char **argv) {
|
|||
else if (strcmp(*argv, "--iq0") == 0) { option_iq = 1; } // differential/FM-demod
|
||||
else if (strcmp(*argv, "--iq2") == 0) { option_iq = 2; }
|
||||
else if (strcmp(*argv, "--iq3") == 0) { option_iq = 3; } // iq2==iq3
|
||||
else if (strcmp(*argv, "--iqdc") == 0) { option_iqdc = 1; } // iq-dc removal (iq0,2,3)
|
||||
else if (strcmp(*argv, "--IQ") == 0) { // fq baseband -> IF (rotate from and decimate)
|
||||
double fq = 0.0; // --IQ <fq> , -0.5 < fq < 0.5
|
||||
++argv;
|
||||
|
@ -1147,6 +1149,7 @@ int main(int argc, char **argv) {
|
|||
dsp.BT = 0.5; // bw/time (ISI) // 0.3..0.5
|
||||
dsp.h = 1.8; // 2.4 modulation index abzgl. BT
|
||||
dsp.opt_iq = option_iq;
|
||||
dsp.opt_iqdc = option_iqdc;
|
||||
dsp.opt_lp = option_lp;
|
||||
dsp.lpIQ_bw = lpIQ_bw; // 12e3; // IF lowpass bandwidth
|
||||
dsp.lpFM_bw = 4e3; // FM audio lowpass
|
||||
|
|
|
@ -949,6 +949,7 @@ int main(int argc, char **argv) {
|
|||
int option_inv = 0; // invertiert Signal
|
||||
int option_min = 0;
|
||||
int option_iq = 0;
|
||||
int option_iqdc = 0;
|
||||
int option_lp = 0;
|
||||
int option_dc = 0;
|
||||
int option_softin = 0;
|
||||
|
@ -1073,6 +1074,7 @@ int main(int argc, char **argv) {
|
|||
else if (strcmp(*argv, "--iq0") == 0) { option_iq = 1; } // differential/FM-demod
|
||||
else if (strcmp(*argv, "--iq2") == 0) { option_iq = 2; }
|
||||
else if (strcmp(*argv, "--iq3") == 0) { option_iq = 3; } // iq2==iq3
|
||||
else if (strcmp(*argv, "--iqdc") == 0) { option_iqdc = 1; } // iq-dc removal (iq0,2,3)
|
||||
else if (strcmp(*argv, "--IQ") == 0) { // fq baseband -> IF (rotate from and decimate)
|
||||
double fq = 0.0; // --IQ <fq> , -0.5 < fq < 0.5
|
||||
++argv;
|
||||
|
@ -1199,6 +1201,7 @@ int main(int argc, char **argv) {
|
|||
dsp.BT = 1.2; // bw/time (ISI) // 1.0..2.0 // BT(lmsX) < BT(lms6) ? -> init_buffers()
|
||||
dsp.h = 0.9; // 0.95 modulation index
|
||||
dsp.opt_iq = option_iq;
|
||||
dsp.opt_iqdc = option_iqdc;
|
||||
dsp.opt_lp = option_lp;
|
||||
dsp.lpIQ_bw = lpIQ_bw; // 16e3; // IF lowpass bandwidth // soft decoding?
|
||||
dsp.lpFM_bw = 6e3; // FM audio lowpass
|
||||
|
|
|
@ -1115,6 +1115,7 @@ int main(int argc, char **argv) {
|
|||
int option_ptu = 0;
|
||||
int option_min = 0;
|
||||
int option_iq = 0;
|
||||
int option_iqdc = 0;
|
||||
int option_lp = 0;
|
||||
int option_dc = 0;
|
||||
int option_chk = 0;
|
||||
|
@ -1214,6 +1215,7 @@ int main(int argc, char **argv) {
|
|||
else if (strcmp(*argv, "--iq0") == 0) { option_iq = 1; } // differential/FM-demod
|
||||
else if (strcmp(*argv, "--iq2") == 0) { option_iq = 2; }
|
||||
else if (strcmp(*argv, "--iq3") == 0) { option_iq = 3; } // iq2==iq3
|
||||
else if (strcmp(*argv, "--iqdc") == 0) { option_iqdc = 1; } // iq-dc removal (iq0,2,3)
|
||||
else if (strcmp(*argv, "--IQ") == 0) { // fq baseband -> IF (rotate from and decimate)
|
||||
double fq = 0.0; // --IQ <fq> , -0.5 < fq < 0.5
|
||||
++argv;
|
||||
|
@ -1313,6 +1315,7 @@ int main(int argc, char **argv) {
|
|||
dsp.BT = 1.8; // bw/time (ISI) // 1.0..2.0
|
||||
dsp.h = 0.9; // 1.2 modulation index
|
||||
dsp.opt_iq = option_iq;
|
||||
dsp.opt_iqdc = option_iqdc;
|
||||
dsp.opt_lp = option_lp;
|
||||
dsp.lpIQ_bw = 24e3; // IF lowpass bandwidth
|
||||
dsp.lpFM_bw = 10e3; // FM audio lowpass
|
||||
|
|
|
@ -755,6 +755,7 @@ int main(int argc, char **argv) {
|
|||
int option_ptu = 0;
|
||||
int option_min = 0;
|
||||
int option_iq = 0;
|
||||
int option_iqdc = 0;
|
||||
int option_lp = 0;
|
||||
int option_dc = 0;
|
||||
int option_softin = 0;
|
||||
|
@ -862,6 +863,7 @@ int main(int argc, char **argv) {
|
|||
else if (strcmp(*argv, "--iq0") == 0) { option_iq = 1; } // differential/FM-demod
|
||||
else if (strcmp(*argv, "--iq2") == 0) { option_iq = 2; }
|
||||
else if (strcmp(*argv, "--iq3") == 0) { option_iq = 3; } // iq2==iq3
|
||||
else if (strcmp(*argv, "--iqdc") == 0) { option_iqdc = 1; } // iq-dc removal (iq0,2,3)
|
||||
else if (strcmp(*argv, "--IQ") == 0) { // fq baseband -> IF (rotate from and decimate)
|
||||
double fq = 0.0; // --IQ <fq> , -0.5 < fq < 0.5
|
||||
++argv;
|
||||
|
@ -961,6 +963,7 @@ int main(int argc, char **argv) {
|
|||
dsp.BT = 1.8; // bw/time (ISI) // 1.0..2.0 // M20 ?
|
||||
dsp.h = 0.9; // 1.2 modulation index // M20 ?
|
||||
dsp.opt_iq = option_iq;
|
||||
dsp.opt_iqdc = option_iqdc;
|
||||
dsp.opt_lp = option_lp;
|
||||
dsp.lpIQ_bw = 24e3; // IF lowpass bandwidth
|
||||
dsp.lpFM_bw = 10e3; // FM audio lowpass
|
||||
|
|
|
@ -210,6 +210,7 @@ int main(int argc, char **argv) {
|
|||
option_jsn = 0; // JSON output (auto_rx)
|
||||
int option_min = 0;
|
||||
int option_iq = 0;
|
||||
int option_iqdc = 0;
|
||||
int option_lp = 0;
|
||||
int option_dc = 0;
|
||||
int option_softin = 0;
|
||||
|
@ -332,6 +333,7 @@ int main(int argc, char **argv) {
|
|||
else if (strcmp(*argv, "--iq0") == 0) { option_iq = 1; } // differential/FM-demod
|
||||
else if (strcmp(*argv, "--iq2") == 0) { option_iq = 2; }
|
||||
else if (strcmp(*argv, "--iq3") == 0) { option_iq = 3; } // iq2==iq3
|
||||
else if (strcmp(*argv, "--iqdc") == 0) { option_iqdc = 1; } // iq-dc removal (iq0,2,3)
|
||||
else if (strcmp(*argv, "--IQ") == 0) { // fq baseband -> IF (rotate from and decimate)
|
||||
double fq = 0.0; // --IQ <fq> , -0.5 < fq < 0.5
|
||||
++argv;
|
||||
|
@ -427,6 +429,7 @@ int main(int argc, char **argv) {
|
|||
dsp.BT = 1.2; // bw/time (ISI) // 1.0..2.0
|
||||
dsp.h = 2.4; // 2.8
|
||||
dsp.opt_iq = option_iq;
|
||||
dsp.opt_iqdc = option_iqdc;
|
||||
dsp.opt_lp = option_lp;
|
||||
dsp.lpIQ_bw = 16e3; // IF lowpass bandwidth
|
||||
dsp.lpFM_bw = 4e3; // FM audio lowpass
|
||||
|
|
|
@ -1749,6 +1749,7 @@ int main(int argc, char *argv[]) {
|
|||
//int option_inv = 0; // invertiert Signal
|
||||
int option_min = 0;
|
||||
int option_iq = 0;
|
||||
int option_iqdc = 0;
|
||||
int option_lp = 0;
|
||||
int option_dc = 0;
|
||||
int option_bin = 0;
|
||||
|
@ -1856,6 +1857,7 @@ int main(int argc, char *argv[]) {
|
|||
else if (strcmp(*argv, "--iq0") == 0) { option_iq = 1; } // differential/FM-demod
|
||||
else if (strcmp(*argv, "--iq2") == 0) { option_iq = 2; }
|
||||
else if (strcmp(*argv, "--iq3") == 0) { option_iq = 3; } // iq2==iq3
|
||||
else if (strcmp(*argv, "--iqdc") == 0) { option_iqdc = 1; } // iq-dc removal (iq0,2,3)
|
||||
else if (strcmp(*argv, "--IQ") == 0) { // fq baseband -> IF (rotate from and decimate)
|
||||
double fq = 0.0; // --IQ <fq> , -0.5 < fq < 0.5
|
||||
++argv;
|
||||
|
@ -1973,6 +1975,7 @@ int main(int argc, char *argv[]) {
|
|||
dsp.BT = 0.5; // bw/time (ISI) // 0.3..0.5
|
||||
dsp.h = 0.6; //0.7; // 0.7..0.8? modulation index abzgl. BT
|
||||
dsp.opt_iq = option_iq;
|
||||
dsp.opt_iqdc = option_iqdc;
|
||||
dsp.opt_lp = option_lp;
|
||||
dsp.lpIQ_bw = lpIQ_bw; // 7.4e3 (6e3..8e3) // IF lowpass bandwidth
|
||||
dsp.lpFM_bw = 6e3; // FM audio lowpass
|
||||
|
|
|
@ -1237,6 +1237,7 @@ int main(int argc, char *argv[]) {
|
|||
int option_der = 0; // linErr
|
||||
int option_min = 0;
|
||||
int option_iq = 0;
|
||||
int option_iqdc = 0;
|
||||
int option_lp = 0;
|
||||
int option_dc = 0;
|
||||
int option_softin = 0;
|
||||
|
@ -1411,6 +1412,7 @@ int main(int argc, char *argv[]) {
|
|||
else if (strcmp(*argv, "--iq0") == 0) { option_iq = 1; } // differential/FM-demod
|
||||
else if (strcmp(*argv, "--iq2") == 0) { option_iq = 2; }
|
||||
else if (strcmp(*argv, "--iq3") == 0) { option_iq = 3; } // iq2==iq3
|
||||
else if (strcmp(*argv, "--iqdc") == 0) { option_iqdc = 1; } // iq-dc removal (iq0,2,3)
|
||||
else if (strcmp(*argv, "--IQ") == 0) { // fq baseband -> IF (rotate from and decimate)
|
||||
double fq = 0.0; // --IQ <fq> , -0.5 < fq < 0.5
|
||||
++argv;
|
||||
|
@ -1533,6 +1535,7 @@ int main(int argc, char *argv[]) {
|
|||
dsp.BT = 0.5; // bw/time (ISI) // 0.3..0.5
|
||||
dsp.h = 0.8; // 1.0 modulation index abzgl. BT
|
||||
dsp.opt_iq = option_iq;
|
||||
dsp.opt_iqdc = option_iqdc;
|
||||
dsp.opt_lp = option_lp;
|
||||
dsp.lpIQ_bw = 8e3; // IF lowpass bandwidth
|
||||
dsp.lpFM_bw = 6e3; // FM audio lowpass
|
||||
|
|
Ładowanie…
Reference in New Issue