Here, and in the stats stackexchange, seem to be answers that reference tests for bimodal distributions that involve iterative binning or iterative curve fitting methods. However "eyeballing" a plot of a data set often shows a clear bimodality (say a 10 dB dip or several standard deviations between two clear mode peaks, etc.), versus a single "hump", or something ambiguous (less than a 3 dB dip).

Are there any lightweight algorithms (computationally efficient, single pass, or deterministic low iteration count tests) which can separate out the easy cases (clearly unimodal, or clearly bimodal), versus data sets that may require more computationally intensive tests for likelihood of multi or bi-modality?

Or, in signal processing terms, how can one non-graphically and quickly test whether some area in a noisy spectrogram is more likely to contain 2-tone FSK (with an unknown separation), rather than noise or some other kind of modulated signal?

  • $\begingroup$ is it required that you work on the spectrogram? this would generally sound like a job for a parametric spectrum estimator rather than a non-parametric one $\endgroup$ – Marcus Müller Jan 23 '20 at 23:03
  • $\begingroup$ A spectrogram is only one category of several types of data sets that might have these kinds of distributions. $\endgroup$ – hotpaw2 Jan 24 '20 at 5:36
  • $\begingroup$ :) Ok, so this question is really about the distribution testing, and not so much about the FSK detection. $\endgroup$ – Marcus Müller Jan 24 '20 at 8:13

An easy way, especially one that is used in the detection and SNR estimation of PSK signals in a noisy signal, is based on stochastic moments of the received amplitude:

The kurtosis can be used as measure of how little "centered" a symmetric distribution is.

You could calculate a sample kurtosis frequency bin-wise in your spectrogram; those bins with high curtosis are likely to contain more than just Gaussian noise.

In a slightly more elaborate version of that algorithm optimized for detecting 2-FSK, you could use that to identify "candidate bins", subtract their mean power to have zero mean variables, and then calculate the covariance of pairs of these (i.e. calculate a covariance matrix). You're looking for a strong negative covariance – whenever one bin has above-average power, the other has low power.


If the test is just to test the hypothesis that there is noise vs. the hypothesis that there is noise plus some bimodal signal, then I would compare the mean absolute value of the signal, or some higher-order even moment (i.e. 4, 6 or 8) vs. its standard deviation (assuming it's zero mean).

For high SNR, that should give a pretty distinct prediction, without a need for binning.

(And note -- "Just eyeball for a double-hump distribution" is what is happening when you build up a histogram and do analysis on it. That's exactly the sort of pattern matching that 500 million years of evolution has granted to our innate visual processing that only seems easy and automatic because it's unconscious).

  • $\begingroup$ Not sure how this works. It's easy for two distribution with identical mean and std.dev. measures for one to be similar to Gaussian and the other to be clearly bimodal (> 3 dB dip in the middle). $\endgroup$ – hotpaw2 Jan 25 '20 at 0:18
  • 1
    $\begingroup$ I did not say "mean", I said "mean of the absolute value". For a zero-noise bimodal signal occurring at x = -1 and x = 1, the variance is 1 and the mean of the absolute value is exactly 1; for a Gaussian with variance 1 the mean of the absolute value is 0.8 or so. Or you can compare variance against the 4th or higher roots -- that perfect bimodal distribution will have all even moments equal to 1, but the 4th root of the 4th moment of a Gaussian is 1.3. $\endgroup$ – TimWescott Jan 25 '20 at 15:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.