Practical channel estimation

`[`

performs practical channel estimation on the received resource grid
`h`

,`nVar`

,`info`

] = nrChannelEstimate(`rxGrid`

,`refInd`

,`refSym`

)`rxGrid`

by using a reference resource grid containing reference
symbols `refSym`

at locations `refInd`

. The function
returns the channel estimate `h`

, noise variance estimate
`nVar`

, and additional information `info`

.

`[`

specifies options by using one or more name-value pair arguments in addition to the input
arguments in any of the previous syntaxes.`h`

,`nVar`

,`info`

] = nrChannelEstimate(___,`Name,Value`

)

Generate physical broadcast channel (PBCH) demodulation reference signal (DM-RS) symbols for physical layer cell identity number 42. The time-dependant part of the DM-RS scrambling initialization is 0.

ncellid = 42; ibar_SSB = 0; dmrsSym = nrPBCHDMRS(ncellid,ibar_SSB);

Obtain resource element indices for the PBCH DM-RS.

dmrsInd = nrPBCHDMRSIndices(ncellid);

Create a resource grid containing the generated DM-RS symbols.

nTxAnts = 1; txGrid = complex(zeros([240 14 nTxAnts])); txGrid(dmrsInd) = dmrsSym;

Modulate the resource grid using the specified FFT length and cyclic prefix length.

nFFT = 512; cpLengths = ones(1,14) * 36; cpLengths([1 8]) = 40; nulls = [1:136 377:512].'; txWaveform = ofdmmod(txGrid,nFFT,cpLengths,nulls);

Create a TDL-C channel model with the specified properties.

```
SR = 7.68e6;
channel = nrTDLChannel;
channel.NumReceiveAntennas = 1;
channel.SampleRate = SR;
channel.DelayProfile = 'TDL-C';
channel.DelaySpread = 100e-9;
channel.MaximumDopplerShift = 20;
```

Obtain the maximum number of delayed samples from the channel path by using the largest delay and the implementation delay of the channel filter.

chInfo = info(channel); maxChDelay = ceil(max(chInfo.PathDelays*SR)) + chInfo.ChannelFilterDelay;

To flush delayed samples from the channel, append zeros at the end of the transmitted waveform corresponding to the maximum number of delayed samples and the number of transmit antennas. Transmit the padded waveform through the TDL-C channel model.

[rxWaveform,pathGains] = channel([txWaveform; zeros(maxChDelay,nTxAnts)]);

Estimate timing offset for the transmission using the DM-RS symbols as reference symbols. The OFDM modulation of the reference symbols spans 20 resource blocks at 15 kHz subcarrier spacing and uses initial slot number 0.

nrb = 20; scs = 15; initialSlot = 0; offset = nrTimingEstimate(rxWaveform,nrb,scs,initialSlot,dmrsInd,dmrsSym);

Synchronize the received waveform according to the estimated timing offset.

rxWaveform = rxWaveform(1+offset:end,:);

Create a received resource grid containing the demodulated and synchronized received waveform.

rxLength = sum(cpLengths) + nFFT*numel(cpLengths); cpFraction = 0.55; symOffsets = fix(cpLengths * cpFraction); rxGrid = ofdmdemod(rxWaveform(1:rxLength,:),nFFT,cpLengths,symOffsets,nulls);

Obtain the practical channel estimate.

H = nrChannelEstimate(rxGrid,dmrsInd,dmrsSym);

Obtain the perfect channel estimate.

pathFilters = getPathFilters(channel); H_ideal = nrPerfectChannelEstimate(pathGains,pathFilters,nrb,scs,initialSlot,offset);

Compare practical and perfect channel estimates.

figure; subplot(1,2,1); imagesc(abs(H)); xlabel('OFDM Symbol'); ylabel('Subcarrier'); title('Practical Estimate Magnitude'); subplot(1,2,2); imagesc(abs(H_ideal)); xlabel('OFDM Symbol'); ylabel('Subcarrier'); title('Perfect Estimate Magnitude');

`rxGrid`

— Received resource gridReceived resource grid, specified as a
*K*-by-*L*-by-*R* complex array.

*K*is the number of subcarriers equal to*NRB*× 12, where*NRB*is the number of resource blocks in the range from 1 to 275.*L*is the number of OFDM symbols in a slot or in a reference grid.When you call

`nrChannelEstimate`

with reference symbols`refSym`

,*L*is 12 for extended cyclic prefix and 14 for normal cyclic prefix. Set the cyclic prefix length by using the`'`

name-value pair argument.`CyclicPrefix`

'When you call

`nrChannelEstimate`

with reference resource grid`refGrid`

,*L*must equal*N*, the number of OFDM symbols in the reference grid.

*R*is the number of receive antennas.

**Data Types: **`single`

| `double`

**Complex Number Support: **Yes

`refInd`

— Reference symbol indicesinteger matrix

Reference symbol indices, specified as an integer matrix. The number of rows equals
the number of resource elements. You can specify all indices in a single column or
spread them across several columns. The number of elements in
`refInd`

and `refSym`

must be the same but their
dimensionality can differ. The function reshapes `refInd`

and
`refSym`

into column vectors before mapping them into a reference
grid: `refGrid(refInd(:)) = refSym(:)`

.

The elements of `refInd`

are one-based linear indices addressing
a *K*-by-*L*-by-*P* resource array.

*K*is the number of subcarriers equal to*NRB*× 12, where*NRB*is the number of resource blocks in the range from 1 to 275.*K*must be equal to the first dimension of`rxGrid`

.*L*is the number of OFDM symbols in a slot.*L*is 12 for extended cyclic prefix and 14 for normal cyclic prefix. Set the cyclic prefix length by using the`'`

name-value pair argument.`CyclicPrefix`

'*P*is the number of reference signal ports, inferred from the range of values in`refInd`

.

**Data Types: **`double`

`refSym`

— Reference symbolscomplex matrix

Reference symbols, specified as a complex matrix. The number of rows equals the number of
resource elements. You can specify all symbols in a single column or distribute them
across several columns. The number of elements in `refInd`

and
`refSym`

must be the same but their dimensionality can differ.
The function reshapes `refInd`

and `refSym`

into
column vectors before mapping them into a reference grid: ```
refGrid(refInd(:)) =
refSym(:)
```

.

**Data Types: **`single`

| `double`

**Complex Number Support: **Yes

`refGrid`

— Predefined reference gridPredefined reference grid, specified as a
*K*-by-*N*-by-*P* complex array.
`refGrid`

can span multiple slots.

*K*is the number of subcarriers equal to*NRB*× 12, where*NRB*is the number of resource blocks in the range from 1 to 275.*N*is the number of OFDM symbols in the reference grid.*P*is the number of reference signal ports.

**Data Types: **`single`

| `double`

**Complex Number Support: **Yes

Specify optional
comma-separated pairs of `Name,Value`

arguments. `Name`

is
the argument name and `Value`

is the corresponding value.
`Name`

must appear inside quotes. You can specify several name and value
pair arguments in any order as
`Name1,Value1,...,NameN,ValueN`

.

`'CyclicPrefix','extended'`

specifies extended cyclic prefix
length.`'CyclicPrefix'`

— Cyclic prefix length`'normal'`

(default) | `'extended'`

Cyclic prefix length, specified as the comma-separated pair consisting of
`'CyclicPrefix'`

and one of these values:

`'normal'`

— Use this value to specify normal cyclic prefix. This option corresponds to 14 OFDM symbols in a slot.`'extended'`

— Use this value to specify extended cyclic prefix. This option corresponds to 12 OFDM symbols in a slot. For the numerologies specified in TS 38.211 Section 4.2, the extended cyclic prefix length only applies to 60 kHz subcarrier spacing.

**Data Types: **`char`

| `string`

`'CDMLengths'`

— CDM arrangement for reference signals[1 1] (default) | 1-by-2 array of nonnegative integers

Code domain multiplexing (CDM) arrangement for reference signals, specified as the
comma-separated pair consisting of `'CDMLengths'`

and a 1-by-2
array of nonnegative integers [*FD*
*TD*]. Array elements *FD* and *TD*
specify the length of CDM despreading in the frequency domain (FD-CDM) and time domain
(TD-CDM), respectively. A value of 1 for an element specifies no CDM.

**Example: **`'CDMLengths',[2 1]`

specifies FD-CDM2 and no TD-CDM.

**Example: **`'CDMLengths',[1 1]`

specifies no orthogonal
despreading.

**Data Types: **`double`

`'AveragingWindow'`

— Pre-interpolation averaging window`[0 0]`

(default) | 1-by-2 array of nonnegative odd integersPre-interpolation averaging window, specified as the comma-separated pair
consisting of `'AveragingWindow'`

and a 1-by-2 array of nonnegative
odd integers [*F*
*T*]. Array elements *F* and *T*
specify the number of adjacent reference symbols in the frequency domain and time
domain, respectively, over which the function performs averaging before interpolation.
If *F* or *T* is zero, the function determines the
averaging value from the estimated signal-to-noise ratio (SNR) based on the noise
variance estimate `nVar`

.

**Data Types: **`double`

`h`

— Practical channel estimatePractical channel estimate, returned as a
*K*-by-*L*-by-*R*-by-*P*
complex array. *K*-by-*L*-by-*R* is
the shape of the received resource grid `rxGrid`

.
*P* is the number of reference signal ports.

`h`

inherits its data type from
`rxGrid`

.

**Data Types: **`double`

| `single`

`nVar`

— Noise variance estimatenonnegative scalar

Noise variance estimate, returned as a nonnegative scalar. `nVar`

is the measured variance of additive white Gaussian noise on the received reference
symbols.

**Data Types: **`double`

`info`

— Additional informationstructure

Additional information, returned as a structure with the field
`AveragingWindow`

.

Parameter Field | Value | Description |
---|---|---|

`AveragingWindow` | 1-by-2 array | Pre-interpolation averaging window, returned as a 1-by-2 array
[ |

Generate C and C++ code using MATLAB® Coder™.

A modified version of this example exists on your system. Do you want to open this version instead?

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

Select web siteYou can also select a web site from the following list:

Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.

- América Latina (Español)
- Canada (English)
- United States (English)

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)