IT++ Logo
channel.h
Go to the documentation of this file.
1
29#ifndef CHANNEL_H
30#define CHANNEL_H
31
32#include <iostream>
34#include <itpp/base/mat.h>
35#include <itpp/base/array.h>
36#include <itpp/base/random.h>
37#include <itpp/signal/filter.h>
38#include <itpp/itexports.h>
39
186namespace itpp
187{
188
190
191
194 ITU_Vehicular_A, ITU_Vehicular_B, ITU_Pedestrian_A, ITU_Pedestrian_B,
195 COST207_RA, COST207_RA6,
196 COST207_TU, COST207_TU6alt, COST207_TU12, COST207_TU12alt,
197 COST207_BU, COST207_BU6alt, COST207_BU12, COST207_BU12alt,
198 COST207_HT, COST207_HT6alt, COST207_HT12, COST207_HT12alt,
199 COST259_TUx, COST259_RAx, COST259_HTx
200};
201
203enum FADING_TYPE { Independent, Static, Correlated };
204
206enum CORRELATED_METHOD { Rice_MEDS, IFFT, FIR };
207
209enum RICE_METHOD { MEDS };
210
213 Jakes = 0, J = 0, Classic = 0, C = 0,
214 GaussI = 1, Gauss1 = 1, GI = 1, G1 = 1,
215 GaussII = 2, Gauss2 = 2, GII = 2, G2 = 2
216};
217
218
228class ITPP_EXPORT Fading_Generator
229{
230public:
234 virtual ~Fading_Generator() {}
235
237 void set_LOS_power(double relative_power);
239 virtual void set_LOS_doppler(double relative_doppler);
241 virtual void set_time_offset(int offset);
243 virtual void set_filter_length(int filter_length);
245 virtual void set_norm_doppler(double norm_doppler);
247 virtual void set_doppler_spectrum(DOPPLER_SPECTRUM spectrum);
249 virtual void set_no_frequencies(int no_freq);
251 virtual void set_rice_method(RICE_METHOD method);
252
254 double get_LOS_power() const { return los_power; }
256 virtual double get_LOS_doppler() const;
258 virtual double get_time_offset() const;
260 virtual int get_filter_length() const;
262 virtual double get_norm_doppler() const;
264 virtual DOPPLER_SPECTRUM get_doppler_spectrum() const;
266 virtual int get_no_frequencies() const;
268 virtual RICE_METHOD get_rice_method() const;
269
271 virtual void shift_time_offset(int no_samples);
272
274 virtual void init() = 0;
275
277 virtual void generate(int no_samples, cvec &output) = 0;
279 cvec generate(int no_samples);
280
281protected:
283 double los_power;
284 double los_diffuse;
285 double los_direct;
286};
287
289
290#if (!defined(_MSC_VER) || (defined(_MSC_VER) && defined (ITPP_SHARED_LIB)))
291//define two input stream operators for data types involved
292//otherwise explicit instantiation of Array is impossible
293inline std::istream& operator>>(std::istream& is, Fading_Generator* &pfg)
294{
295 void* p;
296 is >> p;
297 if(is) pfg = (Fading_Generator*)p;
298 return is;
299}
300
301inline std::istream& operator>>(std::istream& is, DOPPLER_SPECTRUM& sp)
302{
303 int val;
304 is >> val;
305 if(!is) return is;
306 if(val > 0 && val <= G2) sp = (DOPPLER_SPECTRUM)val;
307 else is.setstate(std::ios_base::failbit);
308 return is;
309}
310
311//MSVC explicitly instantiate required template while building the shared library
312#ifdef _WIN32
313template class ITPP_EXPORT Array<DOPPLER_SPECTRUM>;
314template class ITPP_EXPORT Array<Fading_Generator*>;
315#endif
316#endif
317
319
329{
330public:
335
337 virtual void init() { init_flag = true; }
338
340
342 virtual void generate(int no_samples, cvec& output);
343};
344
345
356{
357public:
362
364 virtual void init();
365
367
369 virtual void generate(int no_samples, cvec& output);
370
371protected:
374 double static_sample_im;
375};
376
377
391{
392public:
394 Correlated_Fading_Generator(double norm_doppler);
397
399 virtual void set_norm_doppler(double norm_doppler);
401 virtual void set_LOS_doppler(double relative_doppler);
403 virtual void set_time_offset(int offset);
404
406 virtual double get_norm_doppler() const { return n_dopp; }
408 virtual double get_LOS_doppler() const { return los_dopp; }
410 virtual double get_time_offset() const { return time_offset; }
411
413 virtual void shift_time_offset(int no_samples);
414
416 virtual void init() = 0;
417
419
421 virtual void generate(int no_samples, cvec& output) = 0;
422
423protected:
424 double n_dopp;
425 double los_dopp;
426 double time_offset;
427
429 void add_LOS(int idx, std::complex<double>& sample);
430};
431
432
468{
469public:
471 Rice_Fading_Generator(double norm_doppler, DOPPLER_SPECTRUM spectrum = Jakes,
472 int no_freq = 16, RICE_METHOD method = MEDS);
475
477 virtual void set_doppler_spectrum(DOPPLER_SPECTRUM spectrum);
479 virtual void set_no_frequencies(int no_freq);
481 virtual void set_rice_method(RICE_METHOD method);
482
484 virtual DOPPLER_SPECTRUM get_doppler_spectrum() const { return dopp_spectrum; }
486 virtual int get_no_frequencies() const { return Ni; }
488 virtual RICE_METHOD get_rice_method() const { return rice_method; }
489
491 virtual void init();
492
494
496 virtual void generate(int no_samples, cvec &output);
497
498protected:
501 int Ni;
506 vec f1, f2, c1, c2, th1, th2;
510 double f01, f02;
514 void init_MEDS();
515};
516
517
537{
538public:
540 FIR_Fading_Generator(double norm_doppler, int filter_length = 500);
543
545 virtual void set_filter_length(int filter_length);
547 virtual int get_filter_length() const { return fir_length; }
548
550 virtual void init();
551
553
555 virtual void generate(int no_samples, cvec &output);
556
557protected:
561 MA_Filter<std::complex<double>, double, std::complex<double> > fir_filter;
563
574 vec Jakes_filter(double norm_dopp, int order = 100);
575};
576
577
603{
604public:
606 IFFT_Fading_Generator(double norm_doppler) :
607 Correlated_Fading_Generator(norm_doppler) {}
610
612 virtual void init() { init_flag = true; }
613
614 using Correlated_Fading_Generator::generate;
615
617 virtual void generate(int no_samples, cvec &output);
618
619protected:
621 void generate_Jakes(int no_samples, cvec &output);
622};
623
624
696class ITPP_EXPORT Channel_Specification
697{
698public:
700 Channel_Specification(const vec &avg_power_dB = "0", const vec &delay_prof = "0");
705
707 void set_channel_profile(const vec &avg_power_dB, const vec &delay_prof);
709 void set_channel_profile(const CHANNEL_PROFILE profile);
710
712 void set_doppler_spectrum(DOPPLER_SPECTRUM *tap_spectrum);
714 void set_doppler_spectrum(int tap_number, DOPPLER_SPECTRUM tap_spectrum);
715
717 void set_LOS(int tap_number, double relative_power, double relative_doppler = 0.7);
719 void set_LOS(const vec& relative_power, const vec& relative_doppler = "");
720
722 void get_channel_profile(vec &avg_power_dB, vec &delay_prof) const;
724 vec get_avg_power_dB() const { return a_prof_dB; }
726 vec get_delay_prof() const { return d_prof; }
728 Array<DOPPLER_SPECTRUM> get_doppler_spectrum() const { return tap_doppler_spectrum; }
730 DOPPLER_SPECTRUM get_doppler_spectrum(int index) const;
732 vec get_LOS_power() const { return los_power; }
734 vec get_LOS_doppler() const { return los_dopp; }
736 double get_LOS_power(int tap_number) const { return los_power(tap_number); }
738 double get_LOS_doppler(int tap_number) const { return los_dopp(tap_number); }
739
741 int taps() const { return N_taps; }
742
744 double calc_mean_excess_delay() const;
746 double calc_rms_delay_spread() const;
747
748protected:
750 vec d_prof;
752 int N_taps;
755};
756
757
857class ITPP_EXPORT TDL_Channel
858{
859public:
861 TDL_Channel(const vec &avg_power_dB = "0", const ivec &delay_prof = "0");
863 TDL_Channel(const Channel_Specification &channel_spec, double sampling_time);
865 virtual ~TDL_Channel();
866
868 void set_channel_profile(const vec &avg_power_dB, const ivec &delay_prof);
870 void set_channel_profile_uniform(int no_taps);
872 void set_channel_profile_exponential(int no_taps);
874 void set_channel_profile(const Channel_Specification &channel_spec, double sampling_time);
875
877 void set_correlated_method(CORRELATED_METHOD method);
879 void set_fading_type(FADING_TYPE fading_type);
880
882 void set_norm_doppler(double norm_doppler);
883
885 void set_LOS(const vec& relative_power, const vec& relative_doppler = "");
887 void set_LOS_power(const vec& relative_power);
889 void set_LOS_doppler(const vec& relative_doppler);
890
892 void set_doppler_spectrum(const DOPPLER_SPECTRUM *tap_spectrum);
894 void set_doppler_spectrum(int tap_number, DOPPLER_SPECTRUM tap_spectrum);
896 void set_no_frequencies(int no_freq);
897
899 void set_time_offset(int offset);
901 void shift_time_offset(int no_samples);
902
904 void set_filter_length(int filter_length);
905
906
908 int taps() const { return N_taps; }
909
911 void get_channel_profile(vec &avg_power_dB, ivec &delay_prof) const;
913 vec get_avg_power_dB() const;
915 ivec get_delay_prof() const { return d_prof; }
916
918 CORRELATED_METHOD get_correlated_method() const { return method; }
920 FADING_TYPE get_fading_type() const { return fading_type; }
921
923 double get_norm_doppler() const { return n_dopp; }
924
926 vec get_LOS_power() const { return los_power; }
928 vec get_LOS_doppler() const { return los_dopp; }
930 double get_LOS_power(int tap_number) const { return los_power(tap_number); }
932 double get_LOS_doppler(int tap_number) const { return los_dopp(tap_number); }
933
935 int get_no_frequencies() const { return nrof_freq; }
936
938 double get_time_offset() const;
939
941 double calc_mean_excess_delay() const;
943 double calc_rms_delay_spread() const;
944
946 void init();
947
949 void generate(int no_samples, Array<cvec> &channel_coeff);
951 void generate(int no_samples, cmat &channel_coeff);
952
954 void filter_known_channel(const cvec &input, cvec &output, const Array<cvec> &channel_coeff);
956 void filter_known_channel(const cvec &input, cvec &output, const cmat &channel_coeff);
957
959 void filter(const cvec &input, cvec &output, Array<cvec> &channel_coeff);
961 void filter(const cvec &input, cvec &output, cmat &channel_coeff);
963 cvec filter(const cvec &input, Array<cvec> &channel_coeff);
965 cvec filter(const cvec &input, cmat &channel_coeff);
967 void filter(const cvec &input, cvec &output);
969 cvec filter(const cvec &input);
970
972 void operator()(const cvec &input, cvec &output, Array<cvec> &channel_coeff);
974 void operator()(const cvec &input, cvec &output, cmat &channel_coeff);
976 cvec operator()(const cvec &input, Array<cvec> &channel_coeff);
978 cvec operator()(const cvec &input, cmat &channel_coeff);
980 cvec operator()(const cvec &input);
981
983 void calc_impulse_response(const Array<cvec> &channel_coeff, Array<cvec> &impulse_response);
984
986 void calc_frequency_response(const Array<cvec> &channel_coeff, Array<cvec> &frequency_response, const int fft_size);
988 void calc_frequency_response(const cmat &channel_coeff, cmat &frequency_response, const int fft_size);
990 double get_sampling_time() const { return discrete_Ts; }
991
992protected:
994 vec a_prof;
995 ivec d_prof;
998 int N_taps;
999 double n_dopp;
1007
1014 void discretize(const vec &delay_profile);
1015};
1016
1017
1018
1037class ITPP_EXPORT BSC
1038{
1039public:
1041 BSC(double in_p = 0.0) : u(0.0, 1.0) { p = in_p; };
1043 void set_prob(double in_p) { p = in_p; };
1045 double get_prob() const { return p; };
1047 bvec operator()(const bvec &input);
1048private:
1049 Uniform_RNG u;
1050 double p;
1051};
1052
1053
1054
1088class ITPP_EXPORT AWGN_Channel
1089{
1090public:
1092 AWGN_Channel(double noisevar = 0.0): sigma(std::sqrt(noisevar)) {}
1094 void set_noise(double noisevar) { sigma = std::sqrt(noisevar); }
1096 double get_noise() const { return sqr(sigma); }
1098 cvec operator()(const cvec &input);
1100 vec operator()(const vec &input);
1101private:
1102 Complex_Normal_RNG rng_cn;
1103 Normal_RNG rng_n;
1104 double sigma;
1105};
1106
1108
1109} // namespace itpp
1110
1111#endif // #ifndef CHANNEL_H
Definition of Array class (container)
Ordinary AWGN Channel for cvec or vec inputs and outputs.
Definition channel.h:1089
double get_noise() const
Get noise variance (for complex-valued channels the sum of real and imaginary parts)
Definition channel.h:1096
AWGN_Channel(double noisevar=0.0)
Class constructor. Sets the noise variance (for complex-valued channels the sum of real and imaginary...
Definition channel.h:1092
void set_noise(double noisevar)
Set noise variance (for complex-valued channels the sum of real and imaginary parts)
Definition channel.h:1094
General array class.
Definition factory.h:40
A Binary Symetric Channel with crossover probability p.
Definition channel.h:1038
double get_prob() const
Get crossover (bit error) probability.
Definition channel.h:1045
void set_prob(double in_p)
Set crossover (bit error) probability.
Definition channel.h:1043
BSC(double in_p=0.0)
Class constructor. Sets the error probability to p.
Definition channel.h:1041
General specification of a time-domain multipath channel.
Definition channel.h:697
vec los_dopp
Relative Rice Doppler for each Rice component.
Definition channel.h:754
int N_taps
Number of taps.
Definition channel.h:752
virtual ~Channel_Specification()
Destructor.
Definition channel.h:704
vec get_LOS_power() const
Get relative power (Rice factor) for each tap.
Definition channel.h:732
vec los_power
Relative power for each Rice component.
Definition channel.h:753
Array< DOPPLER_SPECTRUM > tap_doppler_spectrum
Doppler spectrum for each tap.
Definition channel.h:751
vec a_prof_dB
Power profile in dB.
Definition channel.h:749
double get_LOS_power(int tap_number) const
Get relative power (Rice factor) for tap tap_number.
Definition channel.h:736
Array< DOPPLER_SPECTRUM > get_doppler_spectrum() const
Get doppler spectrum for tap index.
Definition channel.h:728
int taps() const
Return the number of channel taps.
Definition channel.h:741
vec d_prof
Delay profile in seconds.
Definition channel.h:750
vec get_delay_prof() const
Return delay profile in seconds.
Definition channel.h:726
double get_LOS_doppler(int tap_number) const
Get relative Doppler for tap tap_number.
Definition channel.h:738
vec get_avg_power_dB() const
Return power profile in dB.
Definition channel.h:724
vec get_LOS_doppler() const
Get relative Doppler for each tap.
Definition channel.h:734
A Complex Normal Source.
Definition random.h:580
Correlated (random) fading generator class.
Definition channel.h:391
virtual double get_norm_doppler() const
Return normalized Doppler.
Definition channel.h:406
double los_dopp
Relative Doppler on LOS component (0.7 by default)
Definition channel.h:425
double n_dopp
Normalized maximum Doppler frequency.
Definition channel.h:424
virtual double get_time_offset() const
Get time offset in samples.
Definition channel.h:410
double time_offset
Time offset in samples (time state in the generator)
Definition channel.h:426
virtual ~Correlated_Fading_Generator()
Destructor.
Definition channel.h:396
virtual void init()=0
Initialize the generator.
virtual void generate(int no_samples, cvec &output)=0
Generate no_samples values from the fading process.
virtual double get_LOS_doppler() const
Get relative Doppler (compared to the maximum doppler) for the LOS component.
Definition channel.h:408
FIR type Fading generator class.
Definition channel.h:537
virtual ~FIR_Fading_Generator()
Destructor.
Definition channel.h:542
MA_Filter< std::complex< double >, double, std::complex< double > > fir_filter
Filter used for fading generation.
Definition channel.h:561
cvec left_overs
Left-overs from upsampling.
Definition channel.h:562
int fir_length
Size of FIR filter.
Definition channel.h:558
virtual int get_filter_length() const
Get filter length.
Definition channel.h:547
Fading generator class.
Definition channel.h:229
virtual void generate(int no_samples, cvec &output)=0
Generate no_samples values from the fading process.
double get_LOS_power() const
Get relative power of LOS component (Rice factor)
Definition channel.h:254
double los_diffuse
Diffuse component: sqrt(1 / (1 + los_power))
Definition channel.h:284
bool init_flag
signals if generator is initialized or not
Definition channel.h:282
virtual ~Fading_Generator()
Destructor.
Definition channel.h:234
double los_direct
Direct component: sqrt(los_power / (1 + los_power))
Definition channel.h:285
double los_power
Relative power of LOS component compared to diffuse component (K factor)
Definition channel.h:283
virtual void init()=0
Initialize the generator.
IFFT type Fading generator class.
Definition channel.h:603
virtual void init()
Initialize the generator.
Definition channel.h:612
virtual ~IFFT_Fading_Generator()
Destructor.
Definition channel.h:609
IFFT_Fading_Generator(double norm_doppler)
Default constructor.
Definition channel.h:606
Independent (random) fading generator class.
Definition channel.h:329
Independent_Fading_Generator()
Default constructor.
Definition channel.h:332
virtual ~Independent_Fading_Generator()
Destructor.
Definition channel.h:334
virtual void init()
Initialize the generator.
Definition channel.h:337
Moving Average Filter Base Class.
Definition filter.h:99
Normal distribution.
Definition random.h:441
Rice type fading generator class.
Definition channel.h:468
virtual RICE_METHOD get_rice_method() const
Get calculation method of Doppler frequencies and amplitudes.
Definition channel.h:488
DOPPLER_SPECTRUM dopp_spectrum
Definition channel.h:499
int Ni
Number of sine waves in a Gaussian process.
Definition channel.h:501
RICE_METHOD rice_method
Rice process generation method.
Definition channel.h:503
virtual ~Rice_Fading_Generator()
Destructor.
Definition channel.h:474
virtual DOPPLER_SPECTRUM get_doppler_spectrum() const
Return Doppler spectrum.
Definition channel.h:484
virtual int get_no_frequencies() const
Get number of Doppler frequencies.
Definition channel.h:486
Static fading generator class.
Definition channel.h:356
double static_sample_re
Static Rayleigh distributed sample.
Definition channel.h:373
Static_Fading_Generator()
Default constructor.
Definition channel.h:359
virtual ~Static_Fading_Generator()
Destructor.
Definition channel.h:361
Tapped Delay Line (TDL) channel model.
Definition channel.h:858
double get_LOS_doppler(int tap_number) const
Get relative Doppler (to the maximum Doppler) for tap tap_number.
Definition channel.h:932
vec a_prof
Average amplitude of each tap.
Definition channel.h:994
CORRELATED_METHOD method
Correlated fading generation method: Rice_MEDS (default), IFFT or FIR.
Definition channel.h:1001
Array< DOPPLER_SPECTRUM > tap_doppler_spectrum
Doppler spectrum for each tap.
Definition channel.h:1002
double n_dopp
Normalized Doppler of the correlated fading.
Definition channel.h:999
int N_taps
Number of taps.
Definition channel.h:998
vec get_LOS_power() const
Get relative power (Rice factor) for each tap.
Definition channel.h:926
vec get_LOS_doppler() const
Get relative Doppler (to the maximum Doppler) for each tap.
Definition channel.h:928
vec los_power
Relative power for each Rice component.
Definition channel.h:996
ivec get_delay_prof() const
Return delay profile in samples.
Definition channel.h:915
bool init_flag
Channel ready to produce data.
Definition channel.h:993
ivec d_prof
Delay in samples for each tap.
Definition channel.h:995
FADING_TYPE fading_type
Fading type: Independent (default), Static or Correlated.
Definition channel.h:1000
int nrof_freq
Number of sine frequencies in the Rice MEDS fading generator.
Definition channel.h:1005
CORRELATED_METHOD get_correlated_method() const
Return fading generation method.
Definition channel.h:918
Array< Fading_Generator * > fading_gen
Fading generators for each tap.
Definition channel.h:1003
int taps() const
Return the number of channel taps.
Definition channel.h:908
int get_no_frequencies() const
Get the minimum number of frequencies used in Rice MEDS fading generator.
Definition channel.h:935
vec los_dopp
Relative LOS Doppler for each Rice component.
Definition channel.h:997
double discrete_Ts
Sampling time of discretization.
Definition channel.h:1006
FADING_TYPE get_fading_type() const
Return fading type.
Definition channel.h:920
double get_sampling_time() const
Return channel sampling time (used for discretization)
Definition channel.h:990
double get_LOS_power(int tap_number) const
Get relative power (Rice factor) for tap tap_number.
Definition channel.h:930
int filter_length
Filter length of FIR fading generator.
Definition channel.h:1004
double get_norm_doppler() const
Return normalized doppler rate.
Definition channel.h:923
Uniform distribution.
Definition random.h:355
Elementary mathematical functions - header file.
Definitions of Filter classes and functions.
vec filter(const vec &b, const vec &a, const vec &input)
ARMA filter function.
Definition filter.cpp:39
vec sqr(const cvec &data)
Absolute square of elements.
Definition elem_math.cpp:36
vec sqrt(const vec &x)
Square root of the elements.
Definition elem_math.h:123
vec spectrum(const vec &v, int nfft, int noverlap)
Power spectrum calculation.
Definition sigfun.cpp:267
Matrix Class Definitions.
itpp namespace
Definition itmex.h:37
CORRELATED_METHOD
Correlated fading generation methods: Rice_MEDS (default), IFFT or FIR.
Definition channel.h:206
RICE_METHOD
Rice fading generation methods: MEDS.
Definition channel.h:209
std::istream & operator>>(std::istream &input, bin &outbin)
Input stream of bin.
Definition binary.cpp:42
CHANNEL_PROFILE
Predefined channel profiles. Includes LOS and Doppler spectrum settings.
Definition channel.h:193
FADING_TYPE
Fading generator type: Independent (default), Static or Correlated.
Definition channel.h:203
DOPPLER_SPECTRUM
Predefined Doppler spectra.
Definition channel.h:212
STL namespace.
Definition of classes for random number generators.
SourceForge Logo

Generated on Tue Dec 10 2024 04:49:37 for IT++ by Doxygen 1.12.0