# Documentation

### This is machine translation

Translated by
Mouseover text to see original. Click the button below to return to the English verison of the page.

# ltePDCCHSearch

## Syntax

``````[dcistr,dcibits] = ltePDCCHSearch(enb,chs,softbits)``````

## Description

example

``````[dcistr,dcibits] = ltePDCCHSearch(enb,chs,softbits)``` recovers downlink control information (DCI) message structures, `dcistr`, and corresponding vectors of DCI message bits, `dcibits`, after blind decoding the multiplexed physical downlink control channels (PDCCHs) within the control region given by the `softbits` input vector, cell-wide configuration, `enb`, and UE-specific channel configuration, `chs`. For more information, see PDCCH Search Processing.```

## Examples

collapse all

Extract and decode the PDCCH symbols from the control region of a subframe grid created by the DL waveform generator, `lteRMCDLTool`. Use the blind search function, `ltePDCCHSearch`, to search the common and UE-specific spaces by demasking all PDCCH candidates with the configured RNTI.

Use a waveform generator to create a full subframe grid containing a reference PDSCH and associated DCI in UE-specific search space. Extract and decode all the PDCCH multiplex (control region) bits.

```rmc = lteRMCDL('R.0'); [~,txGrid] = lteRMCDLTool(rmc,[1;0;0;1]); pdcchSymbols = txGrid(ltePDCCHIndices(rmc)); rxPdcchBits = ltePDCCHDecode(rmc,pdcchSymbols); ```

Configure the UE-specific parameters that affect the DCI message lengths to match those of the reference UE.

```ueConfig.RNTI = rmc.PDSCH.RNTI; ueConfig.EnableCarrierIndication = 'Off'; ueConfig.EnableSRSRequest = 'Off'; ueConfig.EnableMultipleCSIRequest = 'Off'; ueConfig.NTxAnts = 1; ```

Use PDCCH blind search to find the DCI that schedules the PDSCH. Extract and display first DCI message structure from the search list. Compare the format of the DCI message returned in the previous step with the format used by the waveform generator.

```[rxDCI,rxDCIBits] = ltePDCCHSearch(rmc,ueConfig,rxPdcchBits); decDCI = rxDCI{1} decDCIFormat = decDCI.DCIFormat txDCIFormat = rmc.PDSCH.DCIFormat ```
```decDCI = struct with fields: DCIFormat: 'Format1' CIF: 0 AllocationType: 1 Allocation: [1×1 struct] ModCoding: 14 HARQNo: 0 NewData: 1 RV: 0 TPCPUCCH: 0 TDDIndex: 0 HARQACKResOffset: 0 decDCIFormat = 'Format1' txDCIFormat = 'Format1' ```

Map a pair of format 0 uplink and format 1A downlink grants into a UE-specific search space in the PDCCH multiplex. Use the blind search function to recover them. Becasue the search space is UE-specific, you can extend the messages to include the Release 10 SRS request field and a 2-bit CSI request field for the format 0 DCI. For simplicity, the example does not include any PDCCH channel processing steps.

Create a vector containing the control region PDCCH multiplex bits.

```enb = lteRMCDL('R.0'); pdcchinfo = ltePDCCHInfo(enb); pdcchmux = zeros(1,pdcchinfo.MTot); ```

Configure the UE-specific parameters to control the DCI and encoding.

```chs = struct('RNTI',1,'PDCCHFormat',2); chs.ControlChannelType = 'PDCCH'; chs.SearchSpace = 'UESpecific'; chs.EnableCarrierIndication = 'Off'; chs.EnableSRSRequest = 'On'; chs.EnableMultipleCSIRequest = 'On'; chs.NTxAnts = 1; ```

List the formats to create and get the UE-specific search space candidate locations in the PDCCH multiplex.

```formats = {'Format0','Format1A'}; candidates = ltePDCCHSpace(enb,chs); ```

For each DCI format, create the DCI info bits and encode them for PDCCH mapping. Demonstate setting of the `ModCoding` field to a nondefault value. Select a candidate to carry the target PDCCH.

```for f = 1:length(formats) dciin = struct('DCIFormat',formats{f},'ModCoding',f); [dci,dcibits] = lteDCI(enb,chs,dciin); pdcch = lteDCIEncode(chs,dcibits); pdcchmux(candidates(f,1):candidates(f,2)) = pdcch; end ```

Search PDCCH multiplex bits for any DCI messages directed at UE RNTI.

```rxDCI = ltePDCCHSearch(enb,chs,pdcchmux) rxDCI{:} ```
```rxDCI = 1×2 cell array [1×1 struct] [1×1 struct] ans = struct with fields: DCIFormat: 'Format1A' CIF: 0 AllocationType: 0 Allocation: [1×1 struct] ModCoding: 2 HARQNo: 0 NewData: 0 RV: 0 TPCPUCCH: 0 TDDIndex: 0 SRSRequest: 0 HARQACKResOffset: 0 ans = struct with fields: DCIFormat: 'Format0' CIF: 0 FreqHopping: 0 Allocation: [1×1 struct] ModCoding: 1 NewData: 0 TPC: 0 CShiftDMRS: 0 TDDIndex: 0 CSIRequest: 0 SRSRequest: 0 AllocationType: 0 ```

## Input Arguments

collapse all

Cell-wide settings, specified as a structure with these fields.

Parameter FieldRequired or OptionalValuesDescription
`NDLRB`Required

Scalar integer from 6 to 110

Number of downlink resource blocks. (${N}_{\text{RB}}^{\text{DL}}$)

For information on link bandwidth assignment, see Specifying Number of Resource Blocks.

`NULRB`Required

Scalar integer from 6 to 110

Number of uplink resource blocks. (${N}_{\text{RB}}^{\text{UL}}$)

For information on link bandwidth assignment, see Specifying Number of Resource Blocks.

`NSubframe`Required

0 (default), nonnegative scalar integer

Subframe number

`CellRefP`Required

1, 2, 4

Number of cell-specific reference signal (CRS) antenna ports

`DuplexMode`Optional

`'FDD'` (default), `'TDD'`

Duplexing mode, specified as one of the following:

• `'FDD'` — Frequency division duplex (default)

• `'TDD'` — Time division duplex

Data Types: `struct`

User-equipment-related (UE-related) channel configuration, specified as a structure containing the following UE-specific fields.

Radio network temporary identifier value, specified as a numeric scalar.

Data Types: `double`

Option to enable carrier indication UE configuration, specified as `'Off'` or `'On'`. Default configuration is disabled. When enabled, `'On'`, the carrier indication field is present.

Data Types: `char`

Option to enable SRS request in the UE configuration, specified as `'Off'` or `'On'`. By default, `EnableSRSRequest` is disabled. When `EnableSRSRequest` is enabled (`'On'`), the SRS request field is present in UE-specific formats 0/1A for FDD or TDD and formats 2B/2C/2D for TDD.

Data Types: `char`

Option to enable multiple CSI requests in the UE configuration, specified as `'Off'` or `'On'`. By default, `EnableMultipleCSIRequest` is disabled. When `EnableMultipleCSIRequest` is enabled (`'On'`), the UE is configured to process multiple channel state information (CSI) requests from cells. Enabling multiple CSI requests affects the length of the CSI request field in UE-specific formats 0 and 4.

Data Types: `char`

Number of UE transmission antennas, specified as 1, 2, or 4. The number of UE transmission antennas affects the length of the precoding information field in DCI format 4.

Data Types: `double`

Data Types: `struct`

Input vector of soft bits, specified as a column vector.

Data Types: `double`

## Output Arguments

collapse all

Downlink control information (DCI) message structures, returned as a cell array of structures. Each structure represents a successfully decoded DCI whose fields match fields of the associated DCI format. Each structure contains the fields associated with one or more decoded DCI messages. Because multiple PDCCHs can be transmitted in a subframe, the UE must monitor all possible PDCCHs directed at it. If more than one PDCCH is directed to the UE or is successfully decoded, `dcistr` contains that number of decoded DCI messages.

Each cell contains a structure with the fields associated with the DCI format of the received PDCCHs.

DCI format type, specified as a character vector. This table presents the fields associated with each DCI format as defined in TS 36.212 [1], Section 5.3.3.

DCI Formatsdciout FieldsSizeDescription
`'Format0'``DCIFormat`-`'Format0'`
`CIF`0 or 3 bitsCarrier indicator field
`FreqHopping`1 bit PUSCH frequency hopping flag
`Allocation`Varies Resource block assignment/allocation
`ModCoding`5 bits Modulation, coding scheme, and redundancy version
`NewData`1 bit New data indicator
`TPC`2 bits PUSCH TPC command
`CShiftDMRS`3 bits Cyclic shift for DM RS
`TDDIndex`2 bits

For TDD config 0, this field is the Uplink Index.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`CSIRequest`1, 2, or 3 bitsCSI request
`SRSRequest`0 or 1 bit

SRS request. This field can only be present in DCI formats scheduling PUSCH which are mapped onto the UE specific search space given by the C-RNTI

`AllocationType`1 bit

Resource allocation type, only present if ${N}_{\text{RB}}^{\text{UL}}$${N}_{\text{RB}}^{\text{DL}}$.

`'Format1'``DCIFormat    `-`'Format1'`
`CIF`0 or 3 bitsCarrier indicator field
`AllocationType`

1 bit

Resource allocation header: type 0, type 1. If downlink bandwidth is ≤10 PRBs there is no resource allocation header and resource allocation type 0 is assumed.

`Allocation   `VariesResource block assignment/allocation
`ModCoding    `5 bitsModulation and coding scheme
`HARQNo       `3 bits (FDD)

4 bits (TDD)

HARQ process number
`NewData      `1 bit New data indicator
`RV           `2 bits Redundancy version
`TPCPUCCH     `2 bits PUCCH TPC command
`TDDIndex`2 bits

For TDD config 0, this field is not used.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`HARQACKResOffset`2 bits

HARQ-ACK resource offset. Present when this format is carried by EPDCCH. Not present when this format is carried by PDCCH

`'Format1A'``DCIFormat    ` -`'Format1A'`
`CIF`0 or 3 bitsCarrier indicator field
`AllocationType`1 bit VRB assignment flag: 0 (localized), 1 (distributed)
`Allocation   `Varies Resource block assignment/allocation
`ModCoding    `5 bits Modulation and coding scheme
`HARQNo       `3 bits (FDD)

4 bits (TDD)

HARQ process number
`NewData      `1 bitNew data indicator
`RV           `2 bits Redundancy version
`TPCPUCCH     `2 bits PUCCH TPC command
`TDDIndex`2 bits

For TDD config 0, this field is not used.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`SRSRequest`0 or 1 bit

SRS request. This field can only be present in DCI formats scheduling PUSCH which are mapped onto the UE specific search space given by the C-RNTI

`HARQACKResOffset`2 bits

HARQ-ACK resource offset. Present when this format is carried by EPDCCH. Not present when this format is carried by PDCCH

`'Format1B'``DCIFormat    ` -`'Format1B'`
`CIF`0 or 3 bitsCarrier indicator field
`AllocationType`1 bit VRB assignment flag: 0 (localized), 1 (distributed)
`Allocation   `Varies Resource block assignment/allocation
`ModCoding    `5 bits Modulation and coding scheme
`HARQNo       `3 bits (FDD)

4 bits (TDD)

HARQ process number
`NewData      `1 bitNew data indicator
`RV           `2 bits Redundancy version
`TPCPUCCH     `2 bits PUCCH TPC command
`TDDIndex`2 bits

For TDD config 0, this field is not used.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`TPMI         `2 bits for two antennas

4 bits for four antennas

PMI information
`PMI          `1 bitPMI confirmation
`HARQACKResOffset`2 bits

HARQ-ACK resource offset. Present when this format is carried by EPDCCH. Not present when this format is carried by PDCCH

`'Format1C'``DCIFormat    ` - `'Format1C'`
`Allocation   `Varies Resource block assignment/allocation
`ModCoding     `5 bits Modulation and coding scheme
`'Format1D'``DCIFormat    ` - `'Format1D'`
`CIF`0 or 3 bitsCarrier indicator field
`AllocationType`1 bit VRB assignment flag: 0 (localized), 1 (distributed)
`Allocation   `Varies Resource block assignment/allocation
`ModCoding    `5 bits Modulation and coding scheme
`HARQNo       `3 bits (FDD)

4 bits (TDD)

HARQ process number
`NewData      `1 bitNew data indicator
`RV           `2 bits Redundancy version
`TPCPUCCH     `2 bits PUCCH TPC command
`TDDIndex`2 bits

For TDD config 0, this field is not used.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`TPMI         `2 bits for two antennas

4 bits for four antennas

Precoding TPMI information
`DlPowerOffset`1 bit Downlink power offset
`HARQACKResOffset`2 bits

HARQ-ACK resource offset. Present when this format is carried by EPDCCH. Not present when this format is carried by PDCCH

`'Format2'``DCIFormat    ` - `'Format2'`
`CIF`0 or 3 bitsCarrier indicator field
`AllocationType`1 bit

Resource allocation header: type 0, type 1. If downlink bandwidth is ≤10 PRBs there is no resource allocation header and resource allocation type 0 is assumed.

`Allocation   `Varies Resource block assignment/allocation
`TPCPUCCH`2 bits PUCCH TPC command
`TDDIndex`2 bits

For TDD config 0, this field is not used.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`HARQNo       `3 bits (FDD)

4 bits (TDD)

HARQ process number
`SwapFlag     `1 bitTransport block to codeword swap flag
`ModCoding1   `5 bits Modulation and coding scheme for transport block 1
`NewData1     `1 bit

New data indicator for transport block 1

`RV1          `2 bits Redundancy version for transport block 1
`ModCoding2   `5 bits Modulation and coding scheme for transport block 2
`NewData2     `1 bit New data indicator for transport block 2
`RV2          `2 bits Redundancy version for transport block 2
`PrecodingInfo`3 bits for two antennas

6 bits for four antennas

Precoding information
`HARQACKResOffset`2 bits

HARQ-ACK resource offset. Present when this format is carried by EPDCCH. Not present when this format is carried by PDCCH

`'Format2A'``DCIFormat    ` -`'Format2A'`
`CIF`0 or 3 bitsCarrier indicator field
`AllocationType`1 bit

Resource allocation header: type 0, type 1. If downlink bandwidth is ≤10 PRBs there is no resource allocation header and resource allocation type 0 is assumed.

`Allocation   `Varies Resource block assignment/allocation
`TPCPUCCH     `2 bits PUCCH TPC command
`TDDIndex`2 bits

For TDD config 0, this field is not used.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`HARQNo       `3 bits (FDD)

4 bits (TDD)

HARQ process number
`SwapFlag     `1 bitTransport block to codeword swap flag
`ModCoding1   `5 bits Modulation and coding scheme for transport block 1
`NewData1     `1 bit New data indicator for transport block 1
`RV1          `2 bits Redundancy version for transport block 1
`ModCoding2   `5 bits Modulation and coding scheme for transport block 2
`NewData2     `1 bit New data indicator for transport block 2
`RV2          `2 bits Redundancy version for transport block 2
`PrecodingInfo`0 bits for two antennas

2 bits for four antennas

Precoding information
`HARQACKResOffset`2 bits

HARQ-ACK resource offset. Present when this format is carried by EPDCCH. Not present when this format is carried by PDCCH

`'Format2B'``DCIFormat` - `'Format2B'`
`CIF`0 or 3 bitsCarrier indicator field
`AllocationType`1 bit

Resource allocation header: type 0, type 1. If downlink bandwidth is ≤10 PRBs there is no resource allocation header and resource allocation type 0 is assumed.

`Allocation`Varies Resource block assignment/allocation
`TPCPUCCH`2 bits PUCCH TPC command
`TDDIndex`2 bits

For TDD config 0, this field is not used.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`HARQNo`3 bits (FDD)

4 bits (TDD)

HARQ process number
`ScramblingId`1 bitScrambling identity
`ModCoding1   `5 bits Modulation and coding scheme for transport block 1
`NewData1     `1 bit New data indicator for transport block 1
`RV1`2 bits Redundancy version for transport block 1
`ModCoding2`5 bits Modulation and coding scheme for transport block 2
`NewData2`1 bit New data indicator for transport block 2
`RV2`2 bits Redundancy version for transport block 2
`HARQACKResOffset`2 bits

HARQ-ACK resource offset. Present when this format is carried by EPDCCH. Not present when this format is carried by PDCCH

`'Format2C'``DCIFormat`-`'Format2C'`
`CIF`0 or 3 bitsCarrier indicator field
`AllocationType`1 bit

Resource allocation header: type 0, type 1. If downlink bandwidth is ≤10 PRBs there is no resource allocation header and resource allocation type 0 is assumed.

`Allocation`Varies Resource block assignment/allocation
`TPCPUCCH`2 bits PUCCH TPC command
`TDDIndex`2 bits

For TDD config 0, this field is not used.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`HARQNo`3 bits (FDD)

4 bits (TDD)

HARQ process number
`TxIndication`3 bitsAntenna ports, scrambling identity, and number of layers indicator
`SRSRequest`VariesSRS request. Only present for TDD.
`ModCoding1   `5 bits Modulation and coding scheme for transport block 1
`NewData1     `1 bit New data indicator for transport block 1
`RV1`2 bits Redundancy version for transport block 1
`ModCoding2`5 bits Modulation and coding scheme for transport block 2
`NewData2`1 bit New data indicator for transport block 2
`RV2`2 bits Redundancy version for transport block 2
`HARQACKResOffset`2 bits

HARQ-ACK resource offset. Present when this format is carried by EPDCCH. Not present when this format is carried by PDCCH

`'Format2D'``DCIFormat`-`'Format2D'`
`CIF`0 or 3 bitsCarrier indicator field
`AllocationType`1 bit

Resource allocation header: type 0, type 1. If downlink bandwidth is ≤10 PRBs there is no resource allocation header and resource allocation type 0 is assumed.

`Allocation`Varies Resource block assignment/allocation
`TPCPUCCH`2 bits PUCCH TPC command
`TDDIndex`2 bits

For TDD config 0, this field is not used.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`HARQNo`3 bits (FDD)

4 bits (TDD)

HARQ process number
`TxIndication`3 bitsAntenna ports, scrambling identity, and number of layers indicator
`SRSRequest`VariesSRS request. Only present for TDD.
`ModCoding1   `5 bits Modulation and coding scheme for transport block 1
`NewData1     `1 bit New data indicator for transport block 1
`RV1`2 bits Redundancy version for transport block 1
`ModCoding2`5 bits Modulation and coding scheme for transport block 2
`NewData2`1 bit New data indicator for transport block 2
`RV2`2 bits Redundancy version for transport block 2
`REMappingAndQCL`2 bits

PDSCH RE Mapping and Quasi-Co-Location Indicator

`HARQACKResOffset`2 bits

HARQ-ACK resource offset. Present when this format is carried by EPDCCH. Not present when this format is carried by PDCCH

`'Format3'``DCIFormat`- `'Format3'`
`TPCCommands`Varies TPC commands for PUCCH and PUSCH
`'Format3A'``DCIFormat`- `'Format3A'`
`TPCCommands`Varies TPC commands for PUCCH and PUSCH
`'Format4'``DCIFormat`- `'Format4'`
`CIF`0 or 3 bitsCarrier indicator field
`Allocation`VariesResource block assignment/allocation
`TPC`2 bits PUSCH TPC command
`CShiftDMRS`3 bits Cyclic shift for DM-RS
`TDDIndex`2 bits

For TDD config 0, this field is Uplink Index.

For TDD config 1–6, this field is the Downlink Assignment Index.

Not present for FDD.

`CSIReq`VariesCSI request
`SRSRequest`2 bits SRS request
`AllocationType`1 bit

Resource allocation header type 0 or type 1.

`ModCoding`5 bits Modulation, coding scheme, and redundancy version
`NewData`1 bitNew data indicator
`ModCoding1`5 bits Modulation and coding scheme for transport block 1
`NewData1`1 bitNew data indicator for transport block 1
`ModCoding2`5 bits Modulation and coding scheme for transport block 2
`NewData2`1 bit New data indicator for transport block 2
`PrecodingInfo`3 bits for two antennas

6 bits for four antennas

Precoding information
`'Format5'``DCIFormat`- `'Format5'`
`PSCCHResource`6 bits

Resource for PSCCH

`TPC`1 bit

TPC command for PSCCH and PSSCH

`FreqHopping`1 bit

Frequency hopping flag

`Allocation`Varies

Resource block assignment and hopping resource allocation

`TimeResourcePattern`7 bits Time resource pattern

Data Types: `char`

Data Types: `cell`

DCI message bits, returned as a cell array of one or more numeric vectors. Each vector contains the bit stream of a recovered DCI message, including any zero-padding. Each vector of bit values corresponds to successfully decoded DCI messages. For more information, see `lteDCI`.

Data Types: `cell`

collapse all

### PDCCH Search Processing

PDCCH search processing blindly decodes DCI messages based on their lengths. The lengths and order in which DCI messages are searched for is provided by `lteDCIInfo`. If one or more messages have the same length, the first message format in the list is used to decode the message. The other potential message formats are ignored. The `ltePDCCHSearch` function does not consider transmission mode (TM) during blind search, and no DCI message format is filtered based on transmission mode. It also does not search for format 3 and 3A (power adjustment commands for PUSCH and PUCCH). For more information on the association between transmission mode, transmission scheme, DCI format, and search space, see TS 36.213 [2], Section 7.1 and Table 7.1-5.

The UE is required to monitor multiple PDCCHs within the control region. The UE is informed only of the width, in OFDM symbols, of the control region within a subframe, and is not aware of the exact location of PDCCHs relevant to it. The UE finds the PDCCHs relevant to it by monitoring a set of PDCCH candidates, that is, a set of consecutive control candidate elements (CCEs) on which PDCCH can be mapped, in every subframe. For details, see `ltePDCCHSpace`. This process is referred to as blind decoding.

To simplify the decoding task at the UE, the whole control region is subdivided into common and UE-specific search spaces which the UE monitors (monitor implies attempting to decode each PDCCH). Each search space comprises 2, 4, or 6 PDCCH candidates whose data length depends on its corresponding PDCCH format. Each PDCCH must be transmitted on 1, 2, 4, or 8 CCE (1 CCE = 72 bits). The common search space is limited to only two aggregation levels, 4 and 8, while the UE-specific search space can have an aggregation level of 1, 2, 4, or 8.

All UEs within a cell monitor the common search space that carries control information common to all UEs. The common control information carries initial important information including paging information, system information, and random access procedures. The UE monitors the common search space by demasking each PDCCH candidate with different RNTIs, for example, P-RNTI, SI-RNTI, RA-RNTI and so on.

In the UE-specific search space, the UE finds the PDCCH relevant to it by monitoring a set of PDCCH candidates in every subframe. If no CRC error is detected when the UE demasks a PDCCH candidate with its RNTI (16-bit C-RNTI value), the UE determines that the PDCCH candidate carries its own control information.

The number and location of candidates within a search space is different for each PDCCH format. There are four PDCCH formats (0, 1, 2, or 3). If the UE fails to decode any PDCCH candidates for a given PDCCH format, it tries to decode candidates for another PDCCH format.

### Specifying Number of Resource Blocks

The number of resource blocks specifies the uplink and downlink bandwidth. The LTE System Toolbox™ implementation assumes symmetric link bandwidth unless you specifically assign different values to `NULRB` and `NDLRB`. If the number of resource blocks is initialized in only one link direction, then the initialized number of resource blocks (`NULRB` or `NDLRB`) is used for both uplink and downlink. When this mapping is used, no warning is displayed. An error occurs if `NULRB` and `NDLRB` are both undefined.

## References

[1] 3GPP TS 36.212. "Multiplexing and channel coding." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network; Evolved Universal Terrestrial Radio Access (E-UTRA). URL: http://www.3gpp.org.

[2] 3GPP TS 36.213. "Physical layer procedures." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network; Evolved Universal Terrestrial Radio Access (E-UTRA). URL: http://www.3gpp.org.