Electronic – Simple way to decoding FSK

fmfpgafsk

I'm trying to build simple fsk transmitter and receiver, the transmitter is just an FPGA with a wire, the logic is quite simple, I mix (with a XOR) the transmission frequency with a lower frequency, thats create some distortions which can be picked up with a simple FM receiver.

The receiver is based on the TDA7000 (yes I know that's obsolete) with a fixed tuning frequency. Here is the received spectrum for two different case, the peak at 1.1 KHz should indicate logic LOW and the peak at 1.6 KHz should indicate HIGH, the peaks are about 300mV, but I guess it may vary

received spectrum

Note that there are distrotions at 2.1 Khz and and 3 Khz.

How can I feed the signal to an FPGA, which should count and identify the frequency, with a minimal number of parts, I guess LM741 is too much for that kind of task.
How do I deal with the distortions?
Any other suggestions?

Best Answer

schematic

simulate this circuit – Schematic created using CircuitLab

You could get the signal into the FPGA by running it through an op-amp to give it a DC offset (and possibly increase the amplitude, although that's not strictly necessary), then into an ADC; the ADC doesn't need to be particularly fast given that your signals are at quite a low frequency, and an FPGA can drive any ADC with an SPI (or parallel) interface with some very simple logic.

Once the FPGA can "see" the signal via the ADC, you have any number of DSP options for decoding it. Xilinx, for example, have free IP cores for digital filters and/or FFT engines, either of which can do what you need - discarding unwanted frequencies (including the distortions you refer to) and detecting your desired frequencies.