forked from talenik/YALDPC
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbenchmarkDecoder.m
100 lines (76 loc) · 2.26 KB
/
benchmarkDecoder.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
%This file runs a benchmark for the QCLDPCDecode() function or toolbox
%ldpcDecode() so you need to have Communications Toolbox installed.
%Also you need to have MEX configured properly first.
clear ;
format compact ;
path( './lib', path ) ;
path( './MEX', path ) ;
%only need to modify these values ----------------------------------------
R = 5 / 6 ;
N = 2304 ;
test = 'COM' ; % 'MEX' or Toolbox 'COM' decoder
nIter = 10 ;
N_TH = 32 % nr. of MEX decoer threads
blocksize = 10 * N_TH ;
cycles = 100 ;
%only need to modify these values ----------------------------------------
cod = loadQCLDPC( 'wimax', R, N ) ;
%MEX implementation
enc = QCLDPCEncode() ;
dec = QCLDPCDecode() ;
dec.method = 'float' ; % 'fixed or 'float'
dec.build = 'release' ;
dec.dbglev = 1 ;
dec.nIter = nIter ;
dec.term = 'max' ;
dec.nthread = N_TH ;
dec = QCLDPCDecode( dec ) ;
saveLDPCheader( 'ldpc', cod, enc, dec, 'MEX' ) ;
if strcmp( test, 'MEX' )
buildMEXfile( dec ) ;
end
%MATLAB communications system toolbox encoder
COMdec = ldpcDecoderConfig( logical( cod.Hs ) ) ;
COMenc = ldpcEncoderConfig( COMdec ) ;
if strcmp( test, 'COM' )
COMdec.Algorithm = 'norm-min-sum' ;
COMdec
else
cod
dec
end
Data = randui( cod.K, blocksize ) ;
CW = ldpcEncode( logical( Data ), COMenc ) ;
varCh = 0.01 ;
sigma = sqrt( varCh ) ;
TxBlock = -2 * CW + 1 ; % another BPSK modulated 0 > +1, 1 > -1
Noise = sigma * randn( size( TxBlock ) ) ;
RxBlock = TxBlock + Noise ;
LLRch = ( 2 / varCh ) .* RxBlock ;
ITE = 0 ;
tstart = tic ;
disp( [ 'Starting benchmark... ' ] ) ;
for c = 1 : cycles
if strcmp( test, 'COM' )
[ HD2, Iter1, ApLLR2 ] = ldpcDecode( LLRch, COMdec, nIter, ...
Multithreaded = N_TH > 1, Termination = 'max' ) ;
else
[ ApLLR, Iter1 ] = QCLDPCDecode( LLRch, dec ) ;
if( nnz( Iter1 < 0 ) > 0 )
disp("Threading errors.") ;
end
end
if mod( c, 100 ) == 0
c
end
ITE = ITE + sum( Iter1 ) ;
end
telapsed = toc( tstart ) ;
avgIter = ITE / ( cycles * blocksize )
tstr = datestr( datenum( 0, 0, 0, 0, 0, telapsed ), "HH:MM:SS" )
Bits = cod.K * blocksize * cycles
ThP = 1e-6 * Bits / telapsed ; % Mbps
disp( [ 'Bits: ' num2str(Bits) ' Throughtput: ' num2str( ThP ) ' Mbps' ] ) ;
if exist('QCLDPCDecodeMEX_MTX')
QCLDPCDecodeMEX_MTX() ; % cleanup - end all worker threads
end