MATLAB’s SSCA: commP25ssca.m

In this short post, I describe some errors that are produced by MATLAB’s strip spectral correlation analyzer function commP25ssca.m. I don’t recommend that you use it; far better to create your own function.

If you subscribe to MATLAB’s Communication Toolbox, you have access to an implementation of the SSCA: commP25ssca.m. The function has help text that looks like this:

This function is written according to (1) Figure 3 and Figure 5 of the
reference: E. L. Da Costa, “Detection and Identification of
Cyclostationary Signals”. MS Thesis. 1996. (2) Section 3.2 of the
reference: Eric April, “On the Implementation of the Strip Spectral
Correlation Algorithm for Cyclic Spectrum Estimation”. February, 1994.

The function takes four arguments:

function [Sx,alphao,fo] = commP25ssca(input,fs,df,dalpha)

where input is the complex-valued input data, fs is the sampling rate corresponding to input, df is the spectral resolution, and dalpha is the cycle-frequency resolution.

commP25ssca.m computes the non-conjugate spectral correlation function (SCF). So if you want the conjugate spectral correlation or either of the coherences, you’ll have to write your own functions or modify commP25ssca.m.

The trouble is that this function produces strong spurious cycle frequencies. In particular, it produces large spectral correlation function magnitudes for the normalized cycle frequencies of $\alpha = latex k/4$ for all inputs, whether or not those cycle frequencies are exhibited by the signals in the input data. Let’s show the evidence.

I consider two inputs. The first is a slight variation of our old friend the rectangular-pulse BPSK signal. In this variation, the bit rate is 1/9, which is changed from our usual selection of 1/10. The carrier frequency is still 0.05. We know from our previous work that this signal has non-conjugate cycle frequencies equal to harmonics of the bit rate, k/9, and conjugate cycle frequencies equal to the doubled carrier plus harmonics of the bit rate, 2f_c \pm k/9 = 0.1 \pm k/9. The second input is white Gaussian noise (WGN), which has no conjugate cycle frequencies and one non-conjugate cycle frequency, \alpha = 0.

I use two implementations of the SSCA. The first is commP25ssca.m and the second is one that I’ve written myself. The latter has been validated by checking its output against the theoretical spectral correlation function for several signals for which we have nice formulas for the SCF (such as PSK and QAM).

For my SSCA implementation, I run with 16 strips and process 65536 samples. This implies a frequency resolution of 1/16 and a cycle-frequency resolution of 1/65536, so I use df = 0.0625 and dalpha = 1/65536 in the call to commP25ssca.m.

Here are the results for the rectangular-pulse BPSK signal:

psd_rect_pulse_bpsk

cms_ssca_rec_bpsk

matlab_ssca_rec_bpsk

And here are the results for WGN:

psd_wgncms_ssca_wgnmatlab_ssca_wgn

You can see that commP25ssca.m produces the false cycle frequencies of 0.25, 0.5, and 0.75 for the WGN input. It produces these for the BPSK input as well, but also produces the false cycle frequencies of 0.1389 = 0.25 - f_{bit} = 0.25 - 1/9 and 0.3611 = 0.25 + f_{bit}.

The set of spurious cycle frequencies depends on the input parameter df. I’ve not done any kind of comprehensive study of this problem, but here is the graph of the commP25ssca.m output when we modify df from 1/16 to 1/32:

matlab_ssca_rec_bpsk_32

I haven’t tried to figure out what is going wrong with commP25ssca.m. If you do, please go ahead and post your findings to the comments section of this post.

I want to thank reader Serg for bringing this MATLAB problem to my attention!

Leave a Reply