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