CW decoder in gr-satnogs 1.3.0

Here’s IQ data (48kHz complex floats) for 5 observations at UHF.
ftp://ftp.astron.nl/outgoing/bassa/satnogs/iq_cw_20180523_201637.dat | observation 142891
ftp://ftp.astron.nl/outgoing/bassa/satnogs/iq_cw_20180523_210827.dat | observation 143098
ftp://ftp.astron.nl/outgoing/bassa/satnogs/iq_cw_20180523_215130.dat | observation 143200
ftp://ftp.astron.nl/outgoing/bassa/satnogs/iq_cw_20180524_061957.dat | observation 143202
ftp://ftp.astron.nl/outgoing/bassa/satnogs/iq_cw_20180524_063301.dat | observation 143203

1 Like

Is this interesting for you?

https://network.satnogs.org/observations/143782/

I am now using the better CW decided on my station as well. So hopefully I can give you some info soon…

1 Like

To satisfy my own curiosity I’ve written some code to decode CW from the SatNOGS ogg audio files. The algorithm tries to find tophats in a downsampled time series by fitting an analytical tophat to a set of consecutive points (e.g. 3x the width of a dit in time). For each fit the amplitude of the tophat is compared to the rms of the noise after removing the fit. In this case when the function matches an actual tophat, the noise will be smallest, and the amplitude largest, whereas when it is a bad fit, the noise will be large and the amplitude small.

The plot below shows the amplitude/noise (let’s call it SNR) of dits and dats in real data (shown in blue) in orange and green. Since the space between dits/dats is an inverted dit tophat, and the space between words an inverted dat tophat, those peaks can also be identified (red and purple). The algorithm then finds peaks in the SNR of each type to identify elements.

A stand alone python program works reasonably well, provided the WPM rate is known. This algorithm should work well in the gr-satnogs block, and will simplify matters, as the thresholding can now be computed from the data itself inside the block, instead of having to rely on AGCs to scale the timeseries to place a threshold.

3 Likes