This example illustrates a methodology for system-level modeling and simulation of a 66 GHz QPSK RF transmit and receive system with a 32-element hybrid beamforming antenna. The system includes RF imperfections, transmit array radiation effects, a narrowband receive array and a baseband receiver with corrections for system impairments and message decoding. The antenna beamforming direction is defined using azimuth and elevation angles and it is estimated in the RF receive antenna using a Root Music DOA algorithm.

In the following sections you will see more details about the system design.

The top-level of this example consists of five sub-system blocks, a block to control the relative angle between transmitter and receiver, and 2 displays:

A QPSK baseband transmitter encodes the message "Hello World ###".

An RF transmitter with IQ modulation, mixing, amplification and hybrid beamforming with control circuitry. The RF transmitter model includes RF imperfections such as noise, non-linear effects and antenna element coupling.

An ideal channel attenuating the transmitted signal with a free space path loss model.

An RF receiver with two narrowband receive array antennas, receiver gain and SNR, 12-bit ADC with finite dynamic range, and two root MUSIC algorithms for angle of arrival estimation along azimuth and elevation.

A QPSK receiver, including carrier and frame synchronization, demodulation and data decoding.

A block where the user sets the relative angle between the transmitter and the receiver.

A spectrum analyzer scope comparing normalized transmitted and received signals and a display for the received message.

```
model = 'simrfV2_qpsk';
open_system(model)
sim(model)
```

The QPSK transmitter includes a Bit Generation subsystem, a QPSK Modulator block, a Raised Cosine Transmit Filter block for pulse shaping, and a Gain block. The Bit Generation subsystem generates frames. Each frame contains 26 header bits followed by a payload of 174 bits, 105 bits for the message 'Hello world ###' and 69 random bits. The payload is scrambled to guarantee a balanced distribution of zeros and ones for the timing recovery operation in the receiver model.

open_system([model '/QPSK TX'],'force')

The RF transmitter is composed of three sections: array beamformers, a hybrid beamforming antenna and a Narrowband Transmit Array block. The 32-element hybrid beamforming antenna is divided in 4 sub-arrays. Each subarray consists of 8 RF transmitters operating at 66 GHz. The antennas are microstrip patches. These antenna elements and the subarrays have been designed and verified with a MATLAB script that uses Antenna Toolbox™.

The far field antenna array gain is computed with the Phased Array System Toolbox™ Narrowband Transmit Array block. The computed radiation pattern is the superposition of the fields generated by the isolated microstrip patches.

```
open_system([model '/Transmit Array Hybrid Beamforming'])
```

The transmit array is steered towards the direction estimated by the receiver. For demonstration purposes, two different beamforming algorithms are used to compute the weights applied to the four subarrays and to the elements of each subarray.

The subarrays weights are computed with an MVDR beamformer. A complex multiplication in the MVDR beamformer combines the transmitted signal and subarrays weights, steering the transmitted signal along the azimuth direction. Tapering is used to reduce the effects of grating lobes.

The phase shifts applied to the eight subarray elements are computed with a phase shifter beamforming algorithm. The four subarrays apply the same phase shifts that steer the transmitter along the elevation direction.

```
open_system([model '/Transmit Array Hybrid Beamforming/Beamformers'])
```

The four transmit subarrays are identical. Each subarray first performs upconversion at 5 GHz using a quadrature modulator, and then performs upconversion at 66 GHz using a superhet modulator including image and channel select filters. Each stage introduces impairments such as noise, I/Q imbalance, LO leakage, and non-linearity. A non-linear power amplifier increases the transmitter gain, and a network of Wilkinson power dividers connect the PA to the 8 antennas. Eight variable phase shifters are used to steer the beam. The loading of the antenna subarray and the coupling in between the antenna elements is modeled by its S-parameters.

```
open_system([model '/Transmit Array Hybrid Beamforming/subarray1'])
```

The receiver is modeled at a higher abstraction level compared to the transmitter. The receiver uses two orthogonal linear arrays, each with 4 isotropic antenna elements. The arrays are used to provide spatial diversity for the identification of the angle of arrival. The receiver does not implement any beamforming algorithm.

The receiver finite gain and SNR is modeled for each of the received signals followed by a 12-bit ADC with finite dynamic range including saturation and quantization effects.

Two root MUSIC algorithms are used to estimate the direction of arrival using the linear array signals. Each algorithm operates across one dimension, thus together can estimate the transmitter position in terms of azimuth and elevation angles.

```
open_system([model '/Receive Array'])
```

The QPSK receiver from the Communications Toolbox™ example QPSK Transmitter and Receiver (Communications Toolbox) is used in this example with modification. These modifications remove blocks from this receiver when the signal impairment is absent.

The AGC controls and stabilizes the received signal amplitude which affects the accuracy of the carrier symbol synchronizer.

The Raised Cosine Receive Filter provides matched filtering for the transmitted waveform.

The Carrier Synchronizer Block performs fine frequency compensation.

The Preamble Detector block uses the known frame header (QPSK-modulated Barker code) to correlate against the received QPSK symbols to find the location of the frame header.

The Frame Synchronizer block uses the frame location information from the Preamble Detector to align the frame boundaries. The second output of the block is a boolean scalar indicating if the first output is a valid frame with the desired header and if so, enables the Data Decoding subsystem to run.

The Data Decoding enabled subsystem performs phase ambiguity resolution, demodulation and text message decoding.

```
open_system([model '/QPSK Receiver'])
```

The input signal constellation for the data decoder QPSK Demodulator is

```
bdclose(model)
clear model;
```