diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2017-01-29 07:25:12 +0100 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2017-02-18 21:01:13 +0100 |
commit | 7e45f556cec493c3c77fcb6400d8ae211faf2220 (patch) | |
tree | cb5903509228c36e7dcd52ae0a049b380e81f401 /src/cnetz/dsp.c | |
parent | bd7ccc5fa05587606757adbacb6e1bf12f12fd2c (diff) |
Correcting all levels and move all remaining integer samples to sample_t
The leves are based on the standards of each mobile network. They
are adjusted to the specified frequency deviation now.
Diffstat (limited to 'src/cnetz/dsp.c')
-rw-r--r-- | src/cnetz/dsp.c | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/src/cnetz/dsp.c b/src/cnetz/dsp.c index a927c55..1fc404a 100644 --- a/src/cnetz/dsp.c +++ b/src/cnetz/dsp.c @@ -43,9 +43,12 @@ extern int voice_deviation; #define PI M_PI -#define BANDWIDTH 5500.0 /* maximum bandwidth */ -#define FSK_DEVIATION 10000 -#define COMPANDOR_0DB 30000 +#define MAX_DEVIATION 4000.0 +#define MAX_MODULATION 5280.0 +#define DBM0_DEVIATION 4000.0 /* deviation of dBm0 at 1 kHz */ +#define COMPANDOR_0DB 1.0 /* A level of 0dBm (1.0) shall be unaccected */ +#define FSK_DEVIATION (2500.0 / DBM0_DEVIATION) /* no emphasis */ +#define MAX_DISPLAY 1.4 /* something above dBm0, no emphasis */ #define BITRATE 5280.0 /* bits per second */ #define BLOCK_BITS 198 /* duration of one time slot including pause at beginning and end */ #define CUT_OFF_OFFSET 300.0 /* cut off frequency for offset filter (level correction between subsequent audio chunks) */ @@ -76,7 +79,7 @@ static void dsp_init_ramp(cnetz_t *cnetz) c = -sqrt(-c); else c = sqrt(c); - ramp_down[i] = (int)(c * (double)cnetz->fsk_deviation); + ramp_down[i] = c * (double)cnetz->fsk_deviation; ramp_up[i] = -ramp_down[i]; } } @@ -90,9 +93,8 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], do PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init FSK for 'Sender'.\n"); - /* set deviation and modulation parameters */ - cnetz->sender.bandwidth = BANDWIDTH; - cnetz->sender.sample_deviation = 2500.0 / (double)FSK_DEVIATION; + /* set modulation parameters */ + sender_set_fm(&cnetz->sender, MAX_DEVIATION, MAX_MODULATION, DBM0_DEVIATION, MAX_DISPLAY); if (measure_speed) { cnetz->measure_speed = measure_speed; @@ -119,7 +121,7 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], do } /* create devation and ramp */ - cnetz->fsk_deviation = FSK_DEVIATION; /* be sure not to overflow -32767 .. 32767 */ + cnetz->fsk_deviation = FSK_DEVIATION; dsp_init_ramp(cnetz); cnetz->fsk_noise = noise; @@ -465,7 +467,7 @@ static int fsk_distributed_encode(cnetz_t *cnetz, const char *bits) } while (phase < 256.0); phase -= 256.0; } - *marker = -32768; /* indicator for inserting speech */ + *marker = 999; /* marker for inserting speech */ } /* add 46 * (1+4+1 + 60) bits */ for (i = 0; i < 46; i++) { @@ -556,7 +558,7 @@ static int fsk_distributed_encode(cnetz_t *cnetz, const char *bits) } while (phase < 256.0); phase -= 256.0; } - *marker = -32768; /* indicator for inserting speech */ + *marker = 999; /* marker for inserting speech */ } /* depending on the number of samples, return the number */ @@ -706,7 +708,7 @@ again: if (length - count < copy) copy = length - count; for (i = 0; i < copy; i++) { - if (*spl == -32768) { + if (*spl == 999) { /* marker found to insert new chunk of audio */ jitter_load(&cnetz->sender.dejitter, speech_buffer, 100); /* 1. compress dynamics */ @@ -722,15 +724,9 @@ again: pre_emphasis(&cnetz->estate, speech_buffer, speech_length); /* change level */ if (voice_deviation != 1) { - int sample, j; - for (j = 0; j < speech_length; j++) { - sample = speech_buffer[j] * voice_deviation; - if (sample > 32767) - sample = 32767; - if (sample < -32768) - sample = -32768; - speech_buffer[j] = sample; - } + int j; + for (j = 0; j < speech_length; j++) + speech_buffer[j] *= (double)voice_deviation; } speech_pos = 0; } @@ -801,7 +797,7 @@ void unshrink_speech(cnetz_t *cnetz, sample_t *speech_buffer, int count) factor = cnetz->offset_factor; for (i = 0; i < count; i++) { /* change level */ - x = speech_buffer[i] / voice_deviation; + x = speech_buffer[i] / (double)voice_deviation; /* high-pass to remove low level frequencies, caused by level jump between audio chunks */ y = factor * (y_last + x - x_last); x_last = x; |