GNU Radio World

RDS Receiver

Decodes RDS from the 57 kHz subcarrier of a broadcast FM station.

Press Load to open this flowgraph in an editor embedded above, then ▶ to run it. Nothing is downloaded until you do.

Open in the full editor ▶ Download the .grc

Blocks used

BlockModuleUsed
Null SinkGNU Radio3
VariableGNU Radio3
AGCGNU Radio1
Constellation ReceiverGNU Radio1
DelayGNU Radio1
Differential DecoderGNU Radio1
Float To ComplexGNU Radio1
GR World RecordingGNU Radio1
Low Pass FilterGNU Radio1
MultiplyGNU Radio1
QT GUI Constellation SinkGNU Radio1
Quadrature DemodGNU Radio1
Rational ResamplerGNU Radio1
RDS Decodergr-rds1
RDS Panelgr-rds1
RDS Parsergr-rds1
Root Raised Cosine FilterGNU Radio1
Signal SourceGNU Radio1
SubtractGNU Radio1
Symbol SyncGNU Radio1
ThrottleGNU Radio1

Flowgraph source

rds/rds_receiver.grc
options:
    parameters:
        author: Marc
        copyright: ''
        description: Decodes RDS from the 57 kHz subcarrier of a broadcast FM station.
        generate_options: qt_gui
        id: RDS_Receiver
        title: RDS Receiver
    states:
        coordinate: [10, 10]
        rotation: 0
        state: enabled
blocks:
-   name: rds_carrier
    id: variable
    parameters:
        comment: ''
        value: '57000'
    states:
        coordinate: [590, 10]
        rotation: 0
        state: enabled
-   name: rds_samp_rate
    id: variable
    parameters:
        comment: ''
        value: '19000'
    states:
        coordinate: [760, 10]
        rotation: 0
        state: enabled
-   name: samp_rate
    id: variable
    parameters:
        comment: ''
        value: '250000'
    states:
        coordinate: [960, 10]
        rotation: 0
        state: enabled
-   name: agc
    id: analog_agc_xx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        gain: '53'
        max_gain: '1000'
        maxoutbuf: '0'
        minoutbuf: '0'
        rate: '0.002'
        reference: '0.585'
        type: complex
    states:
        coordinate: [80, 820]
        rotation: 0
        state: enabled
-   name: biphase_delay
    id: blocks_delay
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        delay: '8'
        maxoutbuf: '0'
        minoutbuf: '0'
        type: complex
    states:
        coordinate: [1080, 560]
        rotation: 0
        state: enabled
-   name: biphase_sub
    id: blocks_sub_xx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
        num_inputs: '2'
        type: complex
        vlen: '1'
    states:
        coordinate: [1350, 560]
        rotation: 0
        state: enabled
-   name: constellation_receiver
    id: digital_constellation_receiver_cb
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        constellation: digital.constellation_bpsk().base()
        fmax: '0.002'
        fmin: '-0.002'
        loop_bw: 2*math.pi/100
        maxoutbuf: '0'
        minoutbuf: '0'
        showports: 'False'
    states:
        coordinate: [1010, 740]
        rotation: 0
        state: enabled
-   name: constellation_sink
    id: qtgui_const_sink_x
    parameters:
        affinity: ''
        alias: ''
        alpha1: '1'
        autoscale: 'False'
        axislabels: 'True'
        color1: '"blue"'
        comment: ''
        grid: 'False'
        label1: ''
        legend: 'True'
        marker1: '0'
        name: RDS BPSK
        size: '1024'
        style1: '0'
        tr_chan: '0'
        tr_level: '0'
        tr_mode: qtgui.TRIG_MODE_FREE
        tr_slope: qtgui.TRIG_SLOPE_POS
        tr_tag: ''
        update_time: '0.1'
        width1: '1'
        xmax: '2'
        xmin: '-2'
        ymax: '2'
        ymin: '-2'
    states:
        coordinate: [80, 1160]
        rotation: 0
        state: enabled
-   name: diff_decoder
    id: digital_diff_decoder_bb
    parameters:
        affinity: ''
        alias: ''
        coding: digital.DIFF_DIFFERENTIAL
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
        modulus: '2'
    states:
        coordinate: [80, 1060]
        rotation: 0
        state: enabled
-   name: discard_error
    id: blocks_null_sink
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        type: float
    states:
        coordinate: [80, 1300]
        rotation: 0
        state: enabled
-   name: discard_freq
    id: blocks_null_sink
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        type: float
    states:
        coordinate: [80, 1400]
        rotation: 0
        state: enabled
-   name: discard_phase
    id: blocks_null_sink
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        type: float
    states:
        coordinate: [80, 1500]
        rotation: 0
        state: enabled
-   name: mpx_to_complex
    id: blocks_float_to_complex
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [1050, 220]
        rotation: 0
        state: enabled
-   name: quad_demod
    id: analog_quadrature_demod_cf
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        gain: samp_rate/(2*math.pi*75e3)
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [700, 220]
        rotation: 0
        state: enabled
-   name: rds_decoder
    id: rds_decoder
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        debug: 'False'
        log: 'False'
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [460, 1060]
        rotation: 0
        state: enabled
-   name: rds_lo
    id: analog_sig_source_x
    parameters:
        affinity: ''
        alias: ''
        amplitude: '1'
        comment: ''
        frequency: -rds_carrier
        maxoutbuf: '0'
        minoutbuf: '0'
        samp_rate: samp_rate
        type: complex
        waveform: analog.GR_COS_WAVE
    states:
        coordinate: [1050, 340]
        rotation: 0
        state: enabled
-   name: rds_lpf
    id: low_pass_filter
    parameters:
        affinity: ''
        alias: ''
        beta: '6.76'
        comment: ''
        cutoff_freq: '3000'
        decim: '5'
        gain: '1'
        interp: '1'
        maxoutbuf: '0'
        minoutbuf: '0'
        samp_rate: samp_rate
        type: fir_filter_ccf
        width: '2000'
        win: window.WIN_HAMMING
    states:
        coordinate: [80, 500]
        rotation: 0
        state: enabled
-   name: rds_mixer
    id: blocks_multiply_xx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
        num_inputs: '2'
        type: complex
        vlen: '1'
    states:
        coordinate: [1350, 230]
        rotation: 0
        state: enabled
-   name: rds_panel
    id: rds_panel
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        freq: '100000000'
        gui_hint: ''
    states:
        coordinate: [960, 1060]
        rotation: 0
        state: enabled
-   name: rds_parser
    id: rds_parser
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        debug: 'False'
        log: 'False'
        maxoutbuf: '0'
        minoutbuf: '0'
        pty_locale: '0'
        reset: '0'
    states:
        coordinate: [710, 1050]
        rotation: 0
        state: enabled
-   name: recording
    id: wasm_gr_world_recording
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        length: '0'
        maxoutbuf: '0'
        minoutbuf: '0'
        offset: '0'
        recording: fm_rds_250k_1Msamples
        repeat: 'True'
        type: complex
    states:
        coordinate: [10, 190]
        rotation: 0
        state: enabled
-   name: resample_19k
    id: rational_resampler_xxx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        decim: '50'
        fbw: '0'
        interp: '19'
        maxoutbuf: '0'
        minoutbuf: '0'
        taps: '[]'
        type: ccc
    states:
        coordinate: [380, 540]
        rotation: 0
        state: enabled
-   name: rrc_filter
    id: root_raised_cosine_filter
    parameters:
        affinity: ''
        alias: ''
        alpha: '1'
        comment: ''
        decim: '1'
        gain: '1'
        interp: '1'
        maxoutbuf: '0'
        minoutbuf: '0'
        ntaps: '151'
        samp_rate: rds_samp_rate
        sym_rate: rds_samp_rate/8
        type: fir_filter_ccf
    states:
        coordinate: [700, 510]
        rotation: 0
        state: enabled
-   name: symbol_sync
    id: digital_symbol_sync_xx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        constellation: digital.constellation_bpsk().base()
        damping: '1'
        loop_bw: '0.01'
        max_dev: '0.1'
        maxoutbuf: '0'
        minoutbuf: '0'
        nfilters: '128'
        osps: '1'
        pfb_mf_taps: '[]'
        resamp_type: digital.IR_MMSE_8TAP
        sps: '16'
        ted_gain: '1'
        ted_type: digital.TED_ZERO_CROSSING
        type: cc
    states:
        coordinate: [350, 750]
        rotation: 0
        state: enabled
-   name: throttle
    id: blocks_throttle2
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        ignoretag: 'True'
        limit: auto
        maximum: '0.1'
        maxoutbuf: '0'
        minoutbuf: '0'
        samples_per_second: samp_rate
        type: complex
        vlen: '1'
    states:
        coordinate: [370, 200]
        rotation: 0
        state: enabled
connections:
- [agc, '0', symbol_sync, '0']
- [biphase_delay, '0', biphase_sub, '0']
- [biphase_sub, '0', agc, '0']
- [constellation_receiver, '0', diff_decoder, '0']
- [constellation_receiver, '1', discard_error, '0']
- [constellation_receiver, '2', discard_phase, '0']
- [constellation_receiver, '3', discard_freq, '0']
- [constellation_receiver, '4', constellation_sink, '0']
- [diff_decoder, '0', rds_decoder, '0']
- [mpx_to_complex, '0', rds_mixer, '0']
- [quad_demod, '0', mpx_to_complex, '0']
-   src_blk_id: rds_decoder
    src_port_id: out
    snk_blk_id: rds_parser
    snk_port_id: in
- [rds_lo, '0', rds_mixer, '1']
- [rds_lpf, '0', resample_19k, '0']
- [rds_mixer, '0', rds_lpf, '0']
-   src_blk_id: rds_parser
    src_port_id: out
    snk_blk_id: rds_panel
    snk_port_id: in
- [recording, '0', throttle, '0']
- [resample_19k, '0', rrc_filter, '0']
- [rrc_filter, '0', biphase_delay, '0']
- [rrc_filter, '0', biphase_sub, '1']
- [symbol_sync, '0', constellation_receiver, '0']
- [throttle, '0', quad_demod, '0']
metadata:
    file_format: 2
    grc_version: 3.11.0.0