GNU Radio World

WiFi 802.11a Receiver

Decodes IEEE 802.11a frames from a 20 MS/s recording and prints each MAC header.

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
VariableGNU Radio3
DelayGNU Radio2
Moving AverageGNU Radio2
Complex ConjugateGNU Radio1
Complex to MagGNU Radio1
Complex to Mag^2GNU Radio1
DivideGNU Radio1
FFTGNU Radio1
GR World RecordingGNU Radio1
MultiplyGNU Radio1
NoteGNU Radio1
QT GUI Waterfall SinkGNU Radio1
Stream to VectorGNU Radio1
ThrottleGNU Radio1
WiFi Decode MACgr-ieee802_111
WiFi Frame Equalizergr-ieee802_111
WiFi Parse MACgr-ieee802_111
WiFi Sync Longgr-ieee802_111
WiFi Sync Shortgr-ieee802_111

Notes in this flowgraph

Flowgraph source

wifi/wifi_receiver.grc
options:
    parameters:
        author: Marc
        copyright: ''
        description: Decodes IEEE 802.11a frames from a 20 MS/s recording and prints each MAC header.
        generate_options: qt_gui
        id: WiFi_802_11a_Receiver
        title: WiFi 802.11a Receiver
    states:
        coordinate: [10, 10]
        rotation: 0
        state: enabled
blocks:
-   name: samp_rate
    id: variable
    parameters:
        comment: ''
        value: '20000000'
    states:
        coordinate: [600, 10]
        rotation: 0
        state: enabled
-   name: sync_length
    id: variable
    parameters:
        comment: ''
        value: '320'
    states:
        coordinate: [770, 10]
        rotation: 0
        state: enabled
-   name: window_size
    id: variable
    parameters:
        comment: ''
        value: '48'
    states:
        coordinate: [950, 10]
        rotation: 0
        state: enabled
-   name: average_corr
    id: blocks_moving_average_xx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        length: window_size
        max_iter: '4000'
        maxoutbuf: '0'
        minoutbuf: '0'
        scale: '1'
        type: complex
        vlen: '1'
    states:
        coordinate: [80, 550]
        rotation: 0
        state: enabled
-   name: average_power
    id: blocks_moving_average_xx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        length: window_size + 16
        max_iter: '4000'
        maxoutbuf: '0'
        minoutbuf: '0'
        scale: '1'
        type: float
        vlen: '1'
    states:
        coordinate: [390, 670]
        rotation: 0
        state: enabled
-   name: conjugate
    id: blocks_conjugate_cc
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [1040, 260]
        rotation: 0
        state: enabled
-   name: corr_mag
    id: blocks_complex_to_mag
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [390, 570]
        rotation: 0
        state: enabled
-   name: correlate
    id: blocks_multiply_xx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
        num_inputs: '2'
        type: complex
        vlen: '1'
    states:
        coordinate: [1290, 260]
        rotation: 0
        state: enabled
-   name: decode_mac
    id: ieee802_11_decode_mac
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        debug: 'False'
        log: 'False'
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [1430, 850]
        rotation: 0
        state: enabled
-   name: delay_ltf
    id: blocks_delay
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        delay: sync_length
        maxoutbuf: '0'
        minoutbuf: '0'
        type: complex
    states:
        coordinate: [1230, 570]
        rotation: 0
        state: enabled
-   name: delay_stf
    id: blocks_delay
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        delay: '16'
        maxoutbuf: '0'
        minoutbuf: '0'
        type: complex
    states:
        coordinate: [700, 260]
        rotation: 0
        state: enabled
-   name: equalizer
    id: ieee802_11_frame_equalizer
    parameters:
        affinity: ''
        algo: ieee802_11.LS
        alias: ''
        bw: samp_rate
        comment: ''
        debug: 'False'
        freq: '5320000000'
        log: 'False'
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [1060, 830]
        rotation: 0
        state: enabled
-   name: fft
    id: fft_vxx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        fft_size: '64'
        forward: 'True'
        maxoutbuf: '0'
        minoutbuf: '0'
        nthreads: '1'
        shift: 'True'
        type: complex
        window: '[1.0] * 64'
    states:
        coordinate: [710, 830]
        rotation: 0
        state: enabled
-   name: intro
    id: note
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        note: A 20 MS/s recording of 802.11a frames at BPSK 1/2 (6 Mbit/s), about 15 dB SNR. Short training sequence detection, long training sequence alignment, a 64-point FFT and the frame equalizer recover the OFDM symbols; WiFi Decode MAC runs the Viterbi decoder and checks the CRC, and WiFi Parse MAC prints each header to the console below.
    states:
        coordinate: [1130, 10]
        rotation: 0
        state: enabled
-   name: normalize
    id: blocks_divide_xx
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
        num_inputs: '2'
        type: float
        vlen: '1'
    states:
        coordinate: [700, 570]
        rotation: 0
        state: enabled
-   name: parse_mac
    id: ieee802_11_parse_mac
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        debug: 'True'
        log: 'False'
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [80, 1010]
        rotation: 0
        state: enabled
-   name: power
    id: blocks_complex_to_mag_squared
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
    states:
        coordinate: [80, 690]
        rotation: 0
        state: enabled
-   name: recording
    id: wasm_gr_world_recording
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        length: '0'
        maxoutbuf: '0'
        minoutbuf: '0'
        offset: '0'
        recording: wifi_80211a_bpsk12_20M
        repeat: 'True'
        type: complex
    states:
        coordinate: [10, 230]
        rotation: 0
        state: enabled
-   name: sync_long
    id: ieee802_11_sync_long
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        debug: 'False'
        log: 'False'
        maxoutbuf: '0'
        minoutbuf: '0'
        sync_length: sync_length
    states:
        coordinate: [140, 850]
        rotation: 0
        state: enabled
-   name: sync_short
    id: ieee802_11_sync_short
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        debug: 'False'
        log: 'False'
        maxoutbuf: '0'
        min_plateau: '2'
        minoutbuf: '0'
        threshold: '0.56'
    states:
        coordinate: [950, 540]
        rotation: 0
        state: enabled
-   name: throttle
    id: blocks_throttle2
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        ignoretag: 'True'
        limit: time
        maximum: '0.1'
        maxoutbuf: '0'
        minoutbuf: '0'
        samples_per_second: samp_rate
        type: complex
        vlen: '1'
    states:
        coordinate: [370, 240]
        rotation: 0
        state: enabled
-   name: to_symbols
    id: blocks_stream_to_vector
    parameters:
        affinity: ''
        alias: ''
        comment: ''
        maxoutbuf: '0'
        minoutbuf: '0'
        num_items: '64'
        type: complex
        vlen: '1'
    states:
        coordinate: [420, 860]
        rotation: 0
        state: enabled
-   name: waterfall
    id: qtgui_waterfall_sink_x
    parameters:
        affinity: ''
        alias: ''
        alpha1: '1'
        axislabels: 'True'
        color1: '0'
        comment: ''
        fc: '0'
        fftsize: '1024'
        grid: 'False'
        int_max: '40'
        int_min: '-40'
        label1: ''
        legend: 'True'
        maxoutbuf: '0'
        minoutbuf: '0'
        name: '"802.11a bursts"'
        samp_rate: samp_rate
        update_time: '0.1'
    states:
        coordinate: [700, 360]
        rotation: 0
        state: enabled
connections:
- [average_corr, '0', corr_mag, '0']
- [average_corr, '0', sync_short, '1']
- [average_power, '0', normalize, '1']
- [conjugate, '0', correlate, '1']
- [corr_mag, '0', normalize, '0']
- [correlate, '0', average_corr, '0']
-   src_blk_id: decode_mac
    src_port_id: out
    snk_blk_id: parse_mac
    snk_port_id: in
- [delay_ltf, '0', sync_long, '1']
- [delay_stf, '0', conjugate, '0']
- [delay_stf, '0', sync_short, '0']
- [equalizer, '0', decode_mac, '0']
- [fft, '0', equalizer, '0']
- [normalize, '0', sync_short, '2']
- [power, '0', average_power, '0']
- [recording, '0', throttle, '0']
- [sync_long, '0', to_symbols, '0']
- [sync_short, '0', delay_ltf, '0']
- [sync_short, '0', sync_long, '0']
- [throttle, '0', correlate, '0']
- [throttle, '0', delay_stf, '0']
- [throttle, '0', power, '0']
- [throttle, '0', waterfall, '0']
- [to_symbols, '0', fft, '0']
metadata:
    file_format: 2
    grc_version: 3.11.0.0