Bluetooth EDR RF-PHY Transmitter Tests for Modulation Accuracy and Carrier Frequency Stability
This example shows you how to perform Bluetooth® enhanced data rate (EDR) radio frequency (RF) physical layer (PHY) transmitter tests specific to modulation accuracy and carrier frequency stability using the Bluetooth® Toolbox. The test measurements compute the initial frequency offset, root mean square (RMS) differential error vector magnitude (DEVM), and peak DEVM values. This example also verifies whether these test measurement values are within the limits specified by the Bluetooth RF-PHY Test Specifications [1].
Objectives of Bluetooth RF-PHY Tests
The Bluetooth RF-PHY Test Specifications [1] defined by the Bluetooth Special Interest Group (SIG) includes RF-PHY tests for the transmitter and receiver. The objectives of these RF-PHY tests are to:
Ensure interoperability between all of the Bluetooth devices.
Ensure a basic level of system performance for all of the Bluetooth products.
Each test case has a specific test procedure and an expected outcome, that the implementation under test (IUT) must achieve.
RF-PHY Transmitter Tests
The main goal of the transmitter test measurements is to ensure that the transmitter characteristics are within the limits specified by the Bluetooth RF-PHY Test Specifications [1]. This example includes transmitter tests relevant to EDR modulation accuracy and carrier frequency stability. This table shows various RF-PHY transmitter tests that this example performs.
RF-PHY Transmitter Test Procedure
This block diagram summarizes the test procedure for transmitter tests relevant to EDR modulation accuracy and carrier frequency stability of Bluetooth EDR waveforms.
This table shows the packet types and payload lengths required for different PHY modes:
Generate Bluetooth EDR test waveforms by using the
bluetoothTestWaveform
function.Add a carrier frequency offset and drift.
Add additive white Gaussian noise (AWGN).
Estimate the initial frequency offset using the basic rate (BR) portion of the waveform.
Compensate the EDR portion with the estimated initial frequency offset.
Perform square root raised cosine filtering using the filter whose coefficients are generated based on the Bluetooth RF-PHY Test Specifications [1].
Divide the EDR portion into blocks of length 50 microseconds each.
For each block, delay the compensated sequence by 1 microsecond and differentiate the delay with actual compensated sequence to get the error sequence.
Compute the RMS DEVM and peak DEVM based on the error sequence and compensated sequence.
Get the test verdict and display the results.
Configure Simulation Parameters
To specify PHY transmission mode, packet type, initial frequency offset, maximum frequency drift, and samples per symbol, set the phyMode
, packetType
, initialFreqOffset
, maxFreqDrift
, and sps
respectively.
phyMode ='EDR2M'; % PHY transmission mode packetType =
"2-DH1"; % EDR packet type initialFreqOffset =
40000; % Initial frequency offset in Hz maxFreqDrift =
0; % Maximum frequency drift in Hz, must be in the range [-10e3, 10e3] sps = 8; % Samples per symbol
Generate Test Parameters
Generate the test parameters for preceding configurations by using the helperEDRModulationTestConfig
helper function.
[edrTestParams,waveformConfig,filtCoeff] = helperEDRModulationTestConfig(phyMode,packetType,sps);
Create and configure a comm.PhaseFrequencyOffset
System object™.
frequencyDelay = comm.PhaseFrequencyOffset(SampleRate=edrTestParams.sampleRate);
Specify the noise figure in dB.
NF = 12;
Create and configure a comm.ThermalNoise
System object™.
thNoise = comm.ThermalNoise(NoiseMethod="Noise figure", ... SampleRate=edrTestParams.sampleRate, ... NoiseFigure=NF);
Simulate Transmitter Tests
Preallocate the space to store DEVM for each symbol, block RMS DEVM, estimated block frequency drifts and estimated initial frequency offset.
symDEVM = zeros(1,edrTestParams.requiredBlocks*edrTestParams.blockLength); [blockRMSDEVM,estimatedBlockFreqDrifts] = deal(zeros(1,edrTestParams.requiredBlocks)); estimatedInitFreqOff = zeros(1,edrTestParams.NumPackets);
Initialize the block count to 0
.
blockCount = 0;
Generate 200 blocks of data as specified by the Bluetooth RF-PHY Test Specifications [1].
for packetCount = 1:edrTestParams.NumPackets
Generate the Bluetooth EDR test waveform by using the bluetoothTestWaveform
function.
txWaveform = bluetoothTestWaveform(waveformConfig);
Specify the ideal transmitted EDR symbols from the generated waveform.
idealTxEDRWaveform = txWaveform(edrTestParams.startIndex*sps+1:end);
Perform matched filtering.
rxFilt = upfirdn(idealTxEDRWaveform,filtCoeff,1,sps);
Remove delay and normalize the filtered signal.
idealEDRSymbols = rxFilt(edrTestParams.span+1:end,1)/sqrt(sps);
Add frequency offset to the ideal EDR symbols.
driftRate = maxFreqDrift/length(txWaveform); % Drift rate freqDrift = driftRate*(0:1:(length(txWaveform)-1))'; % Frequency drift for the packet frequencyOffset = freqDrift + initialFreqOffset; % Frequency offset, includes initial frequency offset and drift transWaveformCFO = frequencyDelay(txWaveform(1:length(txWaveform)));
Pass waveform through thermal noise.
noisyWaveform = thNoise(transWaveformCFO);
Compute initial frequency offset by using the helperEstimateInitialFreqOffset
helper function.
estimatedInitFreqOff(packetCount) = helperEstimateInitialFreqOffset(noisyWaveform,sps);
Compensate initial frequency offset in the received waveform.
pfOffset = comm.PhaseFrequencyOffset(SampleRate=edrTestParams.sampleRate, ...
FrequencyOffset=-estimatedInitFreqOff(packetCount));
freqTimeSyncRcv = pfOffset(noisyWaveform);
Remove access code, packet header, and guard time from the packet.
rxEDRWaveform = freqTimeSyncRcv((edrTestParams.startIndex)*sps+1:end);
Perform matched filtering.
rxFilt = upfirdn(rxEDRWaveform,filtCoeff,1,sps); receivedEDRSymbols = rxFilt(edrTestParams.span+1:end,1)/sqrt(sps);
Compute RMS DEVM values, block RMS DEVM and sampling frequency in Hz by using the helperEDRModulationTestMeasurements
helper function.
[rmsDEVM,rmsDEVMSymbol,samplingFreq] = ...
helperEDRModulationTestMeasurements(receivedEDRSymbols,idealEDRSymbols,edrTestParams);
Accumulate measured values for 200 blocks.
blockCount = blockCount + edrTestParams.numDEVMBlocks; symDEVM(((packetCount-1)*edrTestParams.numDEVMBlocks*edrTestParams.blockLength)+1:(packetCount)*edrTestParams.numDEVMBlocks ... *edrTestParams.blockLength) = rmsDEVMSymbol(1:edrTestParams.numDEVMBlocks*edrTestParams.blockLength); blockRMSDEVM(((packetCount-1)*edrTestParams.numDEVMBlocks)+1:((packetCount)*edrTestParams.numDEVMBlocks)) = ... rmsDEVM(1:edrTestParams.numDEVMBlocks); estimatedBlockFreqDrifts(((packetCount-1)*edrTestParams.numDEVMBlocks)+1:((packetCount)*edrTestParams.numDEVMBlocks)) = ... samplingFreq(1:edrTestParams.numDEVMBlocks); end
The helperEDRModulationTestVerdict
helper function verifies whether the measurements are within the specified limits, and displays the verdict on the command window.
helperEDRModulationTestVerdict(phyMode,edrTestParams,estimatedInitFreqOff, ...
symDEVM,blockRMSDEVM,estimatedBlockFreqDrifts)
Modulation Accuracy Test Results:
Expected peak DEVM for all pi/4-DQPSK symbols is less than or equal to 0.35 Result: Pass Percentage of pi/4-DQPSK symbols with DEVM less than or equal to 0.3 is 100 Expected percentage of pi/4-DQPSK symbols with DEVM less than or equal to 0.3 is 99 % Result: Pass
Expected RMS DEVM for all pi/4-DQPSK blocks is less than or equal to 0.2 Result: Pass Carrier Frequency Stability Test Results: Expected initial frequency offset range: [-75 kHz, 75 kHz] Do estimated initial frequency offsets for all the packets fall under expected values? Result: Yes Expected sampling frequencies range: [-10 kHz, 10 kHz] Do estimated sampling frequencies for all the blocks fall under expected values? Result: Yes
Plot the constellation diagram
if strcmp(phyMode,"EDR2M") refSymbols = dpskmod(0:edrTestParams.M-1,edrTestParams.M,pi/4,"gray"); % Perform pi/4-DQPSK modulation else refSymbols = dpskmod(0:edrTestParams.M-1,edrTestParams.M,0,"gray"); % Perform 8-DPSK modulation end constDiag = comm.ConstellationDiagram(ReferenceConstellation=refSymbols, ... Title="Received EDR Constellation"); constDiag(receivedEDRSymbols); release(constDiag);
This example demonstrated the Bluetooth EDR transmitter test measurements specific to modulation accuracy and carrier frequency stability. The simulation results verify that these computed test measurement values are within the limits specified by the Bluetooth RF-PHY Test Specifications [1].
Appendix
The example uses these helpers:
helperEDRModulationTestConfig
— Configure Bluetooth test parametershelperEstimateInitialFreqOffset
— Estimate initial frequency offsethelperEDRModulationTestMeasurements
— Compute all DEVM measurements required for testhelperEDRModulationTestVerdict
— Validate test measurements and display result
Selected Bibliography
Bluetooth Special Interest Group (SIG). “Bluetooth RF-PHY Test Specification”, v1.2/2.0/2.0, EDR/2.1/2.1, EDR/3.0/3.0, HS (), RF.TS/3.0.H.1, Section 4.5. 2009. https://www.bluetooth.com
Bluetooth Special Interest Group (SIG). "Core System Package [BR/EDR Controller Volume]". Bluetooth Core Specification. Version 5.3, Volume 2. https://www.bluetooth.com