00001 00030 #include <itpp/comm/hammcode.h> 00031 #include <itpp/base/math/log_exp.h> 00032 #include <itpp/base/converters.h> 00033 00034 00035 namespace itpp { 00036 00037 Hamming_Code::Hamming_Code(short m) 00038 { 00039 n = pow2i(m) - 1; 00040 k = pow2i(m) - m - 1; 00041 H.set_size(n-k, n); 00042 G.set_size(k, n); 00043 generate_H(); // generate_H must be run before generate_G 00044 generate_G(); 00045 } 00046 00047 void Hamming_Code::generate_H(void) 00048 { 00049 short i, j, NextPos; 00050 char NotUsed; 00051 bvec temp; 00052 svec indexes(n); 00053 indexes.zeros(); 00054 00055 for (i=1; i<=n-k; i++) { indexes(i-1) = pow2i(n-k-i); } 00056 NextPos = n-k; 00057 for (i=1; i<=n; i++) { 00058 NotUsed = 1; 00059 for (j=0; j<n; j++) 00060 if (i == indexes(j)) { NotUsed = 0; } 00061 if (NotUsed) { indexes(NextPos) = i; NextPos = NextPos + 1; } 00062 } 00063 00064 for (i=0; i<n; i++) { 00065 temp = dec2bin(n-k,indexes(i)); //<-CHECK THIS OUT!!!! 00066 for (j = 0; j < (n-k); j++) { 00067 H(j,i) = temp(j); 00068 } 00069 } 00070 } 00071 00072 void Hamming_Code::generate_G(void) 00073 { 00074 short i, j; 00075 for (i=0; i<k; i++) { 00076 for(j=0; j<n-k; j++) 00077 G(i,j) = H(j,i+n-k); 00078 } 00079 00080 for (i=0; i<k; i++) { 00081 for (j=n-k; j<n; j++) 00082 G(i,j) = 0; 00083 } 00084 00085 for (i=0; i<k; i++) 00086 G(i,i+n-k) = 1; 00087 } 00088 00089 void Hamming_Code::encode(const bvec &uncoded_bits, bvec &coded_bits) 00090 { 00091 int length = uncoded_bits.length(); 00092 int Itterations = floor_i(static_cast<double>(length) / k); 00093 bmat Gt = G.T(); 00094 int i; 00095 00096 coded_bits.set_size(Itterations * n, false); 00097 //Code all codewords 00098 for (i=0; i<Itterations; i++) 00099 coded_bits.replace_mid(n*i, Gt * uncoded_bits.mid(i*k,k) ); 00100 } 00101 00102 bvec Hamming_Code::encode(const bvec &uncoded_bits) 00103 { 00104 bvec coded_bits; 00105 encode(uncoded_bits, coded_bits); 00106 return coded_bits; 00107 } 00108 00109 void Hamming_Code::decode(const bvec &coded_bits, bvec &decoded_bits) 00110 { 00111 int length = coded_bits.length(); 00112 int Itterations = floor_i(static_cast<double>(length) / n); 00113 svec Hindexes(n); 00114 bvec temp(n-k); 00115 bvec coded(n), syndrome(n-k); 00116 short isynd, errorpos=0; 00117 int i, j; 00118 00119 decoded_bits.set_size(Itterations*k, false); 00120 00121 for (i=0; i<n; i++) { 00122 for (j=0; j<n-k; j++) 00123 temp(j) = H(j,i); 00124 Hindexes(i) = bin2dec(temp); 00125 } 00126 00127 //Decode all codewords 00128 for (i=0; i<Itterations; i++) { 00129 coded = coded_bits.mid(i*n,n); 00130 syndrome = H * coded; 00131 isynd = bin2dec(syndrome); 00132 if (isynd != 0) { 00133 for (j=0; j<n; j++) 00134 if (Hindexes(j) == isynd) { errorpos = j; }; 00135 coded(errorpos) += 1; 00136 } 00137 decoded_bits.replace_mid(k*i,coded.right(k)); 00138 } 00139 } 00140 00141 bvec Hamming_Code::decode(const bvec &coded_bits) 00142 { 00143 bvec decoded_bits; 00144 decode(coded_bits, decoded_bits); 00145 return decoded_bits; 00146 } 00147 00148 00149 // -------------- Soft-decision decoding is not implemented ---------------- 00150 void Hamming_Code::decode(const vec &received_signal, bvec &output) 00151 { 00152 it_error("Hamming_Code::decode(vec, bvec); soft-decision decoding is not implemented"); 00153 } 00154 00155 bvec Hamming_Code::decode(const vec &received_signal) 00156 { 00157 it_error("Hamming_Code::decode(vec, bvec); soft-decision decoding is not implemented"); 00158 return bvec(); 00159 } 00160 00161 00162 } // namespace itpp
Generated on Sat Apr 19 11:01:25 2008 for IT++ by Doxygen 1.5.5