diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..a9abed6 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,53 @@ +# Planned algorithm + +From selcald: +One possible solution to this problem is to step back from trying to determine the frequencies of the individual tones and to instead verify that: + +- There are two tones present +- The difference in frequency between the two tones matches a pair of known tones in the alphabet + +The author of selcald seems awfully hung up on trying to ensure correct detection of the silent period +between two tones. I don't think this is worth actively trying to detect, as it is more important +to find two dominant tones for a period of ~1 sec, followed by another 1 sec with two dominant tones. +The silence period is irrelevant - according to the spec of 0.2 +/- 0.1 sec _at the transmitter_ it +could be impossibly short to reliably distinguish between successive `A*-A*` tones at the receiver. + +## Terrible pseudocode +``` +collect samples from audio source +low pass & decimate if necessary + + run wide fft over a large sample window + detect peak bin (with some hysteresis) + if peak bin within tone band: + assume difference is due to doppler shift + gradually adjust expected freq(s) for tone(s) to match + record RMS energy into buffer + + + run correlation over small sample window + For each tone in the alphabet: + Cross correlate the audio with the adjusted tone + Record normalized tone energy into tone buffer + + For tone record in tone buffer: + sort tones by amplitude + if: + - the two highest amplitude tones are within 3 dB of each other + - the two highest amplitude tones are at least 3 dB greater than the next nearest tone + - the sum of the two highest tones account for at least 60% of the modulation energy (-2.22 dB) + (as determined relative to stable RMS energy calc'd by wide fft) + (nominally 90% / -0.458 dB) + then: + record dominant two tones in tone buffer + + if any two tones are dominant tones for the majority of previous 1 sec: + record dominant two tones in code buffer + reset tone detection counter (prohibit detecting codes for another 0.5 sec) + + upon code record in code buffer: + if dominant code previously occured within 1.25 sec + emit SELCAL detection + reset code detection counter (prohibit detecting codes for another 0.5 sec) + +```