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