kopia lustrzana https://github.com/rs1729/RS
demod_mod: reduce % ops
rodzic
3cbe781d3a
commit
f2402c3b3d
|
@ -668,7 +668,6 @@ 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++) {
|
||||
|
@ -678,16 +677,16 @@ int f32buf_sample(dsp_t *dsp, int inv) {
|
|||
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->sample_decM += 1; if (dsp->sample_decM >= dsp->lut_len) dsp->sample_decM = 0;
|
||||
|
||||
dsp->decXbuffer[dsp->sample_dec % dsp->dectaps] = z;
|
||||
dsp->sample_dec += 1;
|
||||
if (dsp->sample_dec == s_reset) dsp->sample_dec = 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;
|
||||
|
|
|
@ -123,8 +123,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
|
||||
|
|
|
@ -123,14 +123,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 ;
|
||||
}
|
||||
|
@ -308,7 +308,7 @@ static int findstr(char *buff, char *str, int pos) {
|
|||
return i;
|
||||
}
|
||||
|
||||
float read_wav_header(pcm_t *pcm) {
|
||||
int read_wav_header(pcm_t *pcm) {
|
||||
FILE *fp = pcm->fp;
|
||||
char txt[4+1] = "\0\0\0\0";
|
||||
unsigned char dat[4];
|
||||
|
@ -663,7 +663,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
|
||||
|
@ -741,26 +741,26 @@ 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;
|
||||
//ui32_t s_reset = dsp->dectaps*dsp->lut_len;
|
||||
int j;
|
||||
if ( f32read_cblock(dsp) < dsp->decM ) return EOF;
|
||||
//if ( f32read_cblock(dsp) < dsp->decM * blk_sz) return EOF;
|
||||
for (j = 0; j < dsp->decM; j++) {
|
||||
z = dsp->decMbuf[j] * dsp->ex[dsp->sample_dec % dsp->lut_len];
|
||||
dsp->decXbuffer[dsp->sample_dec % dsp->dectaps] = z;
|
||||
dsp->sample_dec += 1;
|
||||
if (dsp->sample_dec == s_reset) dsp->sample_dec = 0;
|
||||
z = dsp->decMbuf[j] * dsp->ex[dsp->sample_decM];
|
||||
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)
|
||||
{
|
||||
z *= cexp(-t*2*M_PI*dsp->Df*I);
|
||||
z *= cexp(-t*_2PI*dsp->Df*I);
|
||||
}
|
||||
|
||||
|
||||
|
@ -791,8 +791,8 @@ int f32buf_sample(dsp_t *dsp, int inv) {
|
|||
{
|
||||
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;
|
||||
|
@ -804,13 +804,13 @@ int f32buf_sample(dsp_t *dsp, int inv) {
|
|||
z0 = dsp->rot_iqbuf[(dsp->sample_in-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);
|
||||
|
@ -821,8 +821,8 @@ int f32buf_sample(dsp_t *dsp, int inv) {
|
|||
{
|
||||
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 X1 = 0;
|
||||
float complex X2 = 0;
|
||||
|
@ -833,8 +833,8 @@ int f32buf_sample(dsp_t *dsp, int inv) {
|
|||
n--;
|
||||
t = -n / (double)dsp->sr;
|
||||
z = dsp->rot_iqbuf[(dsp->sample_in - n + dsp->N_IQBUF) % dsp->N_IQBUF]; // +1
|
||||
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);
|
||||
}
|
||||
|
||||
xbit = cabs(X2) - cabs(X1);
|
||||
|
@ -1112,7 +1112,7 @@ int init_buffers(dsp_t *dsp) {
|
|||
int i, pos;
|
||||
float b0, b1, b2, b, t;
|
||||
float normMatch;
|
||||
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;
|
||||
|
@ -1156,7 +1156,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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1315,6 +1315,14 @@ int init_buffers(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;
|
||||
}
|
||||
|
||||
|
@ -1419,8 +1427,8 @@ int find_header(dsp_t *dsp, float thres, int hdmax, int bitofs, int opt_dc) {
|
|||
double diffDf = dsp->dDf*0.6; //0.4
|
||||
if (1 && dsp->opt_iq >= 2) {
|
||||
// update rot_iqbuf, F1sum, F2sum
|
||||
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 X1 = 0;
|
||||
float complex X2 = 0;
|
||||
float complex _z = 0;
|
||||
|
@ -1429,12 +1437,12 @@ int find_header(dsp_t *dsp, float thres, int hdmax, int bitofs, int opt_dc) {
|
|||
{
|
||||
// update rot_iqbuf
|
||||
double _tn = (dsp->sample_in - _n) / (double)dsp->sr;
|
||||
dsp->rot_iqbuf[(dsp->sample_in - _n + dsp->N_IQBUF) % dsp->N_IQBUF] *= cexp(-_tn*2*M_PI*diffDf*I);
|
||||
dsp->rot_iqbuf[(dsp->sample_in - _n + dsp->N_IQBUF) % dsp->N_IQBUF] *= cexp(-_tn*_2PI*diffDf*I);
|
||||
//
|
||||
//update/reset F1sum, F2sum
|
||||
_z = dsp->rot_iqbuf[(dsp->sample_in - _n + dsp->N_IQBUF) % dsp->N_IQBUF];
|
||||
X1 += _z*cexp(-_tn*2*M_PI*f1*I);
|
||||
X2 += _z*cexp(-_tn*2*M_PI*f2*I);
|
||||
X1 += _z*cexp(-_tn*dsp->iw1);
|
||||
X2 += _z*cexp(-_tn*dsp->iw2);
|
||||
_n--;
|
||||
}
|
||||
dsp->F1sum = X1;
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#ifndef M_PI
|
||||
#define M_PI (3.1415926535897932384626433832795)
|
||||
#endif
|
||||
#define _2PI (6.2831853071795864769252867665590)
|
||||
|
||||
|
||||
#ifndef INTTYPES
|
||||
|
@ -100,6 +101,10 @@ typedef struct {
|
|||
float complex *rot_iqbuf;
|
||||
float complex F1sum;
|
||||
float complex F2sum;
|
||||
//
|
||||
double complex iw1;
|
||||
double complex iw2;
|
||||
|
||||
|
||||
//
|
||||
char *rawbits;
|
||||
|
@ -132,8 +137,9 @@ typedef struct {
|
|||
int blk_cnt;
|
||||
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
|
||||
|
@ -153,7 +159,7 @@ typedef struct {
|
|||
int lpFMtaps; // ui32_t
|
||||
float *ws_lpFM;
|
||||
float *lpFM_buf;
|
||||
float *fm_buffer;
|
||||
float *fm_buffer;
|
||||
|
||||
int opt_cnt;
|
||||
|
||||
|
@ -192,7 +198,7 @@ typedef struct {
|
|||
|
||||
|
||||
|
||||
float read_wav_header(pcm_t *);
|
||||
int read_wav_header(pcm_t *);
|
||||
int f32buf_sample(dsp_t *, int);
|
||||
int read_slbit(dsp_t *, int*, int, int, int, float, int);
|
||||
int read_softbit(dsp_t *, hsbit_t *, int, int, int, float, int );
|
||||
|
|
|
@ -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
|
||||
|
@ -78,7 +79,7 @@ int findstr(char *buff, char *str, int pos) {
|
|||
}
|
||||
|
||||
static
|
||||
float read_wav_header(pcm_t *pcm, FILE *fp) {
|
||||
int read_wav_header(pcm_t *pcm, FILE *fp) {
|
||||
char txt[4+1] = "\0\0\0\0";
|
||||
unsigned char dat[4];
|
||||
int byte, p=0;
|
||||
|
@ -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
|
||||
|
@ -445,24 +447,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 +652,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 +1306,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 +1507,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 +1529,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);
|
||||
|
|
|
@ -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 ;
|
||||
}
|
||||
|
@ -485,7 +490,7 @@ static int findstr(char *buff, char *str, int pos) {
|
|||
}
|
||||
|
||||
static
|
||||
float read_wav_header(pcm_t *pcm, FILE *fp) {
|
||||
int read_wav_header(pcm_t *pcm, FILE *fp) {
|
||||
char txt[4+1] = "\0\0\0\0";
|
||||
unsigned char dat[4];
|
||||
int byte, p=0;
|
||||
|
@ -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
|
||||
|
@ -774,31 +779,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 +825,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 +838,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 +855,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 +870,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 +1119,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 +1200,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 +1404,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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
@ -675,15 +676,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;
|
||||
|
|
Ładowanie…
Reference in New Issue