300 baud optimisations
This commit is contained in:
parent
ede7b5c443
commit
73a1a28f96
|
@ -410,7 +410,18 @@ void AFSK_adc_isr(Afsk *afsk, int8_t currentSample) {
|
||||||
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / IIR_GAIN;
|
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / IIR_GAIN;
|
||||||
afsk->iirY[0] = afsk->iirY[1];
|
afsk->iirY[0] = afsk->iirY[1];
|
||||||
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] / IIR_POLE);
|
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] / IIR_POLE);
|
||||||
|
#elif FILTER_CUTOFF == 155
|
||||||
|
#define IIR_GAIN 6 // Really 5.99865959
|
||||||
|
#define IIR_POLE 2 // Really Y[0] * 0.6665921828
|
||||||
|
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / IIR_GAIN;
|
||||||
|
afsk->iirY[0] = afsk->iirY[1];
|
||||||
|
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] / IIR_POLE);
|
||||||
|
#elif FILTER_CUTOFF == 100
|
||||||
|
#define IIR_GAIN 9 // Really 8.763507115
|
||||||
|
#define IIR_POLE 0.77 // Really Y[0] * 0.7717808665
|
||||||
|
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / IIR_GAIN;
|
||||||
|
afsk->iirY[0] = afsk->iirY[1];
|
||||||
|
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] * IIR_POLE);
|
||||||
#else
|
#else
|
||||||
#error Unsupported filter cutoff!
|
#error Unsupported filter cutoff!
|
||||||
#endif
|
#endif
|
||||||
|
@ -422,7 +433,12 @@ void AFSK_adc_isr(Afsk *afsk, int8_t currentSample) {
|
||||||
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / IIR_GAIN;
|
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / IIR_GAIN;
|
||||||
afsk->iirY[0] = afsk->iirY[1];
|
afsk->iirY[0] = afsk->iirY[1];
|
||||||
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] / IIR_POLE);
|
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] / IIR_POLE);
|
||||||
|
#elif FILTER_CUTOFF == 200
|
||||||
|
#define IIR_GAIN 9 // Really 8.763507115
|
||||||
|
#define IIR_POLE 2 // Really Y[0] * 0.7717808665
|
||||||
|
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / IIR_GAIN;
|
||||||
|
afsk->iirY[0] = afsk->iirY[1];
|
||||||
|
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + ((afsk->iirY[0] / 4) * 3);
|
||||||
#else
|
#else
|
||||||
#error Unsupported filter cutoff!
|
#error Unsupported filter cutoff!
|
||||||
#endif
|
#endif
|
||||||
|
@ -500,7 +516,7 @@ void AFSK_adc_isr(Afsk *afsk, int8_t currentSample) {
|
||||||
afsk->currentPhase %= PHASE_MAX;
|
afsk->currentPhase %= PHASE_MAX;
|
||||||
|
|
||||||
afsk->actualBits <<= 1;
|
afsk->actualBits <<= 1;
|
||||||
|
|
||||||
uint8_t bits = afsk->sampledBits & 0x07;
|
uint8_t bits = afsk->sampledBits & 0x07;
|
||||||
if (bits == 0x07 || // 111
|
if (bits == 0x07 || // 111
|
||||||
bits == 0x06 || // 110
|
bits == 0x06 || // 110
|
||||||
|
@ -510,6 +526,7 @@ void AFSK_adc_isr(Afsk *afsk, int8_t currentSample) {
|
||||||
afsk->actualBits |= 1;
|
afsk->actualBits |= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!hdlcParse(&afsk->hdlc, !TRANSITION_FOUND(afsk->actualBits), &afsk->rxFifo)) {
|
if (!hdlcParse(&afsk->hdlc, !TRANSITION_FOUND(afsk->actualBits), &afsk->rxFifo)) {
|
||||||
afsk->status |= 1;
|
afsk->status |= 1;
|
||||||
if (fifo_isfull(&afsk->rxFifo)) {
|
if (fifo_isfull(&afsk->rxFifo)) {
|
||||||
|
|
|
@ -39,10 +39,10 @@ inline static uint8_t sinSample(uint16_t i) {
|
||||||
#define CPU_FREQ F_CPU
|
#define CPU_FREQ F_CPU
|
||||||
|
|
||||||
|
|
||||||
#define BITRATE 1200
|
#define BITRATE 300
|
||||||
|
|
||||||
#if BITRATE == 300
|
#if BITRATE == 300
|
||||||
#define CONFIG_ADC_SAMPLERATE 9600UL
|
#define CONFIG_ADC_SAMPLERATE 4800UL
|
||||||
#define CONFIG_DAC_SAMPLERATE 19200UL
|
#define CONFIG_DAC_SAMPLERATE 19200UL
|
||||||
#define CLOCK_TICKS_PER_10_MS 96
|
#define CLOCK_TICKS_PER_10_MS 96
|
||||||
#elif BITRATE == 1200
|
#elif BITRATE == 1200
|
||||||
|
@ -80,7 +80,6 @@ inline static uint8_t sinSample(uint16_t i) {
|
||||||
#define DAC_SAMPLESPERBIT (CONFIG_DAC_SAMPLERATE / BITRATE)
|
#define DAC_SAMPLESPERBIT (CONFIG_DAC_SAMPLERATE / BITRATE)
|
||||||
#define DAC_TICKS_BETWEEN_SAMPLES ((((CPU_FREQ+FREQUENCY_CORRECTION)) / CONFIG_DAC_SAMPLERATE) - 1)
|
#define DAC_TICKS_BETWEEN_SAMPLES ((((CPU_FREQ+FREQUENCY_CORRECTION)) / CONFIG_DAC_SAMPLERATE) - 1)
|
||||||
|
|
||||||
// TODO: Maybe revert to only looking at two samples
|
|
||||||
#if BITRATE == 300
|
#if BITRATE == 300
|
||||||
#define SIGNAL_TRANSITIONED(bits) DUAL_XOR((bits), (bits) >> 2)
|
#define SIGNAL_TRANSITIONED(bits) DUAL_XOR((bits), (bits) >> 2)
|
||||||
#elif BITRATE == 1200
|
#elif BITRATE == 1200
|
||||||
|
@ -94,34 +93,33 @@ inline static uint8_t sinSample(uint16_t i) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BITRATE == 300
|
#if BITRATE == 300
|
||||||
// TODO: Real-world tests on which resolution is best
|
#define PHASE_BITS 1
|
||||||
//#define PHASE_BITS 8
|
|
||||||
#define PHASE_BITS 4
|
|
||||||
#else
|
#else
|
||||||
#define PHASE_BITS 8 // Sub-sample phase counter resolution
|
#define PHASE_BITS 8 // Sub-sample phase counter resolution
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PHASE_INC 1 // Nudge by above resolution for each adjustment
|
#define PHASE_INC 1 // Nudge by above resolution for each adjustment
|
||||||
|
|
||||||
|
|
||||||
#define PHASE_MAX (ADC_SAMPLESPERBIT * PHASE_BITS) // Size of our phase counter
|
#define PHASE_MAX (ADC_SAMPLESPERBIT * PHASE_BITS) // Size of our phase counter
|
||||||
|
|
||||||
// TODO: Test which target is best in real world
|
// TODO: Test which target is best in real world
|
||||||
// For 1200, this seems a little better
|
// For 1200, this seems a little better
|
||||||
#if BITRATE == 300
|
#if BITRATE == 300
|
||||||
#define PHASE_THRESHOLD (PHASE_MAX / 2)
|
#define PHASE_THRESHOLD (PHASE_MAX / 2)
|
||||||
#elif BITRATE == 1200
|
#elif BITRATE == 1200
|
||||||
#if CONFIG_ADC_SAMPLERATE == 19200
|
#if CONFIG_ADC_SAMPLERATE == 19200
|
||||||
#define PHASE_THRESHOLD (PHASE_MAX / 2)+3*PHASE_BITS // Target transition point of our phase window
|
#define PHASE_THRESHOLD (PHASE_MAX / 2)+3*PHASE_BITS // Target transition point of our phase window
|
||||||
#elif CONFIG_ADC_SAMPLERATE == 9600
|
#elif CONFIG_ADC_SAMPLERATE == 9600
|
||||||
#define PHASE_THRESHOLD (PHASE_MAX / 2) // 64 // Target transition point of our phase window
|
#define PHASE_THRESHOLD (PHASE_MAX / 2) // Target transition point of our phase window
|
||||||
#endif
|
#endif
|
||||||
#elif BITRATE == 2400
|
#elif BITRATE == 2400
|
||||||
#define PHASE_THRESHOLD (PHASE_MAX / 2) // Target transition point of our phase window
|
#define PHASE_THRESHOLD (PHASE_MAX / 2) // Target transition point of our phase window
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BITRATE == 300
|
#if BITRATE == 300
|
||||||
#define DCD_TIMEOUT_SAMPLES 512
|
#define DCD_TIMEOUT_SAMPLES 256
|
||||||
#define DCD_MIN_COUNT 4
|
#define DCD_MIN_COUNT 1
|
||||||
#elif BITRATE == 1200
|
#elif BITRATE == 1200
|
||||||
#define DCD_TIMEOUT_SAMPLES CONFIG_ADC_SAMPLERATE/100
|
#define DCD_TIMEOUT_SAMPLES CONFIG_ADC_SAMPLERATE/100
|
||||||
#define DCD_MIN_COUNT CONFIG_ADC_SAMPLERATE/1600
|
#define DCD_MIN_COUNT CONFIG_ADC_SAMPLERATE/1600
|
||||||
|
@ -139,7 +137,7 @@ inline static uint8_t sinSample(uint16_t i) {
|
||||||
#define MARK_FREQ 2165
|
#define MARK_FREQ 2165
|
||||||
#define SPACE_FREQ 3970
|
#define SPACE_FREQ 3970
|
||||||
#elif BITRATE == 300
|
#elif BITRATE == 300
|
||||||
#define FILTER_CUTOFF 500
|
#define FILTER_CUTOFF 155
|
||||||
#define MARK_FREQ 1600
|
#define MARK_FREQ 1600
|
||||||
#define SPACE_FREQ 1800
|
#define SPACE_FREQ 1800
|
||||||
#else
|
#else
|
||||||
|
@ -189,7 +187,7 @@ typedef struct Afsk
|
||||||
#elif BITRATE == 2400
|
#elif BITRATE == 2400
|
||||||
int8_t delayBuf[7 + 1];
|
int8_t delayBuf[7 + 1];
|
||||||
#elif BITRATE == 300
|
#elif BITRATE == 300
|
||||||
int8_t delayBuf[16 + 1];
|
int8_t delayBuf[9 + 1];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FIFOBuffer rxFifo; // FIFO for received data
|
FIFOBuffer rxFifo; // FIFO for received data
|
||||||
|
|
Loading…
Reference in New Issue