## Time (de)puncturing

`DataDecoder`

class contains important method called `DePuncturer`

, which transforms given data vector into expanded vector containing de-punctured "zeros". De-puncturing introduces redundancy: the lower subchannels quality (throughput), the more redundancy is required.

`DePuncturer`

is calculated by `DataDecoder`

constructor, `DePuncturerFICInit()`

and `DePuncturerMSCInit()`

. `LRange`

and `PI`

are parameters utilized by `DePuncturer`

.
`size_t LRange[5]`

marks`DePuncturer`

scope. Sum of all`LRange`

fields is equal to given data length.`size_T PI[5]`

contains an identifier of 32 bit vector. Each`LRange`

field must have a corresponding`PI`

vector which determines where "zeros" should be inserted and how long the de-punctured vector will be. There are 24 possible`PI`

vectors, they are defined for various code rates in [1, Table 29]. Lower`PI`

value generates longer de-punctured vector.

`DePuncturer`

uses `PI`

vector to check whether there is `1`

or `0`

. If there is `1`

, method simply rewrites float number from data vector to output vector and move pointer to next float. In case of `0`

, `DePuncturer`

keeps data pointer in actual position and writes `0`

to output vector. After each round, pointer set on `PI`

vector is incremented. When all 32 bits of `PI`

vector are checked, whole checking procedure is restarted to first bit. Algorithm works until data pointer reaches last float in data vector.

Figure 1 shows how `DePuncturer`

method splits given data into "blocks" depends of `LRange`

calculated in constructor. Each block is de-punctured with its own `PI`

, then saved into new vector.

Size of the de-punctered vector is calculated as: .

### Our implementation

First versions of `DePuncturer`

in *sdrdab* used de-puncturing on whole audio frame (all CIFs at same time). Because of need to use as little memory as possible, it was decided to change this behavior. Now `DePuncturer`

is able to de-puncture only one CIF in one method call.

`DePuncturer`

method times for DAB mode I (4 audio CIFs); tests on i7-3610QM 2.30GhzNumber of `LRange` |
length after de-puncturing | Time [ms] | |
---|---|---|---|

DAB (floats on datain: 24096) | 5 | 43392 | 0.1227 |

DAB+ (floats on datain: 23808) | 3 | 43104 | 0.1253 |

FIC (floats on datain: 9216) | 3 | 12384 | 0.0397 |

`DePuncturer`

performs quite well, however there is an idea to combine it with time deinterleaving. Unfortunately in FIC decoding, there is no `TimeDeInterleaver`

call. Thats why it will be hard to fully remove stand-alone `DePuncturer`

method.

### Bibliography

- ETSI EN 300 401 pp. 130-132