File: CreateDvbPuncturingPattern.m

package info (click to toggle)
codec2 1.2.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 76,376 kB
  • sloc: ansic: 436,819; cpp: 2,091; objc: 1,736; sh: 1,510; python: 1,405; asm: 683; makefile: 605
file content (60 lines) | stat: -rw-r--r-- 2,534 bytes parent folder | download | duplicates (3)
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
function pun_pattern = CreateDvbPuncturingPattern( Nbits_pun, Nbits_unpun )
% CreateDvbPuncturingPattern creates the puncturing pattern for use with the duobinary
% tailbiting turbo code from the DVB-RCS standard.
%
% The calling syntax is:
%     pun_pattern = CreateDvbPuncturingPattern( Nbits_pun, Nbits_unpun )
%
%     pun_pattern = the puncturing pattern (length Nbits_pun vector)
%
%     Nbits_pun = the number of bits after puncturing
%     Nbits_unpun = the number of bits prior to puncturing 
%
% Copyright (C) 2007, Matthew C. Valenti and Shi Cheng
%
% Last updated on Oct. 12, 2007
%
% Function CreateDvbPuncturingPattern is part of the Iterative Solutions Coded Modulation
% Library (ISCML).  
%
% The Iterative Solutions Coded Modulation Library is free software;
% you can redistribute it and/or modify it under the terms of 
% the GNU Lesser General Public License as published by the 
% Free Software Foundation; either version 2.1 of the License, 
% or (at your option) any later version.
%
% This library is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
% Lesser General Public License for more details.
%
% You should have received a copy of the GNU Lesser General Public
% License along with this library; if not, write to the Free Software
% Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
% USA

N = Nbits_unpun/6; 

if ( abs( Nbits_pun - ceil( N/(1/3) ) * 2 ) < 1E-5)
    pun_pattern = 1:Nbits_pun;
elseif ( abs( Nbits_pun - ceil( N/(2/5) ) * 2 ) < 1E-5)
    t = reshape( [ [1:2:N]*2-1 ; [1:2:N]*2], 1, N);
    pun_pattern = [1:4*N, 4*N+t];
elseif ( abs( Nbits_pun - ceil( N/(1/2) ) * 2 ) < 1E-5)
    pun_pattern = 1:Nbits_pun;
elseif ( abs( Nbits_pun - ceil( N/(2/3) ) * 2 ) < 1E-5)
    t = reshape( [ [1:2:N]*2-1 ; [1:2:N]*2], 1, N);
    pun_pattern = [1:2*N, 2*N+t];
elseif ( abs( Nbits_pun - ceil( N/(3/4) ) * 2 ) < 1E-5)
    t = reshape( [ [1:3:N]*2-1 ; [1:3:N]*2], 1, Nbits_pun-2*N);
    pun_pattern = [1:2*N, 2*N+t];
elseif ( abs( Nbits_pun - ceil( N/(4/5) ) * 2 ) < 1E-5)  
    t = reshape( [ [1:4:N]*2-1 ; [1:4:N]*2], 1, Nbits_pun-2*N);
    pun_pattern = [1:2*N, 2*N+t];
elseif ( abs( Nbits_pun - ceil( N/(6/7) ) * 2 ) < 1E-5)
    t = reshape( [ [1:6:N]*2-1 ; [1:6:N]*2], 1, Nbits_pun-2*N);
    pun_pattern = [1:2*N, 2*N+t];
else
    disp('DVB interleaver: Wrong punctured size');
end