This page is mostly going to be an explanation on where the data from the Remote Decoder comes from, however I will start with a basic description of how the Web Decoder works.
To see the source code of the standalone version which only differs in that it can be cached and has a different style go to the git repository viewer.
The first link on the chain is the input of data. There are 3 potential sources of data, the microphone, the pre-recorded ISS packet, and the Remote decoder.
Data from the microphone is obtained though the Web Audio API. A processor node is attached to an Audio Context input and it then passes that data on to the demodulator.
The prerecorded ISS packet is loaded as a Blob from a raw data file and then sent directly into the decoder. It is also send to the output of an AudioContext.
The remote packet decoder uses a Web Socket and receives packet data from a remote source and processes that packet data directly.
The demodulator itself is rather simple. It takes data one byte at a time and buffers it until it has enough to process. Then it uses Goertzels algorithm to calculate the magnitudes of the two frequencies data is encoded on. The difference of the two frequencies is run through a moving average filter and then the Zero-Crossings in the data are located. It calculates the bit times between Zero-Crossings and turns that into a sequences of 0's and 1's which are then De-NRZI coded to get the message data.
The last step is to check raw packet data to see if it has a correct check sum and if it does parse it and display it for the user.
The remote decoder utilizes my C_DigiMode code to decode packets on Raspberry PI and forward them to the servers WebSocket relay as raw packet data.
The Raspberry PI with attached ADC:
SSH of the Raspberry PI console: