From 1c2e9180a2db989f26c5cff01eaa6ef12bb45011 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Sat, 19 Aug 2017 12:21:35 +0200 Subject: [PATCH] Radiocom 2000: Use high-pass filter to remove supervisory signal --- src/r2000/dsp.c | 11 ++++++++++- src/r2000/r2000.h | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/r2000/dsp.c b/src/r2000/dsp.c index 3b9dbd2..73a6d95 100644 --- a/src/r2000/dsp.c +++ b/src/r2000/dsp.c @@ -60,7 +60,7 @@ #define SUPER_BIT_ADJUST 0.5 /* how much do we adjust bit clock on frequency change */ #define SUPER_F0 136.0 #define SUPER_F1 164.0 -#define FILTER_STEP 0.002 /* step every 2 ms */ +#define SUPER_CUTOFF_H 400.0 /* filter to remove spectrum of supervisory signal */ #define MAX_DISPLAY 1.4 /* something above dBm0 */ /* global init for FSK */ @@ -102,6 +102,13 @@ int dsp_init_sender(r2000_t *r2000) return -EINVAL; } + /* remove frequencies of supervisory spectrum: + * TX = remove low frequencies from speech to be transmitted + * RX = remove received supervisory signal + */ + iir_highpass_init(&r2000->super_tx_hp, SUPER_CUTOFF_H, r2000->sender.samplerate, 2); + iir_highpass_init(&r2000->super_rx_hp, SUPER_CUTOFF_H, r2000->sender.samplerate, 2); + return 0; } @@ -248,6 +255,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length) && r2000->callref) { int count; + iir_process(&r2000->super_rx_hp, samples, length); count = samplerate_downsample(&r2000->sender.srstate, samples, length); #if 0 /* compandor only in direction REL->MS */ @@ -314,6 +322,7 @@ again: case DSP_MODE_AUDIO_TX: case DSP_MODE_AUDIO_TX_RX: jitter_load(&r2000->sender.dejitter, samples, length); + iir_process(&r2000->super_tx_hp, samples, length); /* do pre-emphasis */ if (r2000->pre_emphasis) pre_emphasis(&r2000->estate, samples, length); diff --git a/src/r2000/r2000.h b/src/r2000/r2000.h index 6eb0bc5..6d5ad46 100644 --- a/src/r2000/r2000.h +++ b/src/r2000/r2000.h @@ -99,10 +99,12 @@ typedef struct r2000 { uint32_t super_tx_word; /* supervisory info to transmit */ int super_tx_word_length; int super_tx_word_pos; + iir_filter_t super_tx_hp; /* filters away the speech that overlaps with the supervisory */ uint32_t super_rx_word; /* shift register for received supervisory info */ double super_rx_level[20]; /* level infos */ double super_rx_quality[20]; /* quality infos */ int super_rx_index; /* index for level and quality buffer */ + iir_filter_t super_rx_hp; /* filters away the supervisory */ double super_bittime; double super_bitpos;