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