diff --git a/demod/mod/demod_mod.c b/demod/mod/demod_mod.c index a432647..529796f 100644 --- a/demod/mod/demod_mod.c +++ b/demod/mod/demod_mod.c @@ -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; } } diff --git a/demod/mod/demod_mod.h b/demod/mod/demod_mod.h index 26934fd..d2a2879 100644 --- a/demod/mod/demod_mod.h +++ b/demod/mod/demod_mod.h @@ -67,6 +67,7 @@ typedef struct { // IQ-data int opt_iq; + int opt_iqdc; int N_IQBUF; float complex *rot_iqbuf; float complex F1sum; diff --git a/demod/mod/dfm09mod.c b/demod/mod/dfm09mod.c index 1712c89..3edb3ed 100644 --- a/demod/mod/dfm09mod.c +++ b/demod/mod/dfm09mod.c @@ -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 , -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 diff --git a/demod/mod/lms6Xmod.c b/demod/mod/lms6Xmod.c index 2632790..6f90e7c 100644 --- a/demod/mod/lms6Xmod.c +++ b/demod/mod/lms6Xmod.c @@ -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 , -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 diff --git a/demod/mod/m10mod.c b/demod/mod/m10mod.c index 8e47984..1622a78 100644 --- a/demod/mod/m10mod.c +++ b/demod/mod/m10mod.c @@ -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 , -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 diff --git a/demod/mod/mXXmod.c b/demod/mod/mXXmod.c index f33a246..4656cb3 100644 --- a/demod/mod/mXXmod.c +++ b/demod/mod/mXXmod.c @@ -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 , -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 diff --git a/demod/mod/meisei100mod.c b/demod/mod/meisei100mod.c index 6397c5a..815ec88 100644 --- a/demod/mod/meisei100mod.c +++ b/demod/mod/meisei100mod.c @@ -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 , -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 diff --git a/demod/mod/rs41mod.c b/demod/mod/rs41mod.c index 95ee379..25b6147 100644 --- a/demod/mod/rs41mod.c +++ b/demod/mod/rs41mod.c @@ -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 , -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 diff --git a/demod/mod/rs92mod.c b/demod/mod/rs92mod.c index 98c9e3e..03e3f0c 100644 --- a/demod/mod/rs92mod.c +++ b/demod/mod/rs92mod.c @@ -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 , -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