Main Content


Decode Bluetooth LE PHY waveform



    [bits,accessAddr] = bleIdealReceiver(waveform) decodes the Bluetooth® low energy (LE) physical layer (PHY) waveform, waveform, generated by the bleWaveformGenerator function. The function returns the received bits, bits, and the access address information, accesAddr.


    [bits,accessAddr] = bleIdealReceiver(waveform,Name,Value) also specifies options using one or more name-value pair arguments. For example, 'Mode','LE2M' sets the PHY transmission mode of the desired Bluetooth LE waveform to 'LE2M'.


    [___,IQsamples] = bleIdealReceiver(___) additionally returns the in-phase and quadrature (IQ) samples, IQsamples, corresponding to constant tone extension (CTE).


    collapse all

    Create an input message column vector of length 1000 containing random binary-valued trasnmission bits.

    txBits = randi([0 1],1000,1);

    Generate a Bluetooth LE transmit waveform from the transmission bits by using the bleWaveformGenerator function.

    txWaveform = bleWaveformGenerator(txBits);

    Pass the transmit waveform through a noisy channel and obtain the received waveform.

    snr = 30;                          % In dB
    rxWaveform = awgn(txWaveform,snr);

    Recover data bits from the received Bluetooth LE waveform. Check for the number of bit errors in the recovered bits. The returned value indicates that the function successfully decodes the Bluetooth LE waveform.

    [rxBits,accessAddr] = bleIdealReceiver(rxWaveform);
    numErr = biterr(txBits,rxBits)
    numErr = 0

    Specify the values of PHY transmission mode, channel index and samples per symbol (sps).

    phyMode = 'LE125K';
    chanIndex = 2;
    sps = 4;

    Generate transmission bits containing random binary values.

    txBits = randi([0 1],100,1);

    Obtain the Bluetooth LE transmit waveform from the transmission bits and the specified name-value pairs using the bleWaveformGenerator function.

    txWaveform = bleWaveformGenerator(txBits,'Mode',phyMode,...

    Recover the data bits, and then compare them with the transmission bits. The recovered data bits match the transmission bits, indicating there are no errors in the decoded Bluetooth LE waveform.

    rxBits = bleIdealReceiver(txWaveform,'Mode',phyMode,...
    ans = logical

    Specify a connectionless advertising channel protocol data unit (PDU) for angle of arrival (AoA) CTE.

    pduHex = '02049B0327';
    pdu = de2bi(hex2dec(pduHex),40)';

    Generate and append cyclic redundancy check (CRC) to the PDU.

    crcGen = comm.CRCGenerator('z^24+z^10+z^9+z^6+z^4+z^3+z+1', ...
        'InitialConditions',de2bi(hex2dec('555551'),'left-msb',24), ...
    pduCRC = crcGen(pdu);

    Generate the Bluetooth LE transmit waveform.

    txWaveform = bleWaveformGenerator(pduCRC,'ChannelIndex',36, ...

    Recover the data bits by demodulating, dewhitening, and IQ sampling for a slot duration of 2 μs.

    [bits,accAddr,iqSamples] = bleIdealReceiver(txWaveform, ...

    Input Arguments

    collapse all

    Received time-domain signal, specified as a complex-valued signal with size Ns-by-1, where Ns represents the number of received samples. The values of Ns depend on the 'Mode' and 'SamplesPerSymbol' input arguments, according to the constraints specified in this table.

    Value of 'Mode' Value of NsMultiple of









    Data Types: double | single

    Name-Value Arguments

    Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

    Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

    Example: bleIdealReceiver(waveform,'Mode','LE2M','ChannelIndex',36)

    PHY transmission mode, specified as the comma-separated pair consisting of 'Mode' and 'LE1M', 'LE2M', 'LE500K', or 'LE125K'. This value indicates the type of PHY that the function uses to decode the received Bluetooth LE waveform.

    Data Types: char | string

    Channel index, specified as the comma-separated pair consisting of 'ChannelIndex' and an integer in the range [0, 39]. For data channels, specify this value in the range [0, 36]. This value is used by the data-dewhitening block.

    Data Types: double

    Samples per symbol, specified as the comma-separated pair consisting of 'SamplesPerSymbol' and a positive integer. The object uses this value for Gaussian frequency shift keying (GFSK) modulation.

    Data Types: double

    Type of direction finding packet, specified as the comma-separated pair consisting of 'DFPacketType' and 'ConnectionlessCTE', 'ConnectionCTE', or 'Disabled'.

    Data Types: char | string

    Switch and sample slot duration, specified as the comma-separated pair consisting of 'SlotDuration' and 1 or 2. Specify this value in microseconds.

    Data Types: double

    Data whiten status, specified as 'On' or 'Off'. Set this value to 'On' for the function to perform dewhitening on the demodulated bits (for 'LE1M' and 'LE2M' PHY) and the decoded bits (for 'LE500K' and 'LE125K' PHY).

    Data Types: char | string

    Output Arguments

    collapse all

    Payload bits, returned as a column vector of maximum length 260 bytes. This output represents the recovered information bits.

    Data Types: int8

    Access address information, returned as a 32-bit column vector. The higher layers use this output to validate a packet.

    Data Types: int8

    IQ samples, specified as a complex-valued column vector. This argument corresponds to the 8 μs value of the reference period and slot duration. If you set the value of DFPacketType argument to 'ConnectionlessCTE' or 'ConnectionCTE', then the function returns this output.

    Data Types: double


    [1] Bluetooth Technology Website. “Bluetooth Technology Website | The Official Website of Bluetooth Technology.” Accessed November 22, 2021.

    [2] Bluetooth Special Interest Group (SIG). "Bluetooth Core Specification." Version 5.3.

    Extended Capabilities

    C/C++ Code Generation
    Generate C and C++ code using MATLAB® Coder™.

    Version History

    Introduced in R2019b