00001 00029 #include <itpp/comm/hammcode.h> 00030 #include <itpp/base/math/log_exp.h> 00031 #include <itpp/base/converters.h> 00032 00033 00034 namespace itpp 00035 { 00036 00037 Hamming_Code::Hamming_Code(int 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 int i, j, NextPos; 00050 char NotUsed; 00051 bvec temp; 00052 ivec 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 int 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 ivec Hindexes(n); 00114 bvec temp(n - k); 00115 bvec coded(n), syndrome(n - k); 00116 int 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 &, bvec &) 00151 { 00152 it_error("Hamming_Code::decode(vec, bvec); soft-decision decoding is not implemented"); 00153 } 00154 00155 bvec Hamming_Code::decode(const vec &) 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 Jul 9 2011 15:21:31 for IT++ by Doxygen 1.7.4