AMPS: Add option to be more tollerant to sync detection
Also it detects more false syncs, but this is ignored if decoding fails.
This commit is contained in:
@@ -340,7 +340,7 @@ static amps_t *search_pc(void)
|
|||||||
static void amps_go_idle(amps_t *amps);
|
static void amps_go_idle(amps_t *amps);
|
||||||
|
|
||||||
/* Create transceiver instance and link to a list. */
|
/* Create transceiver instance and link to a list. */
|
||||||
int amps_create(int channel, enum amps_chan_type chan_type, const char *sounddev, int samplerate, int cross_channels, double rx_gain, int pre_emphasis, int de_emphasis, const char *write_wave, const char *read_wave, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int loopback)
|
int amps_create(int channel, enum amps_chan_type chan_type, const char *sounddev, int samplerate, int cross_channels, double rx_gain, int pre_emphasis, int de_emphasis, const char *write_wave, const char *read_wave, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int tolerant, int loopback)
|
||||||
{
|
{
|
||||||
sender_t *sender;
|
sender_t *sender;
|
||||||
amps_t *amps;
|
amps_t *amps;
|
||||||
@@ -407,7 +407,7 @@ int amps_create(int channel, enum amps_chan_type chan_type, const char *sounddev
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* init audio processing */
|
/* init audio processing */
|
||||||
rc = dsp_init_sender(amps, (de_emphasis == 0));
|
rc = dsp_init_sender(amps, (de_emphasis == 0), tolerant);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
PDEBUG(DAMPS, DEBUG_ERROR, "Failed to init audio processing!\n");
|
PDEBUG(DAMPS, DEBUG_ERROR, "Failed to init audio processing!\n");
|
||||||
goto error;
|
goto error;
|
||||||
|
@@ -77,6 +77,7 @@ typedef struct amps {
|
|||||||
double fsk_rx_elapsed; /* bit duration since last level change */
|
double fsk_rx_elapsed; /* bit duration since last level change */
|
||||||
enum fsk_rx_sync fsk_rx_sync; /* sync state */
|
enum fsk_rx_sync fsk_rx_sync; /* sync state */
|
||||||
uint16_t fsk_rx_sync_register; /* shift register to detect sync word */
|
uint16_t fsk_rx_sync_register; /* shift register to detect sync word */
|
||||||
|
int fsk_rx_sync_tolerant; /* be more tolerant to sync */
|
||||||
/* the dotting buffer stores the elapsed samples, so we can calculate
|
/* the dotting buffer stores the elapsed samples, so we can calculate
|
||||||
* an average time of zero-crossings during dotting sequence.
|
* an average time of zero-crossings during dotting sequence.
|
||||||
* this buffer wrapps every 256 values */
|
* this buffer wrapps every 256 values */
|
||||||
@@ -160,7 +161,7 @@ const char *amps_min12number(uint32_t min1);
|
|||||||
void amps_number2min(const char *number, uint32_t *min1, uint16_t *min2);
|
void amps_number2min(const char *number, uint32_t *min1, uint16_t *min2);
|
||||||
const char *amps_min2number(uint32_t min1, uint16_t min2);
|
const char *amps_min2number(uint32_t min1, uint16_t min2);
|
||||||
const char *amps_scm(uint8_t scm);
|
const char *amps_scm(uint8_t scm);
|
||||||
int amps_create(int channel, enum amps_chan_type chan_type, const char *sounddev, int samplerate, int cross_channels, double rx_gain, int pre_emphasis, int de_emphasis, const char *write_wave, const char *read_wave, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int loopback);
|
int amps_create(int channel, enum amps_chan_type chan_type, const char *sounddev, int samplerate, int cross_channels, double rx_gain, int pre_emphasis, int de_emphasis, const char *write_wave, const char *read_wave, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int tolerant, int loopback);
|
||||||
void amps_destroy(sender_t *sender);
|
void amps_destroy(sender_t *sender);
|
||||||
void amps_rx_signaling_tone(amps_t *amps, int tone, double quality);
|
void amps_rx_signaling_tone(amps_t *amps, int tone, double quality);
|
||||||
void amps_rx_sat(amps_t *amps, int tone, double quality);
|
void amps_rx_sat(amps_t *amps, int tone, double quality);
|
||||||
|
@@ -125,6 +125,8 @@ static double sat_freq[5] = {
|
|||||||
|
|
||||||
static int dsp_sine_sat[256];
|
static int dsp_sine_sat[256];
|
||||||
|
|
||||||
|
static uint8_t dsp_sync_check[0x800];
|
||||||
|
|
||||||
/* global init for FSK */
|
/* global init for FSK */
|
||||||
void dsp_init(void)
|
void dsp_init(void)
|
||||||
{
|
{
|
||||||
@@ -136,6 +138,17 @@ void dsp_init(void)
|
|||||||
s = sin((double)i / 256.0 * 2.0 * PI);
|
s = sin((double)i / 256.0 * 2.0 * PI);
|
||||||
dsp_sine_sat[i] = (int)(s * SAT_DEVIATION);
|
dsp_sine_sat[i] = (int)(s * SAT_DEVIATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* sync checker */
|
||||||
|
for (i = 0; i < 0x800; i++) {
|
||||||
|
dsp_sync_check[i] = 0xff; /* no sync */
|
||||||
|
}
|
||||||
|
for (i = 0; i < 11; i++) {
|
||||||
|
dsp_sync_check[0x712 ^ (1 << i)] = 0x01; /* one bit error */
|
||||||
|
dsp_sync_check[0x0ed ^ (1 << i)] = 0x81; /* one bit error */
|
||||||
|
}
|
||||||
|
dsp_sync_check[0x712] = 0x00; /* no bit error */
|
||||||
|
dsp_sync_check[0x0ed] = 0x80; /* no bit error */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dsp_init_ramp(amps_t *amps)
|
static void dsp_init_ramp(amps_t *amps)
|
||||||
@@ -160,7 +173,7 @@ static void dsp_init_ramp(amps_t *amps)
|
|||||||
static void sat_reset(amps_t *amps, const char *reason);
|
static void sat_reset(amps_t *amps, const char *reason);
|
||||||
|
|
||||||
/* Init FSK of transceiver */
|
/* Init FSK of transceiver */
|
||||||
int dsp_init_sender(amps_t *amps, int high_pass)
|
int dsp_init_sender(amps_t *amps, int high_pass, int tolerant)
|
||||||
{
|
{
|
||||||
double coeff;
|
double coeff;
|
||||||
int16_t *spl;
|
int16_t *spl;
|
||||||
@@ -240,6 +253,9 @@ int dsp_init_sender(amps_t *amps, int high_pass)
|
|||||||
amps->highpass_factor = RC / (RC + dt);
|
amps->highpass_factor = RC / (RC + dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* be more tolerant when syncing */
|
||||||
|
amps->fsk_rx_sync_tolerant = tolerant;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
@@ -508,7 +524,11 @@ static void fsk_rx_bit(amps_t *amps, int16_t *spl, int len, int pos, int begin,
|
|||||||
if (amps->fsk_rx_sync != FSK_SYNC_POSITIVE && amps->fsk_rx_sync != FSK_SYNC_NEGATIVE) {
|
if (amps->fsk_rx_sync != FSK_SYNC_POSITIVE && amps->fsk_rx_sync != FSK_SYNC_NEGATIVE) {
|
||||||
amps->fsk_rx_sync_register = (amps->fsk_rx_sync_register << 1) | bit;
|
amps->fsk_rx_sync_register = (amps->fsk_rx_sync_register << 1) | bit;
|
||||||
/* check if we received a sync */
|
/* check if we received a sync */
|
||||||
if ((amps->fsk_rx_sync_register & 0x7ff) == 0x712) {
|
switch (dsp_sync_check[amps->fsk_rx_sync_register & 0x7ff]) {
|
||||||
|
case 0x01:
|
||||||
|
if (!amps->fsk_rx_sync_tolerant)
|
||||||
|
break;
|
||||||
|
case 0x00:
|
||||||
#ifdef DEBUG_DECODER
|
#ifdef DEBUG_DECODER
|
||||||
printf("Sync word detected (positive)\n");
|
printf("Sync word detected (positive)\n");
|
||||||
#endif
|
#endif
|
||||||
@@ -520,8 +540,10 @@ prepare_frame:
|
|||||||
amps->fsk_rx_sync_register = 0x555;
|
amps->fsk_rx_sync_register = 0x555;
|
||||||
amps->when_received = get_time() - (21.0 / (double)BITRATE);
|
amps->when_received = get_time() - (21.0 / (double)BITRATE);
|
||||||
return;
|
return;
|
||||||
}
|
case 0x81:
|
||||||
if ((amps->fsk_rx_sync_register & 0x7ff) == 0x0ed) {
|
if (!amps->fsk_rx_sync_tolerant)
|
||||||
|
break;
|
||||||
|
case 0x80:
|
||||||
#ifdef DEBUG_DECODER
|
#ifdef DEBUG_DECODER
|
||||||
printf("Sync word detected (negative)\n");
|
printf("Sync word detected (negative)\n");
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
void dsp_init(void);
|
void dsp_init(void);
|
||||||
int dsp_init_sender(amps_t *amps, int high_pass);
|
int dsp_init_sender(amps_t *amps, int high_pass, int tolerant);
|
||||||
void dsp_cleanup_sender(amps_t *amps);
|
void dsp_cleanup_sender(amps_t *amps);
|
||||||
void amps_set_dsp_mode(amps_t *amps, enum dsp_mode mode, int frame_length);
|
void amps_set_dsp_mode(amps_t *amps, enum dsp_mode mode, int frame_length);
|
||||||
|
|
||||||
|
@@ -45,6 +45,7 @@ int num_chan_type = 0;
|
|||||||
enum amps_chan_type chan_type[MAX_SENDER] = { CHAN_TYPE_CC_PC_VC };
|
enum amps_chan_type chan_type[MAX_SENDER] = { CHAN_TYPE_CC_PC_VC };
|
||||||
const char *flip_polarity = "";
|
const char *flip_polarity = "";
|
||||||
int ms_power = 4, dcc = 0, scc = 0, sid = 40, regh = 1, regr = 1, pureg = 1, pdreg = 1, locaid = -1, regincr = 300, bis = 0;
|
int ms_power = 4, dcc = 0, scc = 0, sid = 40, regh = 1, regr = 1, pureg = 1, pdreg = 1, locaid = -1, regincr = 300, bis = 0;
|
||||||
|
int tolerant = 0;
|
||||||
|
|
||||||
void print_help(const char *arg0)
|
void print_help(const char *arg0)
|
||||||
{
|
{
|
||||||
@@ -86,6 +87,8 @@ void print_help(const char *arg0)
|
|||||||
printf(" -S --sysinfo bis=0 | bis=1\n");
|
printf(" -S --sysinfo bis=0 | bis=1\n");
|
||||||
printf(" If 0, phone ignores BUSY/IDLE bit on FOCC (default = '%d')\n", bis);
|
printf(" If 0, phone ignores BUSY/IDLE bit on FOCC (default = '%d')\n", bis);
|
||||||
printf(" If 1, be sure to have a round-trip delay (latency) not more than 5 ms\n");
|
printf(" If 1, be sure to have a round-trip delay (latency) not more than 5 ms\n");
|
||||||
|
printf(" -T --tolerant\n");
|
||||||
|
printf(" Be more tolerant when hunting for sync sequence\n");
|
||||||
printf("\nstation-id: Give 10 digit station-id, you don't need to enter it for every\n");
|
printf("\nstation-id: Give 10 digit station-id, you don't need to enter it for every\n");
|
||||||
printf(" start of this program.\n");
|
printf(" start of this program.\n");
|
||||||
}
|
}
|
||||||
@@ -101,10 +104,11 @@ static int handle_options(int argc, char **argv)
|
|||||||
{"flip-polarity", 1, 0, 'F'},
|
{"flip-polarity", 1, 0, 'F'},
|
||||||
{"ms-power", 1, 0, 'P'},
|
{"ms-power", 1, 0, 'P'},
|
||||||
{"sysinfo", 1, 0, 'S'},
|
{"sysinfo", 1, 0, 'S'},
|
||||||
|
{"tolerant", 0, 0, 'T'},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
set_options_common("t:F:P:S:", long_options_special);
|
set_options_common("t:F:P:S:T", long_options_special);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int option_index = 0, c;
|
int option_index = 0, c;
|
||||||
@@ -207,6 +211,10 @@ static int handle_options(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
skip_args += 2;
|
skip_args += 2;
|
||||||
break;
|
break;
|
||||||
|
case 'T':
|
||||||
|
tolerant = 1;
|
||||||
|
skip_args += 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
opt_switch_common(c, argv[0], &skip_args);
|
opt_switch_common(c, argv[0], &skip_args);
|
||||||
}
|
}
|
||||||
@@ -341,7 +349,7 @@ int main(int argc, char *argv[])
|
|||||||
amps_si si;
|
amps_si si;
|
||||||
|
|
||||||
init_sysinfo(&si, ms_power, ms_power, dcc, sid >> 1, regh, regr, pureg, pdreg, locaid, regincr, bis);
|
init_sysinfo(&si, ms_power, ms_power, dcc, sid >> 1, regh, regr, pureg, pdreg, locaid, regincr, bis);
|
||||||
rc = amps_create(kanal[i], chan_type[i], sounddev[i], samplerate, cross_channels, rx_gain, do_pre_emphasis, do_de_emphasis, write_wave, read_wave, &si, sid, scc, polarity, loopback);
|
rc = amps_create(kanal[i], chan_type[i], sounddev[i], samplerate, cross_channels, rx_gain, do_pre_emphasis, do_de_emphasis, write_wave, read_wave, &si, sid, scc, polarity, tolerant, loopback);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n");
|
fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
Reference in New Issue
Block a user