00001 00030 #include <itpp/comm/spread.h> 00031 #include <itpp/base/converters.h> 00032 #include <itpp/stat/misc_stat.h> 00033 00034 00035 namespace itpp 00036 { 00037 00038 //------------- Spread1d ------------------- 00039 00040 Spread_1d::Spread_1d(const vec &incode) 00041 { 00042 set_code(incode); 00043 } 00044 00045 void Spread_1d::set_code(const vec &incode) 00046 { 00047 N = incode.size(); 00048 code = incode; 00049 code /= norm(code); 00050 } 00051 00052 vec Spread_1d::get_code() 00053 { 00054 return code; 00055 } 00056 00057 void Spread_1d::spread(const vec &symbols, vec &out) 00058 { 00059 out.set_size(symbols.length()*N, false); 00060 00061 for (int i = 0;i < symbols.length();i++) 00062 out.replace_mid(i*N, symbols(i)*code); 00063 } 00064 00065 void Spread_1d::despread(const vec &rec_signal, vec &out, int timing) 00066 { 00067 int nosymbols = (int)std::floor(double((rec_signal.length() - timing)) / N); 00068 out.set_size(nosymbols); 00069 00070 for (int i = 0;i < nosymbols;i++) 00071 out(i) = rec_signal.mid(i * N + timing, N) * code; 00072 } 00073 00074 00075 //---------------- Spread2d ---------------------- 00076 00077 vec Spread_2d::get_codeI() 00078 { 00079 return spreadI.get_code(); 00080 } 00081 00082 vec Spread_2d::get_codeQ() 00083 { 00084 return spreadQ.get_code(); 00085 } 00086 00087 Spread_2d::Spread_2d(const vec &incodeI, const vec &incodeQ) 00088 { 00089 set_code(incodeI, incodeQ); 00090 } 00091 00092 void Spread_2d::set_code(const vec &incodeI, const vec &incodeQ) 00093 { 00094 it_assert(incodeI.length() == incodeQ.length(), "Size of I and Q codes doesn't match"); 00095 spreadI.set_code(incodeI); 00096 spreadQ.set_code(incodeQ); 00097 } 00098 00099 void Spread_2d::spread(const cvec &symbols, cvec &out) 00100 { 00101 out = to_cvec(spreadI.spread(real(symbols)), spreadQ.spread(imag(symbols))); 00102 } 00103 00104 void Spread_2d::despread(const cvec &rec_signal, cvec &out, int timing) 00105 { 00106 out = to_cvec(spreadI.despread(real(rec_signal), timing), spreadQ.despread(imag(rec_signal), timing)); 00107 } 00108 00109 00110 00111 //------------- Multicode_Spread_1d ---------------- 00112 00113 00114 Multicode_Spread_1d::Multicode_Spread_1d(const mat &incodes) 00115 { 00116 set_codes(incodes); 00117 } 00118 00119 void Multicode_Spread_1d::set_codes(const mat &incodes) 00120 { 00121 codes = incodes; 00122 N = incodes.cols(); 00123 L = incodes.rows(); 00124 for (int i = 0; i < L; i++) 00125 codes.set_row(i, codes.get_row(i) / norm(codes.get_row(i))); 00126 } 00127 00128 mat Multicode_Spread_1d::get_codes() 00129 { 00130 return codes; 00131 } 00132 00133 vec Multicode_Spread_1d::spread(const vec &symbols) 00134 { 00135 int i; 00136 int nomcsymbols = (int)std::floor(double(symbols.length() / L)); 00137 vec temp(nomcsymbols*N); 00138 00139 for (i = 0;i < nomcsymbols;i++) { 00140 temp.replace_mid(i*N, codes.T() * symbols.mid(i*L, L)); // TODO: this is now very slow 00141 } 00142 00143 return temp; 00144 } 00145 00146 vec Multicode_Spread_1d::despread(const vec &receivedsignal, int timing) 00147 { 00148 int i; 00149 int nosymbols = (int)std::floor(double((receivedsignal.length() - timing)) / N); 00150 vec temp(nosymbols*L); 00151 00152 for (i = 0;i < nosymbols;i++) { 00153 temp.replace_mid(i*L, codes*receivedsignal.mid(i*N + timing, N)); 00154 } 00155 return temp; 00156 } 00157 00158 00159 //----------------- Multicode_Spread_2d ------------------- 00160 00161 00162 Multicode_Spread_2d::Multicode_Spread_2d(const mat &incodesI, const mat &incodesQ) 00163 { 00164 set_codes(incodesI, incodesQ); 00165 } 00166 00167 mat Multicode_Spread_2d::get_codesI() 00168 { 00169 return mcspreadI.get_codes(); 00170 } 00171 00172 mat Multicode_Spread_2d::get_codesQ() 00173 { 00174 return mcspreadQ.get_codes(); 00175 } 00176 00177 void Multicode_Spread_2d::set_codes(const mat &incodesI, const mat &incodesQ) 00178 { 00179 it_assert(incodesI.rows() == incodesQ.rows() && incodesI.cols() == incodesQ.cols(), 00180 "Multicode_Spread_2d::set_codes(): dimension mismatch"); 00181 mcspreadI.set_codes(incodesI); 00182 mcspreadQ.set_codes(incodesQ); 00183 } 00184 00185 cvec Multicode_Spread_2d::spread(const cvec &symbols) 00186 { 00187 return to_cvec(mcspreadI.spread(real(symbols)), mcspreadQ.spread(imag(symbols))); 00188 } 00189 00190 cvec Multicode_Spread_2d::despread(const cvec &receivedsignal, int timing) 00191 { 00192 return to_cvec(mcspreadI.despread(real(receivedsignal), timing), mcspreadQ.despread(imag(receivedsignal), timing)); 00193 } 00194 00195 } // namespace itpp
Generated on Thu Apr 23 20:06:42 2009 for IT++ by Doxygen 1.5.8