Main Content

Bluetooth LE Blocking, Intermodulation and Carrier-to-Interference Performance Tests

This example shows how to perform radio frequency (RF) physical layer (PHY) receiver tests specific to blocking, intermodulation and carrier-to-interference (C/I) according to Bluetooth® RF-PHY Test Specifications [3]. This example also verifies whether these test measurement values are within the limits specified by the Bluetooth RF-PHY Test Specifications [3].

Objectives of Bluetooth LE RF-PHY tests

The Bluetooth RF-PHY Test Specifications [3] defined by Bluetooth Special Interest Group (SIG) includes RF-PHY tests for both transmitter and receiver. The objectives of these RF-PHY tests are to:

  • Ensure interoperability between all Bluetooth devices

  • Ensure a basic level of system performance for all Bluetooth products.

Each test case has a specified test procedure and an expected outcome, which must be met by the implementation under test (IUT).

RF-PHY Receiver Tests

The Bluetooth receiver tests are designed to ensure that the IUT can receive data over a range of conditions where the transmitted signal has high power, and in presence of both in-band and out-of-band interference with a defined packet error rate (PER). This example covers three Bluetooth LE RF-PHY receiver tests for blocking, intermodulation and C/I performance as per the Bluetooth RF-PHY Test Specifications [3].

  • Blocking Performance: The blocking performance test verifies the receiver performance in the presence of out-of-band interfering signals i.e. operating outside the 2400 MHz - 2483.5 MHz band.

  • C/I Performance: The C/I performance test verifies the receiver performance in presence of adjacent and co-channel interfering signals.

  • Intermodulation Performance: The intermodulation performance test verifies the receiver performance in presence of unwanted signals nearby in frequency.

All the above RF-PHY tests are necessary because the wanted signal often will not be the only signal transmitting in the given frequency range.

The following block diagram summarizes the example flow.

Bluetooth LE Receiver Performance Tests block diagram.

  1. Generate a Bluetooth LE test waveform by using bleWaveformGenerator function.

  2. Obtain a passband signal by performing frequency upconversion on the generated test waveform.

  3. Scale the waveform to a desired input level.

  4. Add the interference signal(s) depending on the performance test.

  5. Add thermal noise based on receiver noise floor.

  6. At the receiver, perform frequency down conversion on the noisy signal.

  7. Demodulate, decode and perform CRC check using bluetoothTestWaveformValidate function.

  8. Measure the PER based on CRC check and then compare it with the reference PER.

Initialize the Simulation Parameters

Specify the test value as "Blocking", "C/I" or "Intermodulation".

testValue = "Intermodulation";

Specify the PHY transmission mode as per Bluetooth RF-PHY Test Specifications.

Test value

PHY transmission mode supported


"LE1M", or "LE2M"


"LE1M", "LE2M", "LE500K", or "LE125K"


"LE1M", or "LE2M"

phyMode = 'LE2M';

Specify number of samples per symbol, minimum of 40 samples per symbol as per the test specifications.

sps = 40;

Specify the payload length in the range of [37,255] bytes.

payloadLength = 240;

Specify the RF-PHY test configuration parameters by using the bluetoothRFPHYTestConfig object.

configObject = bluetoothRFPHYTestConfig(Test=testValue, ...
    Mode=phyMode, ...
    SamplesPerSymbol=sps, ...

if testValue=="Intermodulation"
    configObject.Interferer1SignalLevel = -50;

Select the frequency of operation for IUT based on the performance test and generic access profile (GAP) role(s) as shown in the table below.

Operating Frequency

Peripheral and Central Devices

Broadcaster and Observer Devices

(In MHz)

C/I | Blocking | Intermodulation

C/I | Blocking | Intermodulation


2406 | - | 2402

2402 | - | 2402


2440 | 2426 | 2440

2426 | 2426 | 2426


2476 | - | 2480

2480 | - | 2480

Specify the frequency of operation in Hz.

Fc = 2426*1e6;

Based on the PHY transmission mode, compute the sampling rate.

sampleRate = 1e6*(1+1*(phyMode=="LE2M"))*sps;

Compute the interpolation factor for up-conversion to cover Bluetooth LE RF frequency band (2400e6 to 2485e6).

interpFactor = ceil(2*2485e6/sampleRate);

Create a dsp.DigitalUpConverter (DSP System Toolbox) System object™.

upConvert = dsp.DigitalUpConverter(InterpolationFactor=interpFactor, ...
    SampleRate=sampleRate, ...
    Bandwidth=2e6, ...
    StopbandAttenuation=44, ...
    PassbandRipple=0.5, ...

Create a dsp.DigitalDownConverter (DSP System Toolbox) System object™.

downConvert = dsp.DigitalDownConverter(DecimationFactor=interpFactor, ...
    SampleRate=sampleRate*interpFactor, ...
    Bandwidth=2e6, ...
    StopbandAttenuation=44, ...
    PassbandRipple=0.5, ...

Specify the noise figure in dB.

NF = 12;

Create and configure comm.ThermalNoise System object™ to add thermal noise.

thermalNoise = comm.ThermalNoise(NoiseMethod="Noise figure", ...
    SampleRate=sampleRate, ...

Generate the scaling factors alpha, beta, gamma, as well as the interference frequencies for signal #1 and signal #2 by using helperBLETestParamGenerate helper function.

[alpha,beta,gamma,interferenceFreq1,interferenceFreq2] = helperBLETestParamGenerate(testValue,Fc,phyMode);

Specify the number of packets.

numPacket = 10;

Specify the maximum number of interference parameters used for simulation.

maxInterferenceParams = min(length(interferenceFreq1),numPacket);

Repeat all the interference parameters such that PER can be averaged over the entire range of interference frequencies for selected receiver performance test.

repFact = ceil(numPacket/maxInterferenceParams);    % Repetition factor
betaRep = repmat(beta,repFact,1);
gammaRep = repmat(gamma,repFact,1);
interferenceFreq1Rep = repmat(interferenceFreq1,repFact,1);
interferenceFreq2Rep = repmat(interferenceFreq2,repFact,1);

Initialize a variable for reusing the interference waveform #1.

countInterferer = rem(1:numPacket,maxInterferenceParams);
countInterferer(countInterferer==0) = maxInterferenceParams;

Initialize counter for packets in error.

packetsInError = 0;

Test Simulation

In this example, the three Bluetooth LE RF-PHY performance tests are simulated as follows:

  • For Blocking performance, there will be only one interference signal i.e. interference signal #2. So, the scaling factor (beta) for interference signal #1 is zero.

  • For C/I performance, there will be only one interference signal i.e. interference signal #1. So, the scaling factor (gamma) for interference signal #2 is zero.

  • For Intermodulation performance, there will be two interference signals.

Generate a Bluetooth LE test waveform by using bluetoothTestWaveform function and bluetoothTestWaveformConfig object. Set the payload type to 0 for a PRBS9 payload which is always a modulated carrier.

wantedTestWaveformConfig = bluetoothTestWaveformConfig(PayloadType=0, ...
    SamplesPerSymbol=sps, ...
    PayloadLength=payloadLength, ...

wantedWaveform = bluetoothTestWaveform(wantedTestWaveformConfig);

Apply frequency up-conversion to obtain a pass-band signal for the specified frequency of operation.

wantedWaveformUp = upConvert([wantedWaveform;zeros(8*sps,1)]);

Generate an interference signal #1 by using bluetoothTestWaveform function and bluetoothTestWaveformConfig object. Set the payload type to 3 for a PRBS15 payload which is always a modulated carrier.

interferenceTestWaveformConfig = bluetoothTestWaveformConfig(PayloadType=3, ...
    SamplesPerSymbol=sps, ...
    PayloadLength=payloadLength, ...

interferenceWaveform = bluetoothTestWaveform(interferenceTestWaveformConfig);

Store the interference waveform #1 by performing frequency up conversion, and ensure it is based on the buffer size. If the packet count exceeds the buffer size, reuse the stored interference waveform.

interferenceWaveform1Up = zeros(length(wantedWaveformUp),maxInterferenceParams);
if any(testValue==["C/I","Intermodulation"])
    for count=1:maxInterferenceParams
        upConvert.CenterFrequency = interferenceFreq1Rep(count);
        interferenceWaveform1Up(:,count) = upConvert([interferenceWaveform;zeros(8*sps,1)]);

Specify the time vector to generate a sinusoidal unmodulated interference signal, which will be designated as interference signal #2.

t = (0:(length(wantedWaveformUp)-1)).'/(interpFactor*sampleRate);

Simulate each Bluetooth LE test waveform by adding interference waveform. Add thermal noise to the signal. Downconvert the noisy waveform and validate the waveform by using the bluetoothTestWaveformValidate function.

for countPacket=1:numPacket
    % Generate an interference waveform #2 which is a sinusoidal
    % unmodulated signal. The sqrt(2) factor ensures that the power of the
    % sinusoidal signal is normalized
    interferenceWaveform2 = sqrt(2)*sin(2*pi*interferenceFreq2Rep(countPacket)*t);

    % Add the interference signals to the wanted signal
    rxWaveform = alpha*wantedWaveformUp + ...
    betaRep(countPacket)*interferenceWaveform1Up(:,countInterferer(countPacket)) + ...

    chanOut = thermalNoise(complex(rxWaveform));

    downConvOutWf = downConvert(real(chanOut));

Perform Bluetooth test waveform validation using bluetoothTestWaveformValidate function

    crcError = bluetoothTestWaveformValidate(downConvOutWf,configObject);

    % Increment the packet in error if CRC is failed
    packetsInError = packetsInError + crcError;

Determine the PER.

per = packetsInError/numPacket;

Spectrum Visualization

Create and configure a spectrum analyzer and show the spectrum of last transmitted wanted signal and interference signal(s) based on the receiver performance test. Setup the spectrum viewer.

spectrumScope = spectrumAnalyzer(SampleRate=interpFactor*sampleRate, ...
    SpectralAverages=10, ...
    YLimits=[-160 0], ...
    Title="Spectrum of Wanted and Interference Signals", ...
    SpectrumUnits="dBm", ...
    NumInputPorts=2, ...
    ChannelNames={"Wanted Signal","Interference Signal"}, ...
    ShowLegend=true, ...
    FrequencySpan="Start and stop frequencies", ...
    StartFrequency=2400e6, ...
    StopFrequency=2485e6, ...
    RBWSource="Property", ...
    RBW=1e5, ...

switch configObject.Test
    case "C/I"
    case "Blocking"
        spectrumScope.StartFrequency = 30e6;
    case "Intermodulation"
        spectrumScope.NumInputPorts = 3;
        spectrumScope.ChannelNames = {"Wanted Signal","Interference Signal #1","Interference Signal #2"};


This section generates the reference PER values for each PHY transmission mode based on the payload length as specified in section 6.4 of the Bluetooth RF-PHY Test Specifications [3].

berTable = [0.1 0.064 0.034 0.017]*0.01;
if(payloadLength <= 37)
    refBER = berTable(1);
elseif(payloadLength <= 63)
    refBER = berTable(2);
elseif(payloadLength <= 127)
    refBER = berTable(3);
    refBER = berTable(4);
accessAddLen = 4;   % Access address length in bytes
pduHeaderLen = 2;   % Header length in bytes
crcLengthBytes = 3; % CRC length in bytes
refPER = 1-(1-refBER)^((payloadLength+accessAddLen+pduHeaderLen+crcLengthBytes)*8);
fprintf("Measured PER and reference PER for payload length of %d bytes are %f, %f respectively.\n",configObject.PayloadLength,per,refPER);
Measured PER and reference PER for payload length of 240 bytes are 0.000000, 0.287282 respectively.
if per <= refPER
    fprintf("%s performance test passed.\n",configObject.Test);
    fprintf("%s performance test failed.\n",configObject.Test);
Intermodulation performance test passed.


This example uses the following helper functions:

Selected Bibliography

  1. Bluetooth Special Interest Group (SIG), Inc. “Bluetooth® Technology Website – The Official Website for the Bluetooth Wireless Technology. Get up to Date Specifications, News, and Development Info.” Accessed May 24, 2023.

  2. Bluetooth Special Interest Group (SIG), Inc. “Core Specification – Bluetooth® Technology Website.” Accessed May 24, 2023.

  3. Bluetooth RF-PHY Test Specification, Section 6.4.

See Also



Related Topics