Main Content

comm.SDRuReceiver

Receive data from USRP device

Description

The SDRuReceiver System object™ receives data from a Universal Software Radio Peripheral (USRP™) hardware device, enabling simulation and development for various software-defined radio applications. The object enables communication with a USRP board on the same Ethernet subnetwork or a USRP board via a USB connection. You can write a MATLAB® application that uses the System object, or you can generate code for the System object without connecting to a USRP radio.

This object receives signal and control data from a USRP board using the Universal Hardware Driver (UHD™) from Ettus Research™. The System object receives data from a USRP board and outputs a column vector or matrix signal of a fixed number of rows.

To receive data from a USRP device:

  1. Create the comm.SDRuReceiver object and set its properties.

  2. Call the object as if it were a function.

To learn more about how System objects work, see What Are System Objects?.

Creation

Description

example

tx = comm.SDRuReceiver creates a default SDRu receiver System object.

example

tx = comm.SDRuReceiver(address) sets the IPAddress property to address of the connected USRP device.

example

tx = comm.SDRuReceiver(___,Name,Value) sets Properties using one or more name-value pairs in addition to any input argument combination from previous syntaxes. Enclose each property name in quotes. For example, 'CenterFrequency',5e6 specifies the center frequency as 5 MHz.

Properties

expand all

Unless otherwise indicated, properties are nontunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.

If a property is tunable, you can change its value at any time.

For more information on changing property values, see System Design in MATLAB Using System Objects.

Model number of the radio, specified as one of these values.

  • 'N200/N210/USRP2'

  • 'N300'

  • 'N310'

  • 'N320/N321'

  • 'B200'

  • 'B210'

  • 'X300'

  • 'X310'

Data Types: char | string

IP address of the USRP device, specified as a dotted-quad character vector or dotted-quad string scalar. When you specify more than one IP address, you must separate each address by commas or spaces.

This value must match the physical IP address of the radio hardware assigned during hardware setup. For more information, see Guided USRP Radio Support Package Hardware Setup. If you configure the radio hardware with an IP address other than the default, update this property accordingly.

To find the logical network location of all connected USRP radios, use the findsdru function.

Example: '192.168.10.2, 192.168.10.5' or '192.168.10.2 192.168.10.5' specifies IP addresses for two devices.

Dependencies

To enable this property, set Platform to 'N200/N210/USRP2', 'N300', 'N310', 'N320/N321', 'X300', or 'X310'.

Data Types: char | string

Serial number of the radio hardware, specified as a character vector or string scalar.

This property must match the serial number of the radio hardware assigned during hardware setup. For more information, see Guided USRP Radio Support Package Hardware Setup. If you configure the radio hardware with a serial number other than the default, update this property accordingly.

Dependencies

To enable this property, set Platform to 'B200' or 'B210'.

Data Types: char | string

Option to enable the TwinRX daughterboard, specified as a numeric or logical 0 (false) or 1 (true). To enable the TwinRX daughterboard on an X-series radio, set IsTwinRXDaughterboard to 1 (true).

When you enable the TwinRX daughterboard, you can use the EnableTwinRXPhaseSynchronization property to provide phase synchronization between channels of the TwinRX daughterboard.

Dependencies

To enable this property, set the Platform property to 'X300' or 'X310'.

Data Types: logical | numeric

Flag to enable phase synchronization between channels of the TwinRX daughterboard, specified as a numeric or logical 0 (false) or 1 (true). When you set this property to 1 (true), TwinRX daughterboard provides phase synchronization between all the channels. In this case, the value of the CenterFrequency property must be same for all the channels.

Note

The local oscillator (LO) source present on the channel 1 is the master source to drive other LOs of the TwinRx daughterboard channels.

To share LOs between two TwinRx daughterboards, attach the four MMCX RA male cables on one daughterboard to the MMCX RA male cables on the other daughterboard by crisscrossing the cables between the two daughterboards. Make these cable connections, as also shown in the figure.

  • J1 to J2

  • J2 to J1

  • J3 to J4

  • J4 to J3

Dependencies

To enable this property, set the Platform property to 'X300' or 'X310' and IsTwinRXDaughterboard property to 1 (true).

Data Types: logical | numeric

Channel mapping for the radio or bundled radios, specified as a nonnegative scalar or a row vector of nonnegative values. This table shows the valid values for various radio platforms.

Platform Property Value ChannelMapping Property Value

'N200/N210/USRP2'

1-by-N row vector, where N is the number of IP addresses included in the IPAddress property

'N300'

1, 2, or [1 2]

'N310'

1-, 2-, 3-, or 4-element row vector of channel numbers from the set {1, 2, 3, 4}

'N320/N321'

1, 2, or [1 2]

'B200'

1

'B210'

1, 2, or [1 2]

'X300' or 'X310' when the IsTwinRXDaughterboard property is 0 (false)

  • when IPAddress includes one IP address, specify this property as 1, 2, or [1 2]

  • When IPAddress includes N IP addresses, specify the property as 1-by-2N row vector. N is the number of IP addresses included in IPAddress.

'X300' or 'X310' when two TwinRX daughterboards are connected and the IsTwinRXDaughterboard property is 1 (true)

When the EnableTwinRXPhaseSynchronization property is 0 (false), specify this property as one of these values.

  • [N M], where N and M are distinct integers from 1 to 4 — Channels N and M are in use.

  • [N M P], where N, M, and P are distinct integers from 1 to 4 — Channels N, M, and P are in use.

  • [1 2 3 4]

When the EnableTwinRXPhaseSynchronization property is 1 (true), specify this property as 1, [1 2], [1 2 3], or [1 2 3 4].

When IPAddress includes multiple IP addresses, the channels defined by ChannelMapping are ordered first by the order in which the IP addresses appear in the list and then by the channel order within the same radio.

Example: If Platform is 'X300' and IPAddress is '192.168.20.2, 192.168.10.3', then ChannelMapping must be [1 2 3 4]. Channels 1, 2, 3, and 4 of the bundled radio refer to channels 1 and 2 of the radio with IP address 192.168.20.2 and channels 1 and 2 of the radio with IP address 192.168.10.3.

Data Types: double

Center frequency, specified as a nonnegative scalar or a row vector of nonnegative values. Units are in Hz. The valid range of values for this property depends on the RF daughter card of the USRP device.

To change the center frequency, specify the value according to these conditions.

  • For a single channel (SISO), specify the value for the center frequency as a nonnegative scalar.

  • For multiple channels (MIMO) that use the same center frequency, specify the center frequency as a nonnegative scalar. The center frequency is set by scalar expansion.

  • For multiple channels (MIMO) that use different center frequencies, specify the values in a row vector (for example, [70e6 100e6]). The ith element of the vector is applied to the ith channel specified by ChannelMapping.

    Note

    • The center frequency for B210 with MIMO must be a scalar. You cannot specify the frequencies as a vector.

    • The channels corresponding to the same RF daughterboard of N310 must have same center frequency value as each other.

For any of these conditions, the IsTwinRXDaughterboard property is set to 0 (false).

When the IsTwinRXDaughterboard property is 1 (true), specify the center frequency according to these conditions.

  • To tune all channels to the same frequency, specify the center frequency as a scalar or row vector of the same values and the EnableTwinRXPhaseSynchronization property as 1 (true).

  • To tune channels to different frequencies, specify the center frequency as a row vector. Each value in the row vector specifies the frequency of the corresponding channel. Set EnableTwinRXPhaseSynchronization property to 0 (false).

Note

When IsTwinRXDaughterboard and EnableTwinRXPhaseSynchronization are both set to 1 (true), the LO source present on channel 1 is the master source to drive other LOs of the TwinRX daughterboard channels. In this case, the CenterFrequency property value must be the same for all channels of the TwinRX daughterboard.

For more information, see EnableTwinRXPhaseSynchronization.

Tunable: Yes

Data Types: double

LO offset frequency, specified as a scalar or row vector. Units are in Hz. The valid range of this property depends on the RF daughterboard of the USRP device.

The LO offset does not affect the received center frequency. However, it does affect the intermediate center frequency in the USRP hardware, as shown in this diagram.

In this diagram:

  • f RF is the received RF frequency.

  • f center is the center frequency specified by the System object.

  • f LO offset is the LO offset frequency.

  • Ideally, fRF - fcenter = 0.

To move the center frequency away from interference or harmonics generated by the USRP hardware, use this property.

To change the LO offset, specify the value according to these conditions.

  • For a single channel (SISO), specify the LO offset as a scalar.

  • For multiple channels (MIMO), the LO offset must be zero. This restriction is due to a UHD limitation. In this case, you can specify the LO offset as scalar (0) or as a vector ([0 0]).

Tunable: Yes

Data Types: double

Overall gain for the USRP hardware receiver data path, including analog and digital components, specified as a scalar or row vector in dB. The valid range of this property depends on the RF daughterboard of the USRP device.

To change the gain, specify the value according to these conditions.

  • For a single channel (SISO), specify the gain as a scalar.

  • For multiple channels (MIMO) that use the same gain value, specify the gain as a scalar. The gain is set by scalar expansion.

  • For multiple channels (MIMO) that use different gains, specify the values in a row vector (for example, [32 30]). The ith element of the vector is applied to the ith channel specified by ChannelMapping.

Tunable: Yes

Data Types: double

Parts per second (PPS) signal source, specified as one of these values.

  • 'Internal' — Use the internal PPS signal of the USRP radio.

  • 'External' — Use the PPS signal from an external signal generator.

To synchronize the time for all channels of the bundled radios, provide a common external PPS signal to all of the bundled radios and set this property to 'External'.

Data Types: char

Clock source, specified as one of these values.

  • Internal — Use the internal clock signal of the USRP radio.

  • External — Use the 10-MHz clock signal from an external clock generator.

For B-series radios, the external clock port is labeled 10 MHz. For N3xx, N2xx, USRP2™, and X-series radios, the external clock port is labeled REF IN.

To synchronize the frequency for all channels of the bundled radios, provide a common external 10-MHz clock signal to all of the bundled radios and set this property to 'External'.

Data Types: char

Master clock rate, specified as a positive scalar in Hz. The master clock rate is the A/D and D/A clock rate. The valid range of values for this property depends on the connected radio platform.

Platform Property ValueMasterClockRate Property Value (in Hz)

'N200/N210/USRP2'

100e6 (read-only)

'N300' or 'N310'

122.88e6, 125e6(default), or 153.6e6

'N320/N321'

200e6(default), 245.76e6, or 250e6

'B200' or 'B210'

Value in the range from 5e6 to 56e6. When using B210 with multiple channels, the clock rate must be less than or equal to 30.72e6. This restriction is a hardware limitation for the B210 radios when you use two-channel operations.

The default value is 32e6.

'X300' or 'X310'

184.32e6 or 200e6(default)

Dependencies

To enable this property, set Platform to 'N300', 'N310', 'N320/N321', 'B200', 'B210', 'X300', or 'X310'.

Data Types: double

Decimation factor for the SDRu receiver, specified as an integer from 1 to 1024 with restrictions, based on the radio you use.

DecimationFactor Property ValueB-SeriesN2xx-SeriesN3xx-SeriesX-Series

1

Valid

Not valid

Valid

Not valid when connected with TwinRX daughterboard

2

Valid

Acceptable when you use only the int8 transport data type

Valid

Valid

3

Valid

Not valid

Valid

Valid

Odd number from 4 to 128

Valid

Valid

Not valid

Valid

Even number from 4 to 128

Valid

Valid

Valid

Valid

Even number from 128 to 256

Valid

Valid

Valid

Valid

Multiple of 4 from 256 to 512

Valid

Valid

Valid

Valid

Multiple of 8 from 512 to 1024

Not valid

Not valid

Valid

Valid

The radio uses the decimation factor when it downconverts the intermediate frequency (IF) signal to a complex baseband signal.

Data Types: double

Transport data type, specified as:

  • 'int16' — Uses 16-bit transport to achieve higher precision.

  • 'int8' — Uses 8-bit transport to achieve approximately two times faster transport data rate. The quantization step is 256 times larger than 16-bit transport.

The default transport data rate data type assigns the first 16 bits to the in-phase component and latter 16 bits to the quadrature component, resulting in 32 bits for each complex sample of transport data.

Data Types: char | string

Data type of the output signal, specified as one of these values.

  • 'Same as transport data type' — The output data type is the same as the transport data type: either int8 or int16.

    • When the transport data type is int8, the output values are raw 8-bit I and Q samples from the board in the range [–128, 127].

    • When the transport data type is 'int16', the output values are raw 16-bit I and Q samples from the board in the range [–32,768, 32,767].

  • 'single' — Single-precision floating point values scaled to the range of [–1, 1].

  • 'double' — Double-precision floating point values scaled to the range of [–1, 1].

Data Types: char | string
Complex Number Support: Yes

Number of samples per frame of the output signal, specified as a positive integer. This value optimally utilizes the underlying Ethernet packets, which have a size of 1500 8-bit bytes.

Data Types: double

Option to enable burst mode, specified as a numeric or logical value of 1 (true) or 0 (false). To produce a set of contiguous frames without an overrun or underrun to the radio, set this property to 1 (true). Enabling burst mode helps you simulate models that cannot run in real time.

When burst mode is enabled, specify the desired amount of contiguous data by using the NumFramesInBurst property. For more information, see Detect Underruns and Overruns.

Data Types: logical

Number of frames in a contiguous burst, specified as a nonnegative integer.

Dependencies

To enable this property, set EnableBurstMode to 1 (true).

Data Types: double

Usage

Description

data = rx() receives data from a USRP device associated with the comm.SDRuReceiver System object, rx.

[data,dataLen] = rx() also returns dataLen, which indicates whether the object receives valid data from the radio hardware.

[data,dataLen,overrun] = rx() also returns an integer value that indicates data discontinuity in addition to the above syntaxes. If overrun is equal to or greater than 1, then data does not represent contiguous data.

[data,dataLen,overrun] = rx(fc,offset,gain) receives data from a USRP device associated with the comm.SDRuReceiver System object, rx. for given input center frequency, fc. The input offset is the local oscillator offset. gain is overall gain for USRP hardware receiver data path.

Note

Starting in R2016b, instead of using the step method to perform the operation defined by the System object, you can call the object with arguments, as if it were a function. For example, y = step(obj,x) and y = obj(x) perform equivalent operations.

Input Arguments

expand all

Center frequency, specified as a nonnegative scalar or a row vector of nonnegative values. Units are in Hz. The valid range of values for this argument depends on the RF daughter card of the USRP device.

LO offset frequency, specified as a scalar or row vector. Units are in Hz. The valid range of this argument depends on the RF daughterboard of the USRP device. For multiple channels (MIMO), the LO offset must be zero only. This restriction is due to a UHD limitation. In this case, you can specify the LO offset for multiple channels as a scalar (0) or as a vector ([0 0]).

Overall gain for the USRP hardware receiver data path, including analog and digital components, specified as a scalar or row vector in dB.

Output Arguments

expand all

Output signal, returned as a column vector or matrix. For a single channel radio, this output is a column vector. For a multichannel radio, this output is a matrix. Each column in this matrix corresponds to a channel of complex data received on one channel.

Data Types: int16 | single | double
Complex Number Support: Yes

Data length and indication when valid data is present, returned as a nonnegative integer. When dataLen is 0, no data is present. If dataLen > 0, data is present, and you can use this data length to qualify the execution of part of the code. For more information, see Apply Conditional Execution.

At the time of radio initialization, no valid data exists. In this case, the output data is set to all zeros and dataLen is set to 0. When the host receives enough data from radio, the System object outputs valid data and dataLen is set to a positive integer.

Data discontinuity flag, returned as an integer.

  • When flag value is 0 — No overrun detected.

  • When flag value is ≥ 1 — overrun detected. The output data does not represent contiguous data from the USRP radio to the host.

Although the reported value does not represent the actual number of packets dropped, as this value increases, the farther your execution of the object is from achieving real-time performance. You can use this value as a diagnostic tool to determine real-time execution of the object. For more information, see Detect Underruns and Overruns.

Object Functions

To use an object function, specify the System object as the first input argument. For example, to release system resources of a System object named obj, use this syntax:

release(obj)

expand all

infoUSRP radio information
stepRun System object algorithm
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object

Examples

collapse all

Configure a B210 radio with serial number set to '31B92DD'. Set the radio to receive at 2.5 GHz, with the decimation factor of 256.

Create a SDRu Receiver System object to use for data reception.

rx = comm.SDRuReceiver(...
              'Platform','B210', ...
              'SerialNum','31B92DD', ...
              'CenterFrequency',2.5e9, ...
              'MasterClockRate',32e6, ...
              'DecimationFactor',256);

Save the valid data using the dsp.SignalSink System object.

rxLog = dsp.SignalSink;
   for counter = 1:20
    [data, len] = rx();
    if len>0
      rxLog(data);
    end
  end
release(rx)
release(rxLog)

Create an SDRu receiver System object for a multi-channel radio configuration.

radio = comm.SDRuReceiver('Platform','X300','IPAddress','192.168.60.2');
radio.ChannelMapping = [1 2];
radio.CenterFrequency = [1.2 1.3]*1e9;
radio.Gain = [5 6];

Call the info method.

info(radio)
ans = struct with fields:
                    Mboard: 'X300'
                  RXSubdev: {'UBX RX'  'UBX RX'}
                  TXSubdev: {'UBX TX'  'UBX TX'}
    MinimumCenterFrequency: [-70000000 -70000000]
    MaximumCenterFrequency: [6.0800e+09 6.0800e+09]
               MinimumGain: [0 0]
               MaximumGain: [37.5000 37.5000]
                  GainStep: [0.5000 0.5000]
           CenterFrequency: [1.2000e+09 1.3000e+09]
     LocalOscillatorOffset: 0
                      Gain: [5 6]
           MasterClockRate: 200000000
          DecimationFactor: 512
        BasebandSampleRate: 390625

Configure a B210 radio with serial number set to '31B92DD'. Set the radio to receive at 1 GHz with an decimation factor of 512 and master clock rate of 56 MHz.

Create a SDRu Receiver System object to use for data reception. Calculate the baseband sample rate from master clock rate and decimation factor.

rx = comm.SDRuReceiver(...
               'Platform','B210', ...
              'SerialNum','31B92DD', ...
              'CenterFrequency',1e9, ...
              'MasterClockRate', 56e6, ...
              'DecimationFactor',512);
sampleRate = rx.MasterClockRate/rx.DecimationFactor; % Calculate baseband sample rate        

Create a baseband file writer object having center frequency of 1 GHz.

rxWriter = comm.BasebandFileWriter('b210_capture.bb', ...
         sampleRate, rx.CenterFrequency);

Write the valid baseband data to file 'b210_capture.bb'.

for counter = 1:2000
      [data, len] = rx();
      if len>0
        rxWriter(data);
      end
end

Display information about received signal. Release the System objects.

info(rxWriter);
release(rx);
release(rxWriter);

Configure a B210 radio with serial number set to '31B92DD'. Set the radio to receive at 2.5 GHz with an decimation factor of 125, output data type as 'double' and master clock rate of 56 MHz.

Create a USRP radio receiver System object to use for data reception.

rx = comm.SDRuReceiver('Platform','B210', ...
         'SerialNum','31B92DD', ...
         'CenterFrequency',2.5e9, ...
         'MasterClockRate',56e6, ...
         'DecimationFactor',125, ...
         'OutputDataType','double');

Capture signal data using comm.DPSKDemodulator System object.

demodulator = comm.DPSKDemodulator('BitOutput',true);

Inside a for loop, receive the data using the rx System object and return overrun as an output argument. Display the messages when receiver indicates overrun with data loss.

for frame = 1:2000
      [data, len, overrun] = rx();
      demodulator(data);
      if len>0
          if overrun~=0
              msg = ['Overrun detected in frame # ', int2str(frame)];
          end
      end
end
release(rx)

With SRDu receiver System objects, the overrun output indicates data loss. This output is a useful diagnostic tool for determining real-time operation of the System object.

Configure a B210 radio with serial number set to '31B92DD'. Set the radio to receive at 2.5 GHz with a decimation factor of 125 and master clock rate of 56 MHz. Enable burst-mode buffering to overcome overrruns. Set number of frames in a burst to 20 and samples per frame to 37500.

Create a SDRu receiver System object to use for data reception.

rx = comm.SDRuReceiver(...
               'Platform','B210', ...
              'SerialNum','31B92DD', ...
              'CenterFrequency',2.5e9, ...
              'MasterClockRate', 56e6, ...
              'DecimationFactor',125, ...
              'OutputDataType','double');
rx.EnableBurstMode = true;
rx.NumFramesInBurst = 20;
rx.SamplesPerFrame = 37500;

Capture signal data using comm.DPSKDemodulaor System object.

demodulator = comm.DPSKDemodulator('BitOutput',true);

Inside a for loop, transmit the data using the rx System object and return overrun as an output argument. Display the messages when receiver indicates overrun with data loss.

numFrames = 100;
for frame = 1:numFrames
        [data,len,overrun] = rx();
      if len>0
           demodulator(data);
          if (overrun)
           msg = ['Overrun detected in frame # ', int2str(frame)];
           disp(msg);
          end
      end
end
Overrun detected in frame # 1
Overrun detected in frame # 21
Overrun detected in frame # 41
Overrun detected in frame # 61
Overrun detected in frame # 81
release(rx)

Overruns are indicated at the start frame of transmission for each burst. With burst mode enabled, an overrun occurs in between bursts as the streaming resumes, because it is not possible to get continuous data when starting and stopping streaming.

Receive phase synchronized signals using the TwinRX daughterboard. The sinusoidal signals are transmitted with an N210 radio and reception is carried out on an X300 radio with two TwinRX daughterboards. The example requires two MATLAB sessions running on the host computer.

In the first MATLAB session, configure an N210 radio with IP address set to '192.168.10.2'. Set the radio to transmit at 2.45 GHz, an interpolation factor of 100, and a master clock rate of 100 MHz. Set a gain of 8 dB and transport data type of 'int16'.

tx = comm.SDRuTransmitter(...
                    'Platform','N200/N210/USRP2', ...
                    'IPAddress','192.168.10.2', ...
                    'MasterClockRate',100e6, ...
                    'InterpolationFactor',100, ...
                    'Gain',8, ...
                    'CenterFrequency',2.45e9, ...
                    'TransportDataType','int16');

Generate a sine wave of 30 kHz for transmission. The sample rate is calculated from the master clock rate and interpolation factor specified for an N210 radio System object configuration. Set the output data type of the sine wave as 'double'.

sinewave = dsp.SineWave(1,30e3); 
sinewave.SampleRate = 100e6/100; 
sinewave.SamplesPerFrame = 5e4; 
sinewave.OutputDataType = 'double'; 
sinewave.ComplexOutput = true;
data = step(sinewave);

Set the frame duration for the sine wave to transmit based on the samples per frame and sample rate. Create time scope and frequency scope System objects to display time-domain and frequency-domain signals, respectively. Display a message when transmission starts.

frameDuration = (sinewave.SamplesPerFrame)/(sinewave.SampleRate); 
time = 0;
timeScope = timescope('TimeSpanSource','Property','TimeSpan',4/30e3,...
                      'SampleRate',100e6/100);
spectrumScope = dsp.SpectrumAnalyzer('SampleRate',sinewave.SampleRate); 
disp("Transmission Started"); 
timeScope(data); 
spectrumScope(data);

Inside a while loop, transmit the sine wave using the tx System object. Display a message when transmission is complete. Release the radio System object.

while time<30
    tx(data); 
    time = time+frameDuration; 
end 
disp("Transmission Stopped"); 
release(tx);

In the second MATLAB session, configure an X300 radio with IP address set to '192.168.20.2'. Set the radio to receive at 2.45 GHz with an decimation factor of 200 and a master clock rate of 200 MHz. Enable the TwinRX daughterboard and the TwinRX phase synchronization capability to receive phase synchronized signals. Set the channel mapping to [1 2 3 4]. Connect the power splitter from an N210 transmitter to four receiver channels of X300 radio for calibration.

rx = comm.SDRuReceiver(...
                    'Platform','X300', ...
                    'IPAddress','192.168.20.2', ...
                    'OutputDataType','double', ...
                    'IsTwinRXDaughterboard',true, ...
                    'EnableTwinRXPhaseSynchronization',true, ...
                    'ChannelMappin',[1 2 3 4]
                    'MasterClockRate',200e6, ...
                    'DecimationFactor',200, ...
                    'Gain',35, ...
                    'CenterFrequency',2.45e9, ...
                    'SamplesPerFrame',4000);

Set the frame duration for the sine wave to receive based on samples per frame and sample rate. Create the time scope and frequency scope System objects to display time-domain and frequency-domain signals, respectively. Display the message when reception starts.

frameduration = (rx.SamplesPerFrame)/(200e6/200); 
time = 0; 
timeScope = timescope('TimeSpanSource','Property','TimeSpan',...
                      4/30e3,'SampleRate',200e6/200);
spectrumScope = dsp.SpectrumAnalyzer('SampleRate',200e6/200); 
spectrumScope.ReducePlotRate = true; 
disp("Reception Started");

Inside a while loop, receive the sine wave using the rx System object. Normalize the signal with respect to amplitude for each receive channel. Compute the fast fourier transform (FFT) of each normalized signal. Calculate the phase difference between channel 1 and channel 2, channel 1 and channel 3, and channel 1 and channel 4.

while time < 10 
 [data,len] = step(rx); 
 if len > 0 
    amp(1) = max(abs(data(:,1))); 
    amp(2) = max(abs(data(:,2))); 
    amp(3) = max(abs(data(:,3))); 
    amp(4) = max(abs(data(:,4))); 
    maxAmp = max(amp); 
    if any(~amp)  
       NormalizedData = data; 
    else 
      NormalizedData(:,1) = maxAmp/amp(1)*data(:,1); 
      NormalizedData(:,2) = maxAmp/amp(2)*data(:,2); 
      NormalizedData(:,3) = maxAmp/amp(3)*data(:,3); 
      NormalizedData(:,4) = maxAmp/amp(4)*data(:,4); 
    end 
    freqOfFirst = fft(NormalizedData(:,1)); 
    freqOfSecond = fft(NormalizedData(:,2)); 
    freqOfThird = fft(NormalizedData(:,3)); 
    freqOfFourth = fft(NormalizedData(:,4)); 
    angle1 = rad2deg(angle(max(freqOfFirst)/max(freqOfSecond))); 
    angle2 = rad2deg(angle(max(freqOfFirst)/max(freqOfThird))); 
    angle3 = rad2deg(angle(max(freqOfFirst)/max(freqOfFourth))); 
    timeScope([real(NormalizedData),imag(NormalizedData)]); 
    spectrumScope(NormalizedData); 
 end 
    time = time + frameduration; 
end

Display the calculated phase difference between channel 1 and each of the other channels of TwinRX daughterboard.

disp([' Phase difference between channel 1 and 2: ', num2str(angle1)]); 
disp([' Phase difference between channel 1 and 3: ', num2str(angle2)]); 
disp([' Phase difference between channel 1 and 4: ', num2str(angle3)]); 
disp("Reception Ended"); 
release(timeScope); 
release(spectrumScope); 
release(rx);
Phase difference between channel 1 and 2: -98.511
Phase difference between channel 1 and 3: -161.599
Phase difference between channel 1 and 4: -86.680
Reception Ended

More About

expand all

Compatibility Considerations

expand all

Errors starting in R2020a

Introduced in R2011b