%% Perform MMSE Equalization for PBCH
% Perform MMSE equalization on extracted resource elements of the physical broadcast channel (PBCH).
% Create symbols and indices for a PBCH transmission.

ncellid = 146;
v = 0;
E = 864;
cw = randi([0 1],E,1);
pbchTxSym = nrPBCH(cw,ncellid,v);
pbchInd = nrPBCHIndices(ncellid);

% Generate an empty resource array for one transmitting antenna. Populate the array with the PBCH symbols by using the generated PBCH indices.

P = 1;
txGrid = zeros([240 4 P]);
txGrid(pbchInd) = pbchTxSym;

% Perform OFDM modulation.

txWaveform = ofdmmod(txGrid,256,[22 18 18 18],[1:8 249:256].');

% Create channel matrix and apply channel to transmitted waveform.

R = 4;
H = dftmtx(max([P R]));
H = H(1:P,1:R);
H = H / norm(H);
rxWaveform = txWaveform * H;

% Create channel estimate.

hEstGrid = repmat(permute(H.',[3 4 1 2]),[240 4]);
nEst = 0.1;

% Perform OFDM demodulation.

rxGrid = ofdmdemod(rxWaveform,256,[22 18 18 18],0,[1:8 249:256].');

% To prepare for PBCH decoding, use nrExtractResources to extract symbols from received and channel estimate grids. Plot the received PBCH constellation.

[pbchRxSym,pbchHestSym] = nrExtractResources(pbchInd,rxGrid,hEstGrid);
figure;
plot(pbchRxSym,'o:');
title('Received PBCH Constellation');

% Decode the PBCH with the extracted resource elements. Plot the equalized PBCH constellation.

[pbchEqSym,csi] = nrEqualizeMMSE(pbchRxSym,pbchHestSym,nEst);
pbchBits = nrPBCHDecode(pbchEqSym,ncellid,v);
figure;
plot(pbchEqSym,'o:');
title('Equalized PBCH Constellation');

% Copyright 2019 The MathWorks, Inc.