Skip to content

Commit 63c1e36

Browse files
authored
Merge pull request #3 from robmaunder/SpeedUp
Code runs much faster now.
2 parents 5fb3909 + c3365c9 commit 63c1e36

File tree

6 files changed

+319
-190
lines changed

6 files changed

+319
-190
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
*.m~
22
.DS_Store
33
*.bak
4+
*.asv

NRDemodulator.m

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,35 @@
2929
end
3030

3131
function ModulationOrder = get.ModulationOrder(obj)
32-
if strcmp(obj.Modulation, 'BPSK')
32+
Modulation_ = obj.Modulation;
33+
34+
if strcmp(Modulation_, 'BPSK')
3335
ModulationOrder = 2;
34-
elseif strcmp(obj.Modulation, 'QPSK')
36+
elseif strcmp(Modulation_, 'QPSK')
3537
ModulationOrder = 4;
36-
elseif strcmp(obj.Modulation, '16QAM')
38+
elseif strcmp(Modulation_, '16QAM')
3739
ModulationOrder = 16;
38-
elseif strcmp(obj.Modulation, '64QAM')
40+
elseif strcmp(Modulation_, '64QAM')
3941
ModulationOrder = 64;
40-
elseif strcmp(obj.Modulation, '256QAM')
42+
elseif strcmp(Modulation_, '256QAM')
4143
ModulationOrder = 256;
4244
else
4345
error('ldpc_3gpp_matlab:UnsupportedParameters','Unsupported modulation');
4446
end
4547
end
4648

4749
function Q_m = get.Q_m(obj)
48-
if strcmp(obj.Modulation, 'BPSK')
50+
Modulation_ = obj.Modulation;
51+
52+
if strcmp(Modulation_, 'BPSK')
4953
Q_m = 1;
50-
elseif strcmp(obj.Modulation, 'QPSK')
54+
elseif strcmp(Modulation_, 'QPSK')
5155
Q_m = 2;
52-
elseif strcmp(obj.Modulation, '16QAM')
56+
elseif strcmp(Modulation_, '16QAM')
5357
Q_m = 4;
54-
elseif strcmp(obj.Modulation, '64QAM')
58+
elseif strcmp(Modulation_, '64QAM')
5559
Q_m = 6;
56-
elseif strcmp(obj.Modulation, '256QAM')
60+
elseif strcmp(Modulation_, '256QAM')
5761
Q_m = 8;
5862
else
5963
error('ldpc_3gpp_matlab:UnsupportedParameters','Unsupported modulation');
@@ -66,15 +70,17 @@
6670
methods(Access = protected)
6771

6872
function setupImpl(obj)
69-
if strcmp(obj.Modulation, 'BPSK')
73+
Modulation_ = obj.Modulation;
74+
75+
if strcmp(Modulation_, 'BPSK')
7076
obj.hMod = comm.PSKDemodulator('ModulationOrder',2,'PhaseOffset',pi/4,'BitOutput',true,'DecisionMethod',obj.DecisionMethod,'Variance',obj.Variance);
71-
elseif strcmp(obj.Modulation, 'QPSK')
77+
elseif strcmp(Modulation_, 'QPSK')
7278
obj.hMod = comm.PSKDemodulator('ModulationOrder',4,'PhaseOffset',pi/4,'BitOutput',true,'DecisionMethod',obj.DecisionMethod,'Variance',obj.Variance,'SymbolMapping','Custom','CustomSymbolMapping',[0 2 3 1]);
73-
elseif strcmp(obj.Modulation, '16QAM')
79+
elseif strcmp(Modulation_, '16QAM')
7480
obj.hMod = comm.RectangularQAMDemodulator('ModulationOrder',16,'BitOutput',true,'NormalizationMethod','Average power','DecisionMethod',obj.DecisionMethod,'Variance',obj.Variance,'SymbolMapping','Custom','CustomSymbolMapping',[11,10,14,15,9,8,12,13,1,0,4,5,3,2,6,7]);
75-
elseif strcmp(obj.Modulation, '64QAM')
81+
elseif strcmp(Modulation_, '64QAM')
7682
obj.hMod = comm.RectangularQAMDemodulator('ModulationOrder',64,'BitOutput',true,'NormalizationMethod','Average power','DecisionMethod',obj.DecisionMethod,'Variance',obj.Variance,'SymbolMapping','Custom','CustomSymbolMapping',[47,46,42,43,59,58,62,63,45,44,40,41,57,56,60,61,37,36,32,33,49,48,52,53,39,38,34,35,51,50,54,55,7,6,2,3,19,18,22,23,5,4,0,1,17,16,20,21,13,12,8,9,25,24,28,29,15,14,10,11,27,26,30,31]);
77-
elseif strcmp(obj.Modulation, '256QAM')
83+
elseif strcmp(Modulation_, '256QAM')
7884
obj.hMod = comm.RectangularQAMDemodulator('ModulationOrder',256,'BitOutput',true,'NormalizationMethod','Average power','DecisionMethod',obj.DecisionMethod,'Variance',obj.Variance,'SymbolMapping','Custom','CustomSymbolMapping',[191,190,186,187,171,170,174,175,239,238,234,235,251,250,254,255,189,188,184,185,169,168,172,173,237,236,232,233,249,248,252,253,181,180,176,177,161,160,164,165,229,228,224,225,241,240,244,245,183,182,178,179,163,162,166,167,231,230,226,227,243,242,246,247,151,150,146,147,131,130,134,135,199,198,194,195,211,210,214,215,149,148,144,145,129,128,132,133,197,196,192,193,209,208,212,213,157,156,152,153,137,136,140,141,205,204,200,201,217,216,220,221,159,158,154,155,139,138,142,143,207,206,202,203,219,218,222,223,31,30,26,27,11,10,14,15,79,78,74,75,91,90,94,95,29,28,24,25,9,8,12,13,77,76,72,73,89,88,92,93,21,20,16,17,1,0,4,5,69,68,64,65,81,80,84,85,23,22,18,19,3,2,6,7,71,70,66,67,83,82,86,87,55,54,50,51,35,34,38,39,103,102,98,99,115,114,118,119,53,52,48,49,33,32,36,37,101,100,96,97,113,112,116,117,61,60,56,57,41,40,44,45,109,108,104,105,121,120,124,125,63,62,58,59,43,42,46,47,111,110,106,107,123,122,126,127]);
7985
else
8086
error('ldpc_3gpp_matlab:UnsupportedParameters','Unsupported modulation');

NRLDPC.m

Lines changed: 79 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -319,9 +319,11 @@
319319

320320
% K_cb is calculated in Section 5.2.2 of TS38.212
321321
function K_cb = get.K_cb(obj)
322-
if obj.BG == 1
322+
BG_ = obj.BG;
323+
324+
if BG_ == 1
323325
K_cb = 8448;
324-
elseif obj.BG == 2
326+
elseif BG_ == 2
325327
K_cb = 3840;
326328
else
327329
error('ldpc_3gpp_matlab:UnsupportedParameters','BG must be 1 or 2');
@@ -330,10 +332,14 @@
330332

331333
% C is calculated in Section 5.2.2 of TS38.212
332334
function C = get.C(obj)
333-
if obj.B <= obj.K_cb
335+
B_ = obj.B;
336+
K_cb_ = obj.K_cb;
337+
code_block_L_ = obj.code_block_L;
338+
339+
if B_ <= K_cb_
334340
C = 1;
335341
else
336-
C = ceil(obj.B/(obj.K_cb-obj.code_block_L));
342+
C = ceil(B_/(K_cb_-code_block_L_));
337343
end
338344
end
339345

@@ -358,10 +364,15 @@
358364

359365
% B_prime is calculated in Section 5.2.2 of TS38.212
360366
function B_prime = get.B_prime(obj)
361-
if obj.B <= obj.K_cb
362-
B_prime = obj.B;
367+
B_ = obj.B;
368+
K_cb_ = obj.K_cb;
369+
C_ = obj.C;
370+
code_block_L_ = obj.code_block_L;
371+
372+
if B_ <= K_cb_
373+
B_prime = B_;
363374
else
364-
B_prime = obj.B + obj.C*obj.code_block_L;
375+
B_prime = B_ + C_*code_block_L_;
365376
end
366377
end
367378

@@ -372,16 +383,19 @@
372383

373384
% The calculation of K_b is given in Section 5.2.2 of TS38.212.
374385
function K_b = get.K_b(obj)
375-
if obj.BG == 1
386+
BG_ = obj.BG;
387+
K_prime_ = obj.K_prime;
388+
389+
if BG_ == 1
376390
K_b = 22;
377-
elseif obj.BG == 2
391+
elseif BG_ == 2
378392
% TS38.212 uses B rather than K_prime for the comparisons
379393
% below, but both ways give the same answer in all cases
380-
if obj.K_prime > 640
394+
if K_prime_ > 640
381395
K_b = 10;
382-
elseif obj.K_prime > 560
396+
elseif K_prime_ > 560
383397
K_b = 9;
384-
elseif obj.K_prime > 192
398+
elseif K_prime_ > 192
385399
K_b = 8;
386400
else
387401
K_b = 6;
@@ -398,10 +412,13 @@
398412

399413
% The calculation of K is given in Section 5.2.2 of TS38.212.
400414
function K = get.K(obj)
401-
if obj.BG == 1
402-
K = obj.Z_c*22;
403-
elseif obj.BG == 2
404-
K = obj.Z_c*10;
415+
BG_ = obj.BG;
416+
Z_c_ = obj.Z_c;
417+
418+
if BG_ == 1
419+
K = Z_c_*22;
420+
elseif BG_ == 2
421+
K = Z_c_*10;
405422
else
406423
error('ldpc_3gpp_matlab:UnsupportedParameters','Valid values of BG are 1 and 2.');
407424
end
@@ -424,10 +441,13 @@
424441

425442
% The calculation of N is given in Section 5.3.2 of TS38.212.
426443
function N = get.N(obj)
427-
if obj.BG == 1
428-
N = obj.Z_c*66;
429-
elseif obj.BG == 2
430-
N = obj.Z_c*50;
444+
BG_ = obj.BG;
445+
Z_c_ = obj.Z_c;
446+
447+
if BG_ == 1
448+
N = Z_c_*66;
449+
elseif BG_ == 2
450+
N = Z_c_*50;
431451
else
432452
error('ldpc_3gpp_matlab:UnsupportedParameters','Valid values of BG are 1 and 2.');
433453
end
@@ -449,8 +469,11 @@
449469
end
450470

451471
function CBGTI_flags = get.CBGTI_flags(obj)
452-
CBGTI_flags = ones(1,obj.C);
453-
CBGTI_flags(obj.CBGTI(obj.CBGTI<obj.C)+1) = 0;
472+
C_ = obj.C;
473+
CBGTI_ = obj.CBGTI;
474+
475+
CBGTI_flags = ones(1,C_);
476+
CBGTI_flags(CBGTI_(CBGTI_<C_)+1) = 0;
454477
end
455478

456479
% The calculation of C_prime is given in Section 5.4.2.1 of TS38.212.
@@ -460,16 +483,23 @@
460483

461484
% The calculation of E_r is given in Section 5.4.2.1 of TS38.212.
462485
function E_r = get.E_r(obj)
486+
C_ = obj.C;
487+
C_prime_ = obj.C_prime;
488+
CBGTI_flags_ = obj.CBGTI_flags;
489+
G_ = obj.G;
490+
N_L_ = obj.N_L;
491+
Q_m_ = obj.Q_m;
492+
463493
j=0;
464-
E_r = zeros(1,obj.C);
465-
for r = 0:obj.C-1
466-
if obj.CBGTI_flags(r+1) == 0
494+
E_r = zeros(1,C_);
495+
for r = 0:C_-1
496+
if CBGTI_flags_(r+1) == 0
467497
E_r(r+1) = 0;
468498
else
469-
if j <= obj.C_prime-mod(obj.G/(obj.N_L*obj.Q_m),obj.C_prime)-1
470-
E_r(r+1) = obj.N_L*obj.Q_m*floor(obj.G/(obj.N_L*obj.Q_m*obj.C_prime));
499+
if j <= C_prime_-mod(G_/(N_L_*Q_m_),C_prime_)-1
500+
E_r(r+1) = N_L_*Q_m_*floor(G_/(N_L_*Q_m_*C_prime_));
471501
else
472-
E_r(r+1) = obj.N_L*obj.Q_m*ceil(obj.G/(obj.N_L*obj.Q_m*obj.C_prime));
502+
E_r(r+1) = N_L_*Q_m_*ceil(G_/(N_L_*Q_m_*C_prime_));
473503
end
474504
j = j + 1;
475505
end
@@ -478,27 +508,32 @@
478508

479509
% The calculation of k_0 is given in Table 5.4.2.1-2 of TS38.212.
480510
function k_0 = get.k_0(obj)
481-
if obj.BG == 1
482-
if obj.rv_id == 0
511+
BG_ = obj.BG;
512+
rv_id_ = obj.rv_id;
513+
N_cb_ = obj.N_cb;
514+
Z_c_ = obj.Z_c;
515+
516+
if BG_ == 1
517+
if rv_id_ == 0
483518
k_0 = 0;
484-
elseif obj.rv_id == 1
485-
k_0 = floor((17*obj.N_cb)/(66*obj.Z_c))*obj.Z_c;
486-
elseif obj.rv_id == 2
487-
k_0 = floor((33*obj.N_cb)/(66*obj.Z_c))*obj.Z_c;
488-
elseif obj.rv_id == 3
489-
k_0 = floor((56*obj.N_cb)/(66*obj.Z_c))*obj.Z_c;
519+
elseif rv_id_ == 1
520+
k_0 = floor((17*N_cb_)/(66*Z_c_))*Z_c_;
521+
elseif rv_id_ == 2
522+
k_0 = floor((33*N_cb_)/(66*Z_c_))*Z_c_;
523+
elseif rv_id_ == 3
524+
k_0 = floor((56*N_cb_)/(66*Z_c_))*Z_c_;
490525
else
491526
error('ldpc_3gpp_matlab:UnsupportedParameters','Valid values of rv_id are 0, 1, 2 and 3.')
492527
end
493-
elseif obj.BG == 2
494-
if obj.rv_id == 0
528+
elseif BG_ == 2
529+
if rv_id_ == 0
495530
k_0 = 0;
496-
elseif obj.rv_id == 1
497-
k_0 = floor((13*obj.N_cb)/(50*obj.Z_c))*obj.Z_c;
498-
elseif obj.rv_id == 2
499-
k_0 = floor((25*obj.N_cb)/(50*obj.Z_c))*obj.Z_c;
500-
elseif obj.rv_id == 3
501-
k_0 = floor((43*obj.N_cb)/(50*obj.Z_c))*obj.Z_c;
531+
elseif rv_id_ == 1
532+
k_0 = floor((13*N_cb_)/(50*Z_c_))*Z_c_;
533+
elseif rv_id_ == 2
534+
k_0 = floor((25*N_cb_)/(50*Z_c_))*Z_c_;
535+
elseif rv_id_ == 3
536+
k_0 = floor((43*N_cb_)/(50*Z_c_))*Z_c_;
502537
else
503538
error('ldpc_3gpp_matlab:UnsupportedParameters','Valid values of rv_id are 0, 1, 2 and 3.')
504539
end

0 commit comments

Comments
 (0)