IT++ Logo
spread.cpp
Go to the documentation of this file.
00001 
00029 #include <itpp/comm/spread.h>
00030 #include <itpp/base/converters.h>
00031 #include <itpp/stat/misc_stat.h>
00032 
00033 
00034 namespace itpp
00035 {
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
SourceForge Logo

Generated on Wed Jul 27 2011 16:27:05 for IT++ by Doxygen 1.7.4