[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Discuss-gnuradio] Question on IF filter design for FM demodulation

From: Achilleas Anastasopoulos
Subject: [Discuss-gnuradio] Question on IF filter design for FM demodulation
Date: Thu, 06 Jan 2005 17:37:53 -0500
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)

Dear all,

I am looking at the FM demodulator example
provided in the gnuradio examples (in the mc4020 directory)
and I have a question on the
the design parameters of the filter used to separate one
FM station before demodulating:

the sampling frequency is 20 Msps
the desired station is centered at 5.75 MHz
the designed filter (lowpass version)
has a cutoff frequency at 250 KHz
and a transition band of 800KHz
The signal is filtered and IQ demodulated and then
decimated by a factor of 125.

It seems that this filter is too wide:
an adjacent FM station (at 5.75 MHz + 200 KHz)
is not attenuated at all and its spectrum (after decimation)
is folded on the desired station spectrum.
This is clearly seen in the simple example I attach.

What am I missing here?


#!/usr/bin/env python

import sys
from gnuradio import gr
from gnuradio.wxgui import stdgui
from gnuradio.wxgui import fftsink
import wx

class filter_plus_fft (stdgui.gui_flow_graph):
    def __init__(self, frame, panel, vbox, argv):
        stdgui.gui_flow_graph.__init__ (self, frame, panel, vbox, argv)

        IF_freq = 5.75e6
        input_rate = 20.00e6
        cfir_decimation = 125
        cut_off = 250e3
        trans_band_width = 800e3

        src = gr.sig_source_f (input_rate,gr.GR_SIN_WAVE,IF_freq, 1e0)
interference = gr.sig_source_f (input_rate,gr.GR_SIN_WAVE,IF_freq+200e3, 1e0)
        adder = gr.add_ff()
        # compute FIR filter taps for channel selection
        channel_coeffs = \
            gr.firdes.low_pass (1.0,          # gain
                                input_rate,   # sampling rate
                                cut_off,      # low pass cutoff freq
trans_band_width, # width of trans. band
        # input: float; output: complex
        chan_filter = \
          gr.freq_xlating_fir_filter_fcf (cfir_decimation,
        # fft window as final sink
block, fft_win = fftsink.make_fft_sink_c (self, panel, "Filtered Signal", 1024, input_rate / cfir_decimation)
        # now wire it all together
        self.connect (src, (adder,0))
        self.connect (interference, (adder,1))
        self.connect (adder, chan_filter)
        self.connect (chan_filter, block)
        vbox.Add (fft_win, 1, wx.EXPAND)

def main ():
    app = stdgui.stdapp (filter_plus_fft, "FM Demod Problem")
    app.MainLoop ()

if __name__ == '__main__':
    main ()


reply via email to

[Prev in Thread] Current Thread [Next in Thread]