iq_svcl: sum of dB -> avg dB, i.e. dB(sum FFT)

pull/37/head
Zilog80 2021-03-13 08:49:09 +01:00
rodzic 1832c3392f
commit 5f17c0f6a7
1 zmienionych plików z 12 dodań i 11 usunięć

Wyświetl plik

@ -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, "# <freq/sr>;<dB> ## 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;