diff --git a/hardware/AFSK.c b/hardware/AFSK.c index a4174f8..749882e 100755 --- a/hardware/AFSK.c +++ b/hardware/AFSK.c @@ -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->iirY[0] = afsk->iirY[1]; 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 #error Unsupported filter cutoff! #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->iirY[0] = afsk->iirY[1]; 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 #error Unsupported filter cutoff! #endif @@ -500,7 +516,7 @@ void AFSK_adc_isr(Afsk *afsk, int8_t currentSample) { afsk->currentPhase %= PHASE_MAX; afsk->actualBits <<= 1; - + uint8_t bits = afsk->sampledBits & 0x07; if (bits == 0x07 || // 111 bits == 0x06 || // 110 @@ -510,6 +526,7 @@ void AFSK_adc_isr(Afsk *afsk, int8_t currentSample) { afsk->actualBits |= 1; } + if (!hdlcParse(&afsk->hdlc, !TRANSITION_FOUND(afsk->actualBits), &afsk->rxFifo)) { afsk->status |= 1; if (fifo_isfull(&afsk->rxFifo)) { diff --git a/hardware/AFSK.h b/hardware/AFSK.h index 99fe1f8..4b09b64 100755 --- a/hardware/AFSK.h +++ b/hardware/AFSK.h @@ -39,10 +39,10 @@ inline static uint8_t sinSample(uint16_t i) { #define CPU_FREQ F_CPU -#define BITRATE 1200 +#define BITRATE 300 #if BITRATE == 300 - #define CONFIG_ADC_SAMPLERATE 9600UL + #define CONFIG_ADC_SAMPLERATE 4800UL #define CONFIG_DAC_SAMPLERATE 19200UL #define CLOCK_TICKS_PER_10_MS 96 #elif BITRATE == 1200 @@ -80,7 +80,6 @@ inline static uint8_t sinSample(uint16_t i) { #define DAC_SAMPLESPERBIT (CONFIG_DAC_SAMPLERATE / BITRATE) #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 #define SIGNAL_TRANSITIONED(bits) DUAL_XOR((bits), (bits) >> 2) #elif BITRATE == 1200 @@ -94,34 +93,33 @@ inline static uint8_t sinSample(uint16_t i) { #endif #if BITRATE == 300 - // TODO: Real-world tests on which resolution is best - //#define PHASE_BITS 8 - #define PHASE_BITS 4 + #define PHASE_BITS 1 #else #define PHASE_BITS 8 // Sub-sample phase counter resolution #endif #define PHASE_INC 1 // Nudge by above resolution for each adjustment + #define PHASE_MAX (ADC_SAMPLESPERBIT * PHASE_BITS) // Size of our phase counter // TODO: Test which target is best in real world // For 1200, this seems a little better #if BITRATE == 300 - #define PHASE_THRESHOLD (PHASE_MAX / 2) + #define PHASE_THRESHOLD (PHASE_MAX / 2) #elif BITRATE == 1200 #if CONFIG_ADC_SAMPLERATE == 19200 #define PHASE_THRESHOLD (PHASE_MAX / 2)+3*PHASE_BITS // Target transition point of our phase window #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 #elif BITRATE == 2400 #define PHASE_THRESHOLD (PHASE_MAX / 2) // Target transition point of our phase window #endif #if BITRATE == 300 - #define DCD_TIMEOUT_SAMPLES 512 - #define DCD_MIN_COUNT 4 + #define DCD_TIMEOUT_SAMPLES 256 + #define DCD_MIN_COUNT 1 #elif BITRATE == 1200 #define DCD_TIMEOUT_SAMPLES CONFIG_ADC_SAMPLERATE/100 #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 SPACE_FREQ 3970 #elif BITRATE == 300 - #define FILTER_CUTOFF 500 + #define FILTER_CUTOFF 155 #define MARK_FREQ 1600 #define SPACE_FREQ 1800 #else @@ -189,7 +187,7 @@ typedef struct Afsk #elif BITRATE == 2400 int8_t delayBuf[7 + 1]; #elif BITRATE == 300 - int8_t delayBuf[16 + 1]; + int8_t delayBuf[9 + 1]; #endif FIFOBuffer rxFifo; // FIFO for received data