selcal/scripts/README.md

2.5 KiB

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 <wavfile, arecord>
low pass & decimate if necessary
<simultaneously>
    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

<simultaneously>
    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)

Usage

Either

./audio-capture.sh | ./live.py

or

./audio-pipe.sh ./samples/MA-ZC.wav | ./live.py