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.
DePunctureris calculated by
PIare parameters utilized by
DePuncturerscope. Sum of all
LRangefields is equal to given data length.
size_T PIcontains an identifier of 32 bit vector. Each
LRangefield must have a corresponding
PIvector which determines where "zeros" should be inserted and how long the de-punctured vector will be. There are 24 possible
PIvectors, they are defined for various code rates in [1, Table 29]. Lower
PIvalue generates longer de-punctured vector.
PI vector to check whether there is
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
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: .
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.
DePuncturermethod times for DAB mode I (4 audio CIFs); tests on i7-3610QM 2.30Ghz
||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
- ETSI EN 300 401 pp. 130-132