IT++ Logo

spread.cpp

Go to the documentation of this file.
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
SourceForge Logo

Generated on Thu Apr 23 20:07:46 2009 for IT++ by Doxygen 1.5.8