My software defined radio for receiving AM transmissions in the 49 m band (see https://dm1cr.de/reception-of-radio-darc-transmission-with-a-microcontroller-only-sdr) looks quite primitive in the first version:
It comprises a bandpass filter for anti-aliasing, an STM32H743ZI microcontroller and an audio amplifier with loudspeaker.
The ADC inside of the STM32H7 is clocked by an internal PLL of the clock tree in such a way that the carrier of the AM signal lies at fs/4.
This is a digital signal processing trick, described, for example, in chapter 13 of the book Understanding Digital Signal Processing by Richard Lyons, third edition.
A signal that lies in the range of a quarter of the sampling rate is very easily down-converted. No multiplications are needed for that, only data some data assignment.
The data assignment that I use works as follows:
The DFSDM (a peripheral unit inside of the STM32H7, the abbreviation DFSDM stands for Digital Filter for Sigma-Delta-Modulators) is put into parallel, dual data input mode and the ADC data are fed to the input register of this unit in a way that downmixing is done on the fly.
This way two filters and decimators are provided with the right data.
The filtered and decimated output of the filters are I- and Q-signals that can be used for demodulation.
Demodulation is done by calculating the length of the IQ-vector and sending the result to the DAC.
The filter that I used for the first version of my SDR has a decimation factor of 128 (ST call this FOSR) and a filter order of 2 (FORD).
The DAC runs at sample rate FOSR times lower than the ADC
This simple filter works quite well as can be heard by listening to the video.
Of course there is a lot of room for improvements:
The DFSDM contains not only 2 filters, it contains 4 of these programmable CIC filters (also called Hogenauer filters, SINC filters, moving average filters, …).
The question for me is now: Can I improve the IQ-lowpass-filters by using not only one half of the DFSDM, but using the whole thing:
That means, can I use two cascaded CIC filters for each I- and Q-signal and, if yes, what is the best way to do it?
And is it worth the effort?
To be continued…