GNU Radio World

ADS-B Receiver

Receives 1090 MHz ADS-B from an RTL-SDR and decodes the aircraft around you.

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
QT GUI RangeGNU Radio2
ADS-B Decodergr-adsb1
ADS-B Demodgr-adsb1
ADS-B Framergr-adsb1
ADS-B MapGNU Radio1
Complex to Mag^2GNU Radio1
Constant SourceGNU Radio1
GUI LayoutGNU Radio1
Message DebugGNU Radio1
QT GUI Time SinkGNU Radio1
QT GUI Waterfall SinkGNU Radio1
RTL-SDR SourceGNU Radio1
VariableGNU Radio1

Flowgraph source

gr-adsb/adsb_receiver.grc
options:
    parameters:
        author: Marc
        comment: ''
        copyright: ''
        description: Receives 1090 MHz ADS-B from an RTL-SDR and decodes the aircraft around you.
        generate_options: qt_gui
        id: ADS_B_Receiver
        title: ADS-B Receiver
    states:
        coordinate: [10, 10]
        rotation: 0
        state: enabled
blocks:
-   name: gain
    id: variable_qtgui_range
    parameters:
        comment: ''
        label: RF Gain
        min_len: '200'
        orient: QtCore.Qt.Horizontal
        rangeType: float
        start: '0'
        step: '1'
        stop: '49'
        value: '40'
        widget: counter_slider
    states:
        coordinate: [10, 360]
        rotation: 0
        state: enabled
-   name: samp_rate
    id: variable
    parameters:
        comment: "ADS-B is 1 Msym/s PPM,\nso the rate must be a\nmultiple of 1 Msps"
        value: '2000000'
    states:
        coordinate: [600, 10]
        rotation: 0
        state: enabled
-   name: threshold
    id: variable_qtgui_range
    parameters:
        comment: Raise it until only real bursts trigger
        label: Detection Threshold
        min_len: '200'
        orient: QtCore.Qt.Horizontal
        rangeType: float
        start: '0.001'
        step: '0.001'
        stop: '0.2'
        value: '0.01'
        widget: counter_slider
    states:
        coordinate: [820, 510]
        rotation: 0
        state: enabled
-   name: aircraft_map
    id: wasm_adsb_map_sink
    parameters:
        affinity: ''
        alias: ''
        basemap: light
        comment: Live aircraft state from the decoder; select a row or marker for details
        expire_seconds: '60'
        name: '"Aircraft near the recording site"'
        receiver_latitude: '0'
        receiver_longitude: '0'
        show_labels: 'True'
        show_receiver: 'False'
        stale_seconds: '15'
        trail_seconds: '300'
        units: aviation
        update_time: '0.25'
    states:
        coordinate: [1720, 400]
        rotation: 0
        state: enabled
-   name: bursts
    id: qtgui_time_sink_x
    parameters:
        affinity: ''
        alias: ''
        alpha1: '1'
        alpha10: '1'
        alpha2: '1'
        alpha3: '1'
        alpha4: '1'
        alpha5: '1'
        alpha6: '1'
        alpha7: '1'
        alpha8: '1'
        alpha9: '1'
        autoscale: 'False'
        axislabels: 'True'
        color1: blue
        color10: dark blue
        color2: red
        color3: green
        color4: black
        color5: cyan
        color6: magenta
        color7: yellow
        color8: dark red
        color9: dark green
        comment: ''
        ctrlpanel: 'False'
        entags: 'True'
        grid: 'True'
        label1: Burst power
        label10: Signal 10
        label2: Threshold
        label3: Signal 3
        label4: Signal 4
        label5: Signal 5
        label6: Signal 6
        label7: Signal 7
        label8: Signal 8
        label9: Signal 9
        legend: 'True'
        marker1: '-1'
        marker10: '-1'
        marker2: '-1'
        marker3: '-1'
        marker4: '-1'
        marker5: '-1'
        marker6: '-1'
        marker7: '-1'
        marker8: '-1'
        marker9: '-1'
        name: ADS-B bursts
        nconnections: '2'
        size: '1024'
        srate: samp_rate
        stemplot: 'False'
        style1: '1'
        style10: '1'
        style2: '1'
        style3: '1'
        style4: '1'
        style5: '1'
        style6: '1'
        style7: '1'
        style8: '1'
        style9: '1'
        tr_chan: '0'
        tr_delay: '0'
        tr_level: '0'
        tr_mode: qtgui.TRIG_MODE_FREE
        tr_slope: qtgui.TRIG_SLOPE_POS
        tr_tag: ''
        type: float
        update_time: '0.1'
        width1: '1'
        width10: '1'
        width2: '1'
        width3: '1'
        width4: '1'
        width5: '1'
        width6: '1'
        width7: '1'
        width8: '1'
        width9: '1'
        ylabel: Power
        ymax: '0.5'
        ymin: '0'
        yunit: ''
    states:
        coordinate: [1270, 360]
        rotation: 0
        state: enabled
-   name: decoded_planes
    id: blocks_message_debug
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        en_uvec: 'False'
        log_level: info
    states:
        coordinate: [1760, 20]
        rotation: 0
        state: enabled
-   name: decoder
    id: adsb_decoder
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        error_corr: '"Conservative"'
        maxoutbuf: '0'
        minoutbuf: '0'
        msg_filter: '"Extended Squitter Only"'
        print_level: '"Brief"'
    states:
        coordinate: [1470, 220]
        rotation: 0
        state: enabled
-   name: demod
    id: adsb_demod
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        fs: samp_rate
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [1050, 230]
        rotation: 0
        state: enabled
-   name: framer
    id: adsb_framer
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        fs: samp_rate
        maxoutbuf: '0'
        minoutbuf: '0'
        threshold: threshold
    states:
        coordinate: [690, 240]
        rotation: 0
        state: enabled
-   name: mag_squared
    id: blocks_complex_to_mag_squared
    parameters:
        affinity: ''
        alias: ''
        comment: The framer works on power, not complex samples
        maxoutbuf: '0'
        minoutbuf: '0'
        vlen: '1'
    states:
        coordinate: [370, 250]
        rotation: 0
        state: enabled
-   name: qtgui_waterfall_sink_x_0
    id: qtgui_waterfall_sink_x
    parameters:
        affinity: ''
        alias: ''
        alpha1: '1'
        alpha10: '1'
        alpha2: '1'
        alpha3: '1'
        alpha4: '1'
        alpha5: '1'
        alpha6: '1'
        alpha7: '1'
        alpha8: '1'
        alpha9: '1'
        average: '1.0'
        axislabels: 'True'
        bw: samp_rate
        color1: '0'
        color10: '0'
        color2: '0'
        color3: '0'
        color4: '0'
        color5: '0'
        color6: '0'
        color7: '0'
        color8: '0'
        color9: '0'
        comment: ''
        fc: '0'
        fftsize: '1024'
        freqhalf: 'True'
        grid: 'False'
        int_max: '10'
        int_min: '-140'
        label1: ''
        label10: ''
        label2: ''
        label3: ''
        label4: ''
        label5: ''
        label6: ''
        label7: ''
        label8: ''
        label9: ''
        legend: 'True'
        maxoutbuf: '0'
        minoutbuf: '0'
        name: Waterfall
        nconnections: '1'
        type: complex
        update_time: '0.1'
        wintype: window.WIN_RECTANGULAR
    states:
        coordinate: [400, 440]
        rotation: 0
        state: enabled
-   name: rtlsdr
    id: wasm_rtlsdr_source
    parameters:
        affinity: ''
        alias: ''
        bias_tee: 'False'
        bufflen: '262144'
        center_freq: '1090000000'
        comment: ''
        device: ''
        direct_samp: '0'
        freq_correction: '0'
        gain: gain
        gain_mode: 'False'
        maxoutbuf: '0'
        minoutbuf: '0'
        samp_rate: samp_rate
        type: complex
    states:
        coordinate: [10, 230]
        rotation: 0
        state: enabled
-   name: threshold_trace
    id: analog_const_source_x
    parameters:
        affinity: ''
        alias: ''
        comment: Plots the threshold beside the bursts
        const: threshold
        maxoutbuf: '0'
        minoutbuf: '0'
        type: float
    states:
        coordinate: [840, 400]
        rotation: 0
        state: enabled
-   name: wasm_gui_layout_0
    id: wasm_gui_layout
    parameters:
        affinity: ''
        alias: ''
        columns: '12'
        comment: ''
        layout: '{"aircraft_map":[0,1,7,7],"bursts":[7,1,5,3],"gain":[0,0,6,1],"qtgui_waterfall_sink_x_0":[7,4,5,4],"threshold":[6,0,6,1]}'
        row_height: '60'
    states:
        coordinate: [310, 10]
        rotation: 0
        state: enabled
connections:
-   src_blk_id: decoder
    src_port_id: decoded
    snk_blk_id: aircraft_map
    snk_port_id: decoded
-   src_blk_id: decoder
    src_port_id: decoded
    snk_blk_id: decoded_planes
    snk_port_id: print
- [demod, '0', bursts, '0']
-   src_blk_id: demod
    src_port_id: demodulated
    snk_blk_id: decoder
    snk_port_id: demodulated
- [framer, '0', demod, '0']
- [mag_squared, '0', framer, '0']
- [rtlsdr, '0', mag_squared, '0']
- [rtlsdr, '0', qtgui_waterfall_sink_x_0, '0']
- [threshold_trace, '0', bursts, '1']
metadata:
    file_format: 2
    grc_version: 3.11.0.0