I am making a project about FPGA based software defined radio. I need to sample FM signal(88-108Mhz) to the baseband. I am using DE0 nano FPGA board and it has ADC with 0.8Mhz to 3.2Mhz clock signal. However I don't know how to choose proper sampling frequency. I will choose an FM radio channel lets say 100Mhz and I need to take it's center frequency to 0. I am not sure if I could tell what I need so I can try to explain clearly if you want.
Thank you in advance.
I suspect the part you are missing is the local oscillator. Typically in an SDR the incoming signal is "mixed" (which is a multiplication) with a sine signal that is at (or near) the desired signal. The result of multiplying a signal x with \( \sin(2\pi f) \) are two signals one at x - f, and one at x + f. You typically filter off the top or bottom half depending on whether or not you are making an up converter or a down converter.
So if you mix your signal with a 100 MHz sine wave, the result will be a copy at 200 MHz and one at DC. Sample the one at DC with a bandwidth of 200 kHz, you can then feed that into an FM demodulator directly, or you can get fancy and lock on the pilot tone at 19 kHz in that signal and demodulate the "right" signal and subtract it from the combined signal to get you stereo "left" and "right" streams.
Thanks for your clear response. Do you have any idea about how to generate 100MHz sine wave because the ADC has 0.8-3.2 MHz clock frequency and 50-200ksps sampling rate.
Typically the local oscillator will be generated by a frequency synthesizer. That and the mixer would be "in addition" to what you have on hand. That said, ...
Given that you're a student and learning this stuff, consider what you learned about aliasing. Here is a clue, without filtering, when you sample a signal at rate 'r', everything in the spectrum above the nyquist rate (r/2) gets folded into your samples by aliasing. How might you exploit that to get what you want?
The ADC specs have nearly nothing to do with your 100MHz sine wave.
If you can get the FPGA to generate a 100MHz square wave, then buffer it and filter it.
If you're planning on applying this 100MHz sine wave to a mixer, then consider that most analog mixers (diode rings, Gilbert cells, etc.) "want" the parts driven by the LO to be saturated, and generally work better if driven by a square wave. If you do drive them into proper saturation with a sine wave, they're effectively multiplying the RF signal by a square wave anyway -- so you're just wasting components.
You can subsample so that your bandpass signal is shifted in the baseband. In a Simulink model (undersample_100.slx) a sine signal of 100.01 MHz is shifted in the baseband with a sampling frequency of 1 MHz. A spectral line then appears at 10 kHz and 0.990 MHz, as shown in Figure 1.
Figure 2 shows the Simulink model and Figure 3 shows the display of the Spectrum Analyzer Block. Figure 4 shows the baseband signal of 10 kHz as it appears on the scope block.
You have a fundamental problem. You want to deal with FM radio -- broadcast radio by the frequency you quote -- but you have a board with a 200ksps ADC.
The frequency spacing of FM channels is 200kHz, and I have it in my notes that the bandwidth of an FM channel is 256kHz (I think this is wrong, but even if it's 190kHz or whatever, it doesn't materially change my analysis). This pretty much means that if you have a 200ksps ADC you can't get there from here. If you sampled with one ADC the Nyquist criterion would limit you to a bandwidth of 100kHz -- and the Nyquist criterion is a line in the sand, not something you can snuggle up to (see this article on sampling).
A comfortable sampling rate for a 256kHz wide signal would be around 1Msps -- and even if you had that, you'd need to take the wild and woolly content hitting your antenna and filter out everything except the 256kHz you need. That's a bandwidth to carrier ratio of around 400:1 -- and that's an exceedingly difficult filter to realize under any circumstances, and pretty much impossible to make tunable.
This is why the superheterodyne radio was invented.
You could do that anyway -- it's kind of the 1950 military specialty radio way, but it would work, and be an interesting exercise in obsolete circuit design techniques.
You could generate a carrier signal at your channel frequency and use an I/Q down-converter followed by a pair of sufficiently fast ADCs. You would need fast DACs, the down-converter, and different ADCs than what you have. This would have all the downsides to analog I/Q downconversion.
Or you could build a superheterodyne FM receiver, and sample the IF output. That's nearly completely defeating the purpose of a digital receiver (unless you want to learn), but it could be done. As a plus, if you are just interested in learning, you could probably find a kit or an old radio to modify.
Or you could filter to between 87.9MHz and 107.9MHz (20MHz nominal), and sample at a nice comfortable 150MHz with something like the ADC9642. That puts the entire FM radio band between 42.1MHz and 62.1MHz internally; you can then implement just about any scheme you want (including, with enough FPGA resources, demodulating all 101 FM channels simultaneously).
But whatever you do, you can't use that 200ksps ADC -- it's just too slow.
The spacing is 200Khz and everything is supposed to exist within 75KHz of the band center frequency by declaration. Really... nothing of interest should be outside of 53-ish KHz of the band center frequency because I doubt anyone is using the "commercial-free background music" bandwidth and I'm not sure that the OP would care if they were.
If it were me... I would start by going after the mono spectral segment within the first 15KHz of the band center frequency. Until I heard music coming from a single speaker, I wouldn't be getting much more adventurous. That would significantly improve the sample rate issue.
That plot is for the signal that's fed to the modulator. But it's FM, so the modulation process is nonlinear. That means that you cannot pick and choose what part of the unmodulated signal to deal with, until after you have demodulated it. So you need to bring the whole signal into your demodulator, unmolested.
The rule of thumb for FM bandwidth is twice the audio bandwidth plus twice the deviation. FM broadcast deviation is 75kHz -- so by the rule of thumb that works out to an occupied bandwidth of 300kHz.
Well, that's weird.
So, let's go to the well -- or at least the US well. This is what the (US) FCC has to say:
§73.317 FM transmission system requirements.
(a) FM broadcast stations employing transmitters authorized after January 1, 1960, must maintain the bandwidth occupied by their emissions in accordance with the specification detailed below. FM broadcast stations employing transmitters installed or type accepted before January 1, 1960, must achieve the highest degree of compliance with these specifications practicable with their existing equipment. In either case, should harmful interference to other authorized stations occur, the licensee shall correct the problem promptly or cease operation.
(b) Any emission appearing on a frequency removed from the carrier by between 120 kHz and 240 kHz inclusive must be attenuated at least 25 dB below the level of the unmodulated carrier. Compliance with this requirement will be deemed to show the occupied bandwidth to be 240 kHz or less.
(c) Any emission appearing on a frequency removed from the carrier by more than 240 kHz and up to and including 600 kHz must be attenuated at least 35 dB below the level of the unmodulated carrier.
(d) Any emission appearing on a frequency removed from the carrier by more than 600 kHz must be attenuated at least 43 + 10 Log10 (Power, in watts) dB below the level of the unmodulated carrier, or 80 dB, whichever is the lesser attenuation.
(e) Preemphasis shall not be greater than the impedance-frequency characteristics of a series inductance resistance network having a time constant of 75 microseconds. (See upper curve of Figure 2 of §73.333.)
So, to update what I said before, the FCC's take on occupied bandwidth is 240kHz -- and that's just too much for 200ksps ADCs. The only way to use your 19kHz bandwidth would be to build your own mono FM station. Then you'd still have to build a superhet receiver to receive it, and you'd have just built a transmitter.
I didn't intend to suggest that the demodulation was to be skipped. Only that I would not be trying to work on the entire band as a first go.
Thank you very much, I should start with that 15kHz at first.