gr-specest is a great library which is capable of obtaining the spectral correlation density of a signal via the Frequency Accumulation Method.
An article on ‘Modulation Classification in Cognitive Radio’ (pdf) provides a nice description of the FAM algorithm.
I have plotted profiles from the gr-specest block, for different modulation schemes and believe there are other
modulation schemes this approach wouldn’t be able to classify.
For instance WBFM looks the same as AM-DSB and GFSK looks the same as AM-DSB.
You can see in the graphs below the similarity of different PSK schemes.
The graphs where generated using a simple program I wrote which uses the gr-specest block – data_generate_fam.py
Issues with SCF
I found the following paper, which shows how the SCF method I have been attempting to use, is unable
to distinguish between different PSK schemes, without pre-processing the data, which resulted in my low accuracy
Improved PSK Classification Using Spectral Correlation Function – Jeevan Kuriakose, A.Rajesh and P.K.Bora
The alternative approach – using CNNs
I found the following awesome paper on a different approach Convolutional Radio Modulation Recognition Networks – Timothy J. O’Shea , Johnathan Corgan , and T. Charles Clancy, instead of the approach I have been attempting to use, where there is significant processing before passing the data to the ANN, their approach, takes the complex data of a signal and applies it directly to the neural network.
I find this approach especially fascinating as the network is able to learn from the raw data itself.
I created a simple implementation using their model specification in TensorFlow via the TFlearn API.
You can download that at train_cnn.py
I trained the model on the labelled dataset they created – RadioML, which is an invaluable resource!
It is currently obtaining 92.79% accuracy at 18dB, which is significantly better than the SCF method I was attempting to use.
It is capable of recognising the following modulation schemes:
What to do next
I am now going to create a TensorFlow graph for this model, which can be loaded by my TFModel block, to then take
PMT input, from Sebastian’s blocks. So that classifications can be obtained on signals in GNU Radio.