IT++ Logo Newcom Logo

spread.cpp

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

Generated on Wed Mar 21 12:21:45 2007 for IT++ by Doxygen 1.4.7