Main Content

Triggered Capture Using Preamble Detection

This example shows how to use a software-defined-radio (SDR) to capture data from the air using preamble detection. The example also shows how to use the transmit capabilities of the same radio to loop back a test waveform.

Set Up Radio

Call the radioConfigurations function. The function returns all available radio setup configurations that you saved using the Radio Setup wizard.

savedRadioConfigurations = radioConfigurations;

To update the dropdown menu with your saved radio setup configuration names, click Update. Then select the radio to use with this example.

savedRadioConfigurationNames = [string({savedRadioConfigurations.Name})];
radio = savedRadioConfigurationNames(1) ;

Generate Transmission Waveform

Create a transmission waveform containing a Zadoff-Chu preamble sequence. To enable straightforward demonstration of the preamble detection workflow, concatenate zeros before and after the preamble.

Generate a preamble sequence of length 137 by using 38th root of the Zadoff-Chu sequence and normalize. Concatenate with zeros.

zcseq = zadoffChuSeq(38,137);
preamble = zcseq/norm(zcseq,2); 
prePadLen = 2501;
postPadLen = 2500;
headSignal = complex(zeros(prePadLen,1),zeros(prePadLen,1));
rearSignal = complex(zeros(postPadLen,1),zeros(postPadLen,1));
inputSignal = [headSignal; zcseq*0.75; rearSignal];

Plot transmission waveform.

figure();
subplot(2,1,1); plot(real(inputSignal));
subtitle("Real Part");
xlabel("Samples"); 
ylabel("Amplitude");
title("Waveform with Preamble");
subplot(2,1,2); 
plot(imag(inputSignal),Color='r');    
subtitle("Imaginary Part"); 
xlabel("Samples"); 
ylabel("Amplitude");

Configure Preamble Detector

Create a preamble detector object with the specified radio. Because the object requires exclusive access to radio hardware resources, before running this example for the first time, clear any other object associated with the specified radio. To speed up the execution time of the example in subsequent runs, reuse your new workspace object.

if ~exist("pd","var")
    pd = preambleDetector(radio);
end

Set the RF properties of the preamble detector. Set the RadioGain property according to the local wireless channel.

pd.SampleRate = 30720000;
pd.CenterFrequency = 2450000000;
pd.RadioGain = 30; % Increase if signal levels are low.

To update the dropdown menu with the antennas available for capture on your radio, call the hCaptureAntennas helper function. Then select the antenna to use with this example.

captureAntennaSelection = hCaptureAntennas(radio);
pd.Antennas = captureAntennaSelection(2);

Configure the preamble sequence for preamble detection.

pd.Preamble = preamble;

Set the capture data type to the data type of the generated transmission waveform.

pd.CaptureDataType = "double";

Configure Transmission Variables

Set the transmit gain and transmit antenna values. Set the transmit gain variable according to the local wireless channel.

txGain = 30; % Increase if signal levels are low.

To update the dropdown menu with the antennas available for transmit on your radio, call the hTransmitAntennas helper function. Then select the antenna to use with this example.

transmitAntennaSelection = hTransmitAntennas(radio);
txAntenna = transmitAntennaSelection(2); 

Detect Preamble Using Fixed Threshold and Capture Data

Data capture is triggered when the correlator output is greater than the fixed threshold. By setting the fixed threshold to 0, you can analyze the behavior of the preamble detector and understand how to set the fixed threshold value for successful detection.

Set the preamble detector to use fixed threshold. To set the threshold method, stop any ongoing transmission.

stopTransmission(pd);
pd.ThresholdMethod = "fixed";

Set the fixed threshold initially to 0.

pd.FixedThreshold = 0;

Transmit the test waveform.

transmit(pd,inputSignal,"continuous",TransmitGain=txGain, ...
    TransmitCenterFrequency=pd.CenterFrequency,TransmitAntennas=txAntenna);

Use the plotThreshold function to analyze the behavior of the detector by plotting 10,000 samples. Because the fixed threshold value is 0, all samples from the correlator output are possible trigger points. Check the correlator output values at the peak trigger points. Because the sampling phase determines the quality of the correlator peak, run the plotThreshold function multiple times to see how the trigger points change.

plotThreshold(pd,10e3);

Choose a threshold value that is below any of the trigger point values. Plot the threshold information again and adjust the fixed threshold until the trigger points appear only on the correlator output peak. Run the plotThreshold function multiple times to see any sampling phase effects.

pd.FixedThreshold = 0.1;
plotThreshold(pd,10e3);

Once the threshold is set, capture data.

[data, ~, ~, status] = capture(pd,10e3,seconds(1));

Use the hPlotCapturedData helper function to plot the captured signal.

hPlotCapturedData(data,status);

Detect Preamble Using Adaptive Threshold and Capture Data

As an alternative to the fixed threshold, data capture can be triggered when the correlator output is greater than the adaptive threshold, which dynamically varies with the input signal power. By setting the adaptive threshold gain and offset to 0, you can analyze the behavior of the preamble detector and understand how to configure the adaptive threshold for successful detection.

Set the preamble detector to use adaptive threshold. To set the threshold method, stop any ongoing transmission.

stopTransmission(pd);
pd.ThresholdMethod = 'adaptive';

Set the adaptive threshold gain and offset initially to 0.

pd.AdaptiveThresholdGain = 0;
pd.AdaptiveThresholdOffset = 0; 

Transmit the test waveform.

transmit(pd,inputSignal,"continuous",TransmitGain=txGain, ...
    TransmitCenterFrequency=pd.CenterFrequency,TransmitAntennas=txAntenna);

Use the plotThreshold function to analyze the behavior of the detector by plotting 10,000 samples. Check the correlator output values at the peak trigger points and run the plotThreshold function multiple times if necessary.

plotThreshold(pd,10e3);

To remove all the trigger points from the bottom of the plot, set the adaptive threshold offset to a value that is above the noise floor. Adjust the adaptive threshold gain and plot the threshold information repeatedly until the correlator output is greater than the adaptive threshold.

pd.AdaptiveThresholdOffset = 0.05; 
pd.AdaptiveThresholdGain = 0.25;
plotThreshold(pd,10e3);

Once the threshold is configured, capture data and plot the captured signal.

[data, ~, ~, status] = capture(pd,10e3,seconds(1));
hPlotCapturedData(data,status);

Detect Multiple Consecutive Signals

You can perform multiple consecutive preamble detections by setting the NumCaptures property to a value greater than 1. Set the NumCaptures property to 3 to capture three consecutive signals using the same adaptive thresholding criteria. Then, use the hPlotCapturedData helper function to plot the captured signals.

[data, timestamps, ~, status] = capture(pd,10e3,seconds(3),NumCaptures=3);
hPlotCapturedData(data, status);

Display the time stamp for each capture. These are returned in datetime format to nanosecond precision.

disp(timestamps);
   01-Nov-2023 11:51:53.340518125
   01-Nov-2023 11:51:53.340852630
   01-Nov-2023 11:51:53.341187135

Set Trigger Offset to Include Preamble in Captured Data

To capture the preamble sequence, set the trigger offset to the length of the preamble. To set the trigger offset, stop any ongoing transmission.

stopTransmission(pd);
pd.TriggerOffset = -137;

Transmit the test waveform, capture data, and plot.

transmit(pd, inputSignal,"continuous",TransmitGain=txGain,...
    TransmitCenterFrequency=pd.CenterFrequency,TransmitAntennas=txAntenna);
% Detect and capture 10,000 samples, with a 1 second timeout
[data, ~, ~, status] = capture(pd,10e3,seconds(1));
hPlotCapturedData(data,status);

End Transmission

To end the continuous transmission, call the stopTransmission function on the preamble detector object.

stopTransmission(pd);

See Also

Functions

Objects

Related Topics