From 5f17c0f6a7655909fdbb879a9afcae85783dc845 Mon Sep 17 00:00:00 2001 From: Zilog80 Date: Sat, 13 Mar 2021 08:49:09 +0100 Subject: [PATCH] iq_svcl: sum of dB -> avg dB, i.e. dB(sum FFT) --- demod/iq_svcl/iq_server.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/demod/iq_svcl/iq_server.c b/demod/iq_svcl/iq_server.c index 79dba32..b78cdba 100644 --- a/demod/iq_svcl/iq_server.c +++ b/demod/iq_svcl/iq_server.c @@ -290,8 +290,8 @@ static void *thd_FFT(void *targs) { int bitQ = 0; float complex *z = NULL; - float *db = NULL; - float *sum_db = NULL; + float *avg_rZ = NULL; + float *avg_db = NULL; dsp_t dsp = {0}; //memset(&dsp, 0, sizeof(dsp)); @@ -326,8 +326,8 @@ static void *thd_FFT(void *targs) { z = calloc(dsp.decM+1, sizeof(float complex)); if (z == NULL) goto exit_thread; - db = calloc(dsp.DFT.N+1, sizeof(float)); if (db == NULL) goto exit_thread; - sum_db = calloc(dsp.DFT.N+1, sizeof(float)); if (sum_db == NULL) goto exit_thread; + avg_rZ = calloc(dsp.DFT.N+1, sizeof(float)); if (avg_rZ == NULL) goto exit_thread; + avg_db = calloc(dsp.DFT.N+1, sizeof(float)); if (avg_db == NULL) goto exit_thread; int j, n = 0; @@ -378,15 +378,16 @@ static void *thd_FFT(void *targs) { raw_dft(&(dsp.DFT), dsp.DFT.Z); - db_power(&(dsp.DFT), dsp.DFT.Z, db); - for (j = 0; j < dsp.DFT.N; j++) sum_db[j] += db[j]; + for (j = 0; j < dsp.DFT.N; j++) avg_rZ[j] += cabs(dsp.DFT.Z[j]); sum_n++; n_fft = 0; } if (sum_n*fft_step*mlen >= sec*dsp.sr_base) { - for (j = 0; j < dsp.DFT.N; j++) sum_db[j] /= (float)sum_n; + for (j = 0; j < dsp.DFT.N; j++) avg_rZ[j] /= dsp.DFT.N*(float)sum_n; + for (j = 0; j < dsp.DFT.N; j++) avg_db[j] = 20.0*log10(avg_rZ[j]+1e-20); + pthread_mutex_lock( (dsp.thd)->mutex ); fprintf(FPOUT, "<%d: FFT>\n", (dsp.thd)->tn); @@ -401,7 +402,7 @@ static void *thd_FFT(void *targs) { l = write(tharg->fd, sendln, sendln_len); for (j = dsp.DFT.N/2; j < dsp.DFT.N/2 + dsp.DFT.N; j++) { memset(sendln, 0, LINELEN+1); - snprintf(sendln, LINELEN, "%+11.8f;%7.2f\n", bin2fq(&(dsp.DFT), j % dsp.DFT.N), sum_db[j % dsp.DFT.N]); + snprintf(sendln, LINELEN, "%+11.8f;%7.2f\n", bin2fq(&(dsp.DFT), j % dsp.DFT.N), avg_db[j % dsp.DFT.N]); sendln_len = strlen(sendln); l = write(tharg->fd, sendln, sendln_len); } @@ -413,7 +414,7 @@ static void *thd_FFT(void *targs) { if (fpo != NULL) { fprintf(fpo, "# ; ## sr:%d , N:%d\n", dsp.DFT.sr, dsp.DFT.N); for (j = dsp.DFT.N/2; j < dsp.DFT.N/2 + dsp.DFT.N; j++) { - fprintf(fpo, "%+11.8f;%7.2f\n", bin2fq(&(dsp.DFT), j % dsp.DFT.N), sum_db[j % dsp.DFT.N]); + fprintf(fpo, "%+11.8f;%7.2f\n", bin2fq(&(dsp.DFT), j % dsp.DFT.N), avg_db[j % dsp.DFT.N]); } fclose(fpo); } @@ -464,8 +465,8 @@ static void *thd_FFT(void *targs) { exit_thread: if (z) { free(z); z = NULL; } - if (db) { free(db); db = NULL; } - if (sum_db) { free(sum_db); sum_db = NULL; } + if (avg_rZ) { free(avg_rZ); avg_rZ = NULL; } + if (avg_db) { free(avg_db); avg_db = NULL; } reset_blockread(&dsp); (dsp.thd)->used = 0;