aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2017-01-06 14:13:14 +0100
committerAndreas Eversberg <jolly@eversberg.eu>2017-01-07 06:26:50 +0100
commit2d0bc92cdef930876d68c46448d84d3c4165129c (patch)
treee972cb71d2274e90f6d45318e623fc0df1502fc8 /src
parenta37dfe38aba937b3a1367d73e028057b3f4775c8 (diff)
C-Netz: Make demodulation buffer size dynamic
Diffstat (limited to 'src')
-rw-r--r--src/cnetz/dsp.c2
-rw-r--r--src/cnetz/fsk_fm_demod.c31
-rw-r--r--src/cnetz/fsk_fm_demod.h5
3 files changed, 32 insertions, 6 deletions
diff --git a/src/cnetz/dsp.c b/src/cnetz/dsp.c
index c124a19..42a1d51 100644
--- a/src/cnetz/dsp.c
+++ b/src/cnetz/dsp.c
@@ -181,6 +181,8 @@ void dsp_cleanup_sender(cnetz_t *cnetz)
free(cnetz->dsp_speech_buffer);
cnetz->dsp_speech_buffer = NULL;
}
+
+ fsk_fm_exit(&cnetz->fsk_demod);
}
/* receive sample time and calculate speed against system clock
diff --git a/src/cnetz/fsk_fm_demod.c b/src/cnetz/fsk_fm_demod.c
index f4008f4..4d2d7dd 100644
--- a/src/cnetz/fsk_fm_demod.c
+++ b/src/cnetz/fsk_fm_demod.c
@@ -102,6 +102,7 @@
#include <stdio.h>
#include <stdint.h>
+#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "../common/timer.h"
@@ -129,20 +130,42 @@ int fsk_fm_init(fsk_fm_demod_t *fsk, cnetz_t *cnetz, int samplerate, double bitr
len = (int)((double)samplerate / bitrate + 0.5);
half = (int)((double)samplerate / bitrate / 2.0 + 0.5);
- if (len > (int)(sizeof(fsk->bit_buffer_spl) / sizeof(fsk->bit_buffer_spl[0]))) {
- PDEBUG(DDSP, DEBUG_ERROR, "Sample rate too high for buffer, please use lower rate, like 192000 Hz!\n");
- return -1;
+ fsk->bit_buffer_spl = calloc(sizeof(fsk->bit_buffer_spl[0]), len);
+ if (!fsk->bit_buffer_spl) {
+ PDEBUG(DDSP, DEBUG_ERROR, "No mem!\n");
+ goto error;
}
fsk->bit_buffer_len = len;
fsk->bit_buffer_half = half;
fsk->bits_per_sample = bitrate / (double)samplerate;
- fsk->speech_size = sizeof(fsk->speech_buffer) / sizeof(fsk->speech_buffer[0]);
+ fsk->speech_size = samplerate * 60 / bitrate + 10; /* 60 bits duration, add 10 to be safe */
+ fsk->speech_buffer = calloc(sizeof(fsk->speech_buffer[0]), fsk->speech_size);
+ if (!fsk->speech_buffer) {
+ PDEBUG(DDSP, DEBUG_ERROR, "No mem!\n");
+ goto error;
+ }
fsk->level_threshold = 655;
return 0;
+
+error:
+ fsk_fm_exit(fsk);
+ return -1;
+}
+
+void fsk_fm_exit(fsk_fm_demod_t *fsk)
+{
+ if (fsk->bit_buffer_spl) {
+ free(fsk->bit_buffer_spl);
+ fsk->bit_buffer_spl = NULL;
+ }
+ if (fsk->speech_buffer) {
+ free(fsk->speech_buffer);
+ fsk->speech_buffer = NULL;
+ }
}
/* get levels, sync time and jitter from sync sequence or frame data */
diff --git a/src/cnetz/fsk_fm_demod.h b/src/cnetz/fsk_fm_demod.h
index b1889bd..8f4ce08 100644
--- a/src/cnetz/fsk_fm_demod.h
+++ b/src/cnetz/fsk_fm_demod.h
@@ -20,7 +20,7 @@ typedef struct fsk_fm_demod {
double bit_time_uncorrected; /* same as above, but not corrected by sync */
/* bit detection */
- int16_t bit_buffer_spl[40]; /* samples ring buffer */
+ int16_t *bit_buffer_spl; /* samples ring buffer */
int bit_buffer_len; /* number of samples in ring buffer */
int bit_buffer_half; /* half of ring buffer */
int bit_buffer_pos; /* current position to write next sample */
@@ -35,7 +35,7 @@ typedef struct fsk_fm_demod {
double sync_jitter; /* what was the jitter of the sync */
/* speech */
- int16_t speech_buffer[3000]; /* holds one chunk of 12.5ms */
+ int16_t *speech_buffer; /* holds one chunk of 12.5ms */
int speech_size;
int speech_count;
@@ -51,6 +51,7 @@ typedef struct fsk_fm_demod {
} fsk_fm_demod_t;
int fsk_fm_init(fsk_fm_demod_t *fsk, cnetz_t *cnetz, int samplerate, double bitrate);
+void fsk_fm_exit(fsk_fm_demod_t *fsk);
void fsk_fm_demod(fsk_fm_demod_t *fsk, int16_t *samples, int length);
void fsk_correct_sync(fsk_fm_demod_t *fsk, double offset);
void fsk_copy_sync(fsk_fm_demod_t *fsk_to, fsk_fm_demod_t *fsk_from);