summaryrefslogtreecommitdiff
path: root/macros/iscatastrophic.sci
blob: 2dc1ad919ad7d1b83ed96b87bff6d3bfaed20e06 (plain)
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
function result = iscatastrophic(trellis)
//   This function  determines if a convolutional code is catastrophic or not
//   Calling Sequence
//   RESULT = ISCATASTROPHIC(TRELLIS)
//   Description
//   RESULT = ISCATASTROPHIC(TRELLIS) returns 1 if the specified 
//   trellis corresponds to a catastrophic convolutional code, else 0.
//   Examples 
//   eg_1.numInputSymbols = 4;
//   eg_1.numOutputSymbols = 4;
//   eg_1.numStates = 3;
//   eg_1.nextStates = [0 1 2 1;0 1 2 1; 0 1 2 1];
//   eg_1.outputs = [0 0 1 1;1 1 2 1; 1 0 1 1];
//   res_t_eg_1=istrellis(eg_1)
//   res_c_eg_1=iscatastrophic(eg_1)
//   if (res_c_eg_1) then
//       disp('Example 1 is catastrophic')
//   else
//       disp('Example 1 is not catastrophic')
//   end
//   eg_2.numInputSymbols = 2;
//   eg_2.numOutputSymbols = 4;
//   eg_2.numStates = 2;
//   eg_2.nextStates = [0 0; 1 1 ]
//   eg_2.outputs = [0 0; 1 1];
//   res_t_eg_2=istrellis(eg_2)
//   res_c_eg_2=iscatastrophic(eg_2)
//   if (res_c_eg_2) then
//       disp('Example 2 is catastrophic')
//   else
//       disp('Example 2 is not catastrophic')
//   end 
//   Authors
//   Pola Lakshmi Priyanka, IIT Bombay

//*************************************************************************************************************************************//

// Check number of input arguments
[out_a,inp_a]=argn(0)

if inp_a~=1 then
    error('comm:iscatastrophic: Invalid number of input arguments')
end


if out_a>1 then
    error('comm:iscatastrophic: Invalid number of output arguments')
end

// Check if the input is a valid trellis
if ~istrellis(trellis),
    error('comm:iscatastrophic:Input should be a valid trellis structure.');  
end

result = 0;

// Find indices of zeros in trellis structure
[r_idx,c_idx] = find(trellis.outputs==0);

//Find Connectivity matrix and check if it is catastrophic
A = zeros(trellis.numStates,trellis.numStates);
for k = 2:length(r_idx)
    A(r_idx(k),trellis.nextStates(r_idx(k),c_idx(k))+1)=1;
end


test = A;
for i = 1:trellis.numStates
    for j = 1:trellis.numStates
        if test(j,j)==1
            result = 1
        end
    end
    if result==1
        break
    else
        test = test*A;
    end
end

endfunction