C-Netz: Add low pass filter to eliminate high frequency noise

This improves the FSK decoding quite allot, especially with SDR.
This commit is contained in:
Andreas Eversberg 2017-02-12 07:31:29 +01:00
parent 290b365d67
commit 4de1e0188d
2 changed files with 8 additions and 2 deletions

View File

@ -88,6 +88,7 @@ typedef struct cnetz {
/* dsp states */
enum dsp_mode dsp_mode; /* current mode: audio, "Telegramm", .... */
filter_t lp; /* low pass filter to eliminate noise above 5280 Hz */
fsk_fm_demod_t fsk_demod; /* demod process */
double fsk_deviation; /* deviation of FSK signal on sound card */
sample_t fsk_ramp_up[256]; /* samples of upward ramp shape */

View File

@ -44,7 +44,7 @@ extern int voice_deviation;
#define PI M_PI
#define MAX_DEVIATION 4000.0
#define MAX_MODULATION 5280.0
#define MAX_MODULATION 3000.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 */
@ -124,6 +124,9 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2])
cnetz->fsk_deviation = FSK_DEVIATION;
dsp_init_ramp(cnetz);
/* init low pass filter for received signal */
filter_lowpass_init(&cnetz->lp, MAX_MODULATION, cnetz->sender.samplerate, 2);
/* create speech buffer */
cnetz->dsp_speech_buffer = calloc(sizeof(sample_t), cnetz->sender.samplerate); /* buffer is greater than sr/1.1, just to be secure */
if (!cnetz->dsp_speech_buffer) {
@ -582,8 +585,10 @@ void sender_receive(sender_t *sender, sample_t *samples, int length)
return;
#endif
if (cnetz->dsp_mode != DSP_MODE_OFF)
if (cnetz->dsp_mode != DSP_MODE_OFF) {
filter_process(&cnetz->lp, samples, length);
fsk_fm_demod(&cnetz->fsk_demod, samples, length);
}
return;
}