NMT: Calculate quality of sync sequence and drop in case of bad quality
This eliminates chance of findig a sync sequence in noise or speech
This commit is contained in:
parent
c0cd74ac85
commit
5062628e52
|
@ -200,15 +200,33 @@ void dsp_cleanup_sender(nmt_t *nmt)
|
|||
static void fsk_receive_bit(nmt_t *nmt, int bit, double quality, double level)
|
||||
{
|
||||
double frames_elapsed;
|
||||
int i;
|
||||
|
||||
// printf("bit=%d quality=%.4f\n", bit, quality);
|
||||
if (!nmt->fsk_filter_in_sync) {
|
||||
nmt->fsk_filter_sync = (nmt->fsk_filter_sync << 1) | bit;
|
||||
|
||||
/* level and quality */
|
||||
nmt->fsk_filter_level[nmt->fsk_filter_count & 0xff] = level;
|
||||
nmt->fsk_filter_quality[nmt->fsk_filter_count & 0xff] = quality;
|
||||
nmt->fsk_filter_count++;
|
||||
|
||||
/* check if pattern 1010111100010010 matches */
|
||||
if (nmt->fsk_filter_sync != 0xaf12)
|
||||
return;
|
||||
// printf("sync\n");
|
||||
|
||||
/* average level and quality */
|
||||
level = quality = 0;
|
||||
for (i = 0; i < 16; i++) {
|
||||
level += nmt->fsk_filter_level[(nmt->fsk_filter_count - 1 - i) & 0xff];
|
||||
quality += nmt->fsk_filter_quality[(nmt->fsk_filter_count - 1 - i) & 0xff];
|
||||
}
|
||||
level /= 16.0; quality /= 16.0;
|
||||
// printf("sync (level = %.2f, quality = %.2f\n", level, quality);
|
||||
|
||||
/* do not accept garbage */
|
||||
if (quality < 0.65)
|
||||
return;
|
||||
|
||||
/* sync time */
|
||||
nmt->rx_sample_count_last = nmt->rx_sample_count_current;
|
||||
|
@ -218,8 +236,6 @@ static void fsk_receive_bit(nmt_t *nmt, int bit, double quality, double level)
|
|||
nmt->fsk_filter_sync = 0;
|
||||
nmt->fsk_filter_in_sync = 1;
|
||||
nmt->fsk_filter_count = 0;
|
||||
nmt->fsk_filter_levelsum = 0;
|
||||
nmt->fsk_filter_qualitysum = 0;
|
||||
|
||||
/* set muting of receive path */
|
||||
nmt->fsk_filter_mute = (int)((double)nmt->sender.samplerate * MUTE_DURATION);
|
||||
|
@ -227,20 +243,28 @@ static void fsk_receive_bit(nmt_t *nmt, int bit, double quality, double level)
|
|||
}
|
||||
|
||||
/* read bits */
|
||||
nmt->fsk_filter_frame[nmt->fsk_filter_count++] = bit + '0';
|
||||
nmt->fsk_filter_levelsum += level;
|
||||
nmt->fsk_filter_qualitysum += quality;
|
||||
if (nmt->fsk_filter_count != 140)
|
||||
nmt->fsk_filter_frame[nmt->fsk_filter_count] = bit + '0';
|
||||
nmt->fsk_filter_level[nmt->fsk_filter_count] = level;
|
||||
nmt->fsk_filter_quality[nmt->fsk_filter_count] = quality;
|
||||
if (++nmt->fsk_filter_count != 140)
|
||||
return;
|
||||
|
||||
/* end of frame */
|
||||
nmt->fsk_filter_frame[140] = '\0';
|
||||
nmt->fsk_filter_in_sync = 0;
|
||||
|
||||
/* average level and quality */
|
||||
level = quality = 0;
|
||||
for (i = 0; i < 140; i++) {
|
||||
level += nmt->fsk_filter_level[i];
|
||||
quality += nmt->fsk_filter_quality[i];
|
||||
}
|
||||
level /= 140.0; quality /= 140.0;
|
||||
|
||||
/* send telegramm */
|
||||
frames_elapsed = (double)(nmt->rx_sample_count_current - nmt->rx_sample_count_last) / (double)(nmt->samples_per_bit * 166);
|
||||
/* convert level so that received level at TX_PEAK_FSK results in 1.0 (100%) */
|
||||
nmt_receive_frame(nmt, nmt->fsk_filter_frame, nmt->fsk_filter_qualitysum / 140.0, nmt->fsk_filter_levelsum / 140.0 * 32768.0 / TX_PEAK_FSK, frames_elapsed);
|
||||
nmt_receive_frame(nmt, nmt->fsk_filter_frame, quality, level * 32768.0 / TX_PEAK_FSK, frames_elapsed);
|
||||
}
|
||||
|
||||
char *show_level(int value)
|
||||
|
|
|
@ -108,8 +108,8 @@ typedef struct nmt {
|
|||
int fsk_filter_mute; /* mute count down after sync */
|
||||
char fsk_filter_frame[141]; /* receive frame (one extra byte to terminate string) */
|
||||
int fsk_filter_count; /* next bit to receive */
|
||||
double fsk_filter_levelsum; /* sum of 140 level infos */
|
||||
double fsk_filter_qualitysum; /* sum of 140 quality infos */
|
||||
double fsk_filter_level[256]; /* level infos */
|
||||
double fsk_filter_quality[256];/* quality infos */
|
||||
int16_t *super_filter_spl; /* array with sample buffer for supervisory detection */
|
||||
int super_filter_pos; /* current sample position in filter_spl */
|
||||
double super_phaseshift256[4]; /* how much the phase of sine wave changes per sample */
|
||||
|
|
Loading…
Reference in New Issue