The simplest is to square up the signal and measure the period. If the signal is subject to sufficient noise, this technique fails. A more robust technique is to use DSP techniques and use digital filtering. I find the early app notes from Texas Instruments are a good siurce of information. I'm not sure what your etsi spec refers to, but bell/ccitt fsk standards should be well covered.

The usual technique is a bandpass filter followed by a low pass filter and detect the phase change. You might need a auto gain block on the input.

The Goertzel algorithm is a technique in digital signal processing (DSP) that provides a means for efficient evaluation of individual terms of the discrete Fourier transform (DFT)

Like the DFT, the Goertzel algorithm analyses one selectable frequency component from a discrete signal. Unlike direct DFT calculations, the Goertzel algorithm applies a single real-valued coefficient at each iteration, using real-valued arithmetic for real-valued input sequences.

A more robust technique is to use DSP techniques and use digital filtering. I find the early app notes from Texas Instruments are a good source of information. I'm not sure what your etsi spec refers to, but bell/ccitt fsk standards should be well covered. The usual technique is a bandpass filter followed by a low pass filter and detect the phase change. You might need a auto gain block on the input.

I don't think zero crossing will work very well in this case. A single space is 1.5 cycles, and a single mark 1 cycle. Back in the day(maybe 34 years ago), when I was really quite smart, I can remember trying to decode maritime weather fax broadcasts that had a vaguely similar relationship between carriers and baud rate, and it was an effing nightmare. Phase locked loop decoder worked much better, IIRC.

That's not to say that throwing a bit of DSP at it wouldn't work, but I was using a 2MHz 6809 s the time, and zero crossing was really the only option.

I also agree that Goertzel probably won't be any use at all. It might alert you to the presence of a 1200kHz tone or an 1800kHz tone, but you knew that already.

I don't think zero crossing will work very well in this case. A single space is 1.5 cycles, and a single mark 1 cycle.

I can remember trying to decode maritime weather fax broadcasts that had a vaguely similar relationship between carriers and baud rate, and it was an effing nightmare. Phase locked loop decoder worked much better, IIRC.

Have you some points, links or other to look at about PLL decoder in C?

Maybe I can share my code, if someone is interested in this topic.

John_A_Brown wrote:

I also agree that Goertzel probably won't be any use at all. It might alert you to the presence of a 1200kHz tone or an 1800kHz tone, but you knew that already.

To summarize, I develop on a board attached to a radio device and its forward me the PCM audio samples in different ways..

Actually I take the audio at the sampling rate is 20KHz and my decoder works, but I see some instability problems on the radio (the timing are tight), so I decided to switch to another chain point and, there, the sampling rate is 8KHz.

Unfortunately I cannot decide the sampling rate. It's fixed to 20KHz or 8KHz

If 20kHz works, but 8kHz does not, why not use 20Khz.

It seems that 1200/1800 1200baud is quite information compressed already, so cutting corners to 8kHz is not going to help ? That has far fewer sample points per-bit time. (6.66 vs 16.66)

What is the carrier lead time - your capture seems to gate the carrier ?

You could look to Phase/Frequency lock to 1200 base, and then check if there is an expected 1200 follower, or an 1800 follower

I'm guessing the modulator actually sends 1200 phase modulated too, so as to continue the 1800 slope, and the 1800 has 2 possible images, meaning you have a total of 4 'patterns' to test for 'closest match to'.