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 //------------- 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
SourceForge Logo

Generated on Sat Apr 19 11:01:26 2008 for IT++ by Doxygen 1.5.5