60 "Fading_Generator::set_LOS_power(): Relative_power can not be negative");
68 it_warning(
"Fading_Generator::set_LOS_doppler(): This function has no effect on this kind of generator");
73 it_warning(
"Fading_Generator::set_time_offset(): This function has no effect on this kind of generator");
78 it_warning(
"Fading_Generator::set_norm_doppler(): This function has no effect on this kind of generator");
83 it_warning(
"Fading_Generator::set_filter_length(): This function has no effect on this kind of generator");
88 it_warning(
"Fading_Generator::set_doppler_spectrum(): This function has no effect on this kind of generator");
93 it_warning(
"Fading_Generator::set_no_frequencies(): This function has no effect on this kind of generator");
98 it_warning(
"Fading_Generator::set_rice_method(): This function has no effect on this kind of generator");
103 it_warning(
"Fading_Generator::get_LOS_doppler(): This function has no effect on this kind of generator");
109 it_warning(
"Fading_Generator::get_time_offset(): This function has no effect on this kind of generator");
115 it_warning(
"Fading_Generator::get_filter_length(): This function has no effect on this kind of generator");
121 it_warning(
"Fading_Generator::get_norm_doppler(): This function has no effect on this kind of generator");
127 it_warning(
"Fading_Generator::get_doppler_spectrum(): This function has no effect on this kind of generator");
133 it_warning(
"Fading_Generator::get_no_frequencies(): This function has no effect on this kind of generator");
139 it_warning(
"Fading_Generator::get_rice_method(): This function has no effect on this kind of generator");
145 it_warning(
"Fading_Generator::shift_time_offset(): This function has no effect on this kind of generator");
162 output.set_size(no_samples,
false);
164 for (
int i = 0; i < no_samples; ++i) {
193 output.set_size(no_samples,
false);
210 it_assert((norm_doppler > 0) && (norm_doppler <= 1.0),
211 "Correlated_Fading_Generator: Normalized Doppler out of range");
218 it_assert((relative_doppler >= 0) && (relative_doppler <= 1.0),
219 "Correlated_Fading_Generator::set_LOS_doppler(): Relative Doppler out of range");
265 "Rice_Fading_Generator::set_no_frequencies(): Too low number of Doppler frequencies");
284 it_error(
"Rice_Fading_Generator::init(): Wrong Rice method for this fading generator");
295 output.set_size(no_samples,
false);
299 double tmp_re, tmp_im;
301 for (
int i = 0; i < no_samples; i++) {
304 output(i) = std::complex<double>(tmp_re, tmp_im);
309 for (
int i = 0; i < no_samples; i++) {
312 output(i) = std::complex<double>(tmp_re, tmp_im);
320 for (
int i = 0; i < no_samples; i++) {
346 f2 =
sin(
pi / (2 * (
Ni + 1)) * (n - 0.5));
370 sgm_0_2 = 0.15 / (
std::sqrt(10.0) + 0.15);
378 it_error(
"Rice_Fading_Generator::init_MEDS(): Wrong spectrum method for this fading generator");
397 "FIR_Fading_Generator::set_filter_length(): Filter length should be at least 50");
405 double norm_dopp =
n_dopp;
407 while (norm_dopp < 0.1) {
427 int no_upsamples =
ceil_i(static_cast<double>(no_samples -
left_overs.size())
433 left_overs = output.right(output.size() - no_samples);
434 output.set_size(no_samples,
true);
437 for (
int i = 0; i < no_samples; i++) {
448 vec x_pos(L), x_neg(L), x(2*L + 1), h(2*L + 1);
449 for (
int i = 1; i <= L; i++) {
453 double x0 = 1.468813 *
std::pow(norm_dopp, 0.25);
474 for (
int i = 0; i < no_samples; i++) {
485 double df = 1.0 / Nfft;
489 while (noisesamp <= 10) {
495 "IFFT_Fading_Generator::generate_Jakes(): Too low normalized doppler or too small blocks of data. Results in an inefficient algorithm with lots of zero-padding");
498 vec Fpos =
linspace(0, 0.5, Nfft / 2 + 1);
502 for (
int i = 0; i < F.size(); i++) {
503 if (std::fabs(F(i)) <
n_dopp)
505 else if (std::fabs(F(i)) ==
n_dopp)
514 for (
int i = 0; i < noisesamp; ++i) {
516 x(Nfft - 1 - i) = S(Nfft - 1 - i) *
randn_c();
521 output = x.mid(0, no_samples);
530 const vec &delay_prof)
543 "Channel_Specification::set_channel_profile(): Minimum relative delay must be 0");
544 it_assert(avg_power_dB.size() == delay_prof.size(),
545 "Channel_Specification::set_channel_profile(): Power and delay vectors must be of equal length");
547 "Channel_Specification::set_channel_profile(): First tap must be at zero delay");
548 for (
int i = 1; i < delay_prof.size(); i++) {
549 it_assert(delay_prof(i) > delay_prof(i - 1),
550 "Channel_Specification::set_channel_profile(): Delays should be sorted and unique");
553 N_taps = delay_prof.size();
569 case ITU_Vehicular_A:
571 vec(
"0 310 710 1090 1730 2510") * 1e-9);
574 case ITU_Vehicular_B:
576 vec(
"0 300 8900 12900 17100 20000") * 1e-9);
579 case ITU_Pedestrian_A:
581 vec(
"0 110 190 410") * 1e-9);
584 case ITU_Pedestrian_B:
586 vec(
"0 200 800 1200 2300 3700") * 1e-9);
591 set_channel_profile(vec(
"-5.7 -7.6 -10.1 -10.2 -10.2 -11.5 -13.4 -16.3 -16.9 -17.1 -17.4 -19 -19 -19.8 -21.5 -21.6 -22.1 -22.6 -23.5 -24.3"),
592 vec(
"0 217 512 514 517 674 882 1230 1287 1311 1349 1533 1535 1622 1818 1836 1884 1943 2048 2140") * 1e-9);
597 vec(
"0 42 101 129 149 245 312 410 469 528") * 1e-9);
602 set_channel_profile(vec(
"-3.6 -8.9 -10.2 -11.5 -11.8 -12.7 -13.0 -16.2 -17.3 -17.7 -17.6 -22.7 -24.1 -25.8 -25.8 -26.2 -29 -29.9 -30 -30.7"),
603 vec(
"0 356 441 528 546 609 625 842 916 941 15000 16172 16492 16876 16882 16978 17615 17827 17849 18016") * 1e-9);
609 vec(
"0 200 400 600") * 1e-9);
615 vec(
"0 100 200 300 400 500") * 1e-9);
621 vec(
"0 200 600 1600 2400 5000") * 1e-9);
630 vec(
"0 200 500 1600 2300 5000") * 1e-9);
638 vec(
"0 200 400 600 800 1200 1400 1800 2400 3000 3200 5000") * 1e-9);
650 case COST207_TU12alt:
652 vec(
"0 200 400 600 800 1200 1400 1800 2400 3000 3200 5000") * 1e-9);
665 vec(
"0 400 1000 1600 5000 6600") * 1e-9);
674 vec(
"0 300 1000 1600 5000 6600") * 1e-9);
683 vec(
"0 200 400 800 1600 2200 3200 5000 6000 7200 8200 10000") * 1e-9);
695 case COST207_BU12alt:
697 vec(
"0 100 300 700 1600 2200 3100 5000 6000 7200 8100 10000") * 1e-9);
712 vec(
"0 200 400 600 15000 17200") * 1e-9);
719 vec(
"0 100 300 500 15000 17200") * 1e-9);
726 vec(
"0 200 400 600 800 2000 2400 15000 15200 15800 17200 20000") * 1e-9);
738 case COST207_HT12alt:
740 vec(
"0 100 300 500 700 1000 1300 15000 15200 15700 17200 20000") * 1e-9);
756 for (
int i = 0; i <
N_taps; i++)
766 double relative_doppler)
769 "Channel_Specification::set_LOS(): Cannot set LOS component if not set channel profile");
771 "Channel_Specification::set_LOS(): Tap number out of range");
772 it_assert((relative_doppler >= 0) && (relative_doppler <= 1.0),
773 "Channel_Specification::set_LOS(): Normalized Doppler out of range");
775 "Channel_Specification::set_LOS(): Rice factor out of range");
780 los_dopp(tap_number) = relative_doppler;
784 const vec& relative_doppler)
787 "Channel_Specification::set_LOS(): Improper size of input vectors");
789 if (relative_doppler.size() == 0) {
790 los_power.set_size(relative_power.size());
791 los_dopp.set_size(relative_power.size());
792 for (
int i = 0; i < relative_power.size(); i++) {
794 "Channel_Specification::set_LOS(): Rice factor out of range");
801 "Channel_Specification::set_LOS(): Improper size of input vectors");
802 los_power.set_size(relative_power.size());
803 los_dopp.set_size(relative_power.size());
804 for (
int i = 0; i < relative_power.size(); i++) {
805 it_assert((relative_doppler(i) >= 0) && (relative_doppler(i) <= 1.0),
806 "Channel_Specification::set_LOS(): Normalized Doppler out of range");
808 "Channel_Specification::set_LOS(): Rice factor out of range");
816 vec &delay_prof)
const
825 "Channel_Specification::get_doppler_spectrum(): Index of of range");
838 double a = a_prof *
d_prof /
sum(a_prof);
850 init_flag(false), n_dopp(0.0), fading_type(Independent), method(Rice_MEDS),
851 filter_length(0), nrof_freq(16), discrete_Ts(0.0)
864 init_flag(false), n_dopp(0.0), fading_type(Independent), method(Rice_MEDS),
865 filter_length(0), nrof_freq(16), discrete_Ts(sampling_time)
886 const ivec &delay_prof)
889 "TDL_Channel::set_channel_profile(): Minimum relative delay must be 0.");
890 it_assert(avg_power_dB.size() == delay_prof.size(),
891 "TDL_Channel::set_channel_profile(): Power and delay vectors must be of equal length!");
893 "TDL_Channel::set_channel_profile(): First tap must be at zero delay");
894 for (
int i = 1; i < delay_prof.size(); i++) {
895 it_assert(delay_prof(i) > delay_prof(i - 1),
896 "TDL_Channel::set_channel_profile(): Delays should be sorted and unique");
899 N_taps = delay_prof.size();
917 it_assert(no_taps >= 1,
"TDL_Channel::set_channel_profile_uniform(): Minimum number of taps is 1.");
919 vec avg_power_dB =
zeros(no_taps);
920 ivec delay_prof(no_taps);
921 for (
int i = 0; i < no_taps; i++)
929 it_assert(no_taps >= 1,
"TDL_Channel::set_channel_profile_exponential(): Minimum number of taps is 1.");
931 vec avg_power_dB(no_taps);
932 ivec delay_prof(no_taps);
933 for (
int i = 0; i < no_taps; i++) {
936 avg_power_dB(i) =
dB(
std::exp(static_cast<double>(-i)));
950 N_taps = avg_power_dB.size();
970 method = correlated_method;
983 it_assert((norm_doppler > 0) && (norm_doppler <= 1.0),
984 "TDL_Channel::set_norm_doppler(): Normalized Doppler out of range");
995 "TDL_Channel::set_LOS(): Improper size of input vectors");
997 if (relative_doppler.size() == 0) {
998 los_power.set_size(relative_power.size());
999 los_dopp.set_size(relative_power.size());
1000 for (
int i = 0; i < relative_power.size(); i++) {
1002 "TDL_Channel::set_LOS(): Rice factor out of range");
1004 los_dopp(i) = (relative_power(i) > 0) ? 0.7 : 0.0;
1009 "TDL_Channel::set_LOS(): Improper size of input vectors");
1010 los_power.set_size(relative_power.size());
1011 los_dopp.set_size(relative_power.size());
1012 for (
int i = 0; i < relative_power.size(); i++) {
1013 it_assert((relative_doppler(i) >= 0) && (relative_doppler(i) <= 1.0),
1014 "TDL_Channel::set_LOS(): Normalized Doppler out of range");
1016 "TDL_Channel::set_LOS(): Rice factor out of range");
1026 "TDL_Channel::set_LOS_power(): Improper size of input vector");
1028 los_power.set_size(relative_power.size());
1029 los_dopp.set_size(relative_power.size());
1030 for (
int i = 0; i <
los_power.size(); ++i) {
1032 los_dopp(i) = (relative_power(i) > 0) ? 0.7 : 0.0;
1040 "TDL_Channel::set_LOS_doppler(): Improper size of input vector");
1042 it_assert(
n_dopp > 0,
"TDL_Channel::set_LOS_doppler(): Normalized Doppler needs to be non zero to set the LOS Doppler in a Correlated fading generator");
1044 los_dopp.set_size(relative_doppler.size());
1045 for (
int i = 0; i < relative_doppler.size(); ++i) {
1046 it_assert((relative_doppler(i) >= 0) && (relative_doppler(i) <= 1.0),
1047 "TDL_Channel::set_LOS_doppler(): Normalized Doppler out of range");
1057 it_assert(
N_taps > 0,
"TDL_Channel::set_doppler_spectrum(): Channel profile not defined yet");
1059 it_assert(
n_dopp > 0,
"TDL_Channel::set_doppler_spectrum(): Normalized Doppler needs to be non zero to set the Doppler spectrum in the Correlated Rice MEDS fading generator");
1065 for (
int i = 0; i <
N_taps; i++)
1074 "TDL_Channel::set_doppler_spectrum(): Improper tap number");
1076 it_assert(
n_dopp > 0,
"TDL_Channel::set_doppler_spectrum(): Normalized Doppler needs to be non zero to set the Doppler spectrum in the Correlated Rice MEDS fading generator");
1089 it_assert(
n_dopp > 0,
"TDL_Channel::set_no_frequencies(): Normalized Doppler needs to be non zero to set the number of frequencies in the Correlated Rice MEDS fading generator");
1100 it_assert(
n_dopp > 0,
"TDL_Channel::set_filter_length(): Normalized Doppler needs to be non zero to use the Correlated FIR fading generator");
1112 it_assert(
n_dopp > 0,
"TDL_Channel::set_time_offset(): Normalized Doppler needs to be non zero to set time offset in a Correlated fading generator");
1117 for (
int i = 0; i <
N_taps; i++) {
1125 it_assert(
n_dopp > 0,
"TDL_Channel::shift_time_offset(): Normalized Doppler needs to be non zero to shift time offset in a Correlated fading generator");
1130 for (
int i = 0; i <
N_taps; i++) {
1131 fading_gen(i)->shift_time_offset(no_samples);
1137 ivec &delay_prof)
const
1171 it_assert(
N_taps > 0,
"TDL_Channel::init(): Channel profile not defined yet");
1173 "TDL_Channel::init(): LOS profile does not mach the channel profile");
1189 for (
int i = 0; i <
N_taps; ++i) {
1198 for (
int i = 0; i <
N_taps; ++i) {
1208 "TDL_Channel::init(): Correlated fading requires non zero normalized Doppler");
1215 for (
int i = 0; i <
N_taps; ++i) {
1227 for (
int i = 0; i <
N_taps; ++i) {
1229 "TDL_Channel::init(): FIR fading generator can be used with Jakes spectrum only");
1242 for (
int i = 0; i <
N_taps; ++i) {
1244 "TDL_Channel::init(): IFFT fading generator can be used with Jakes spectrum only");
1255 it_error(
"TDL_Channel::init(): No such fading generation method");
1260 it_error(
"TDL_Channel::init(): No such fading type");
1272 for (
int i = 0; i <
N_taps; i++)
1281 channel_coeff.set_size(no_samples,
N_taps,
false);
1282 for (
int i = 0; i <
N_taps; i++)
1291 output.set_size(input.size() + maxdelay,
false);
1294 for (
int i = 0; i <
N_taps; i++)
1302 output.set_size(input.size() + maxdelay,
false);
1305 for (
int i = 0; i <
N_taps; i++)
1311 generate(input.size(), channel_coeff);
1317 generate(input.size(), channel_coeff);
1324 filter(input, output, channel_coeff);
1331 filter(input, output, channel_coeff);
1338 filter(input, output, channel_coeff);
1351 filter(input, output, channel_coeff);
1356 filter(input, output, channel_coeff);
1362 return filter(input, channel_coeff);
1367 return filter(input, channel_coeff);
1378 it_assert(
init_flag ==
true,
"calc_impulse_response: TDL_Channel is not initialized");
1379 it_assert(
N_taps == channel_coeff.
size(),
"calc_impulse_response: number of channel taps do not match");
1381 int no_samples = channel_coeff(0).
size();
1382 it_assert(no_samples > 0,
"calc_impulse_response: channel_coeff must contain samples");
1384 impulse_response.
set_size(no_samples);
1386 for (
int i = 0; i < no_samples; i++) {
1388 impulse_response(i).zeros();
1390 for (
int j = 0; j <
N_taps; j++)
1391 impulse_response(i)(
d_prof(j)) = channel_coeff(j)(i);
1398 it_assert(
init_flag ==
true,
"calc_frequency_response: TDL_Channel is not initialized");
1399 it_assert(
N_taps == channel_coeff.
size(),
"calc_frequency_response: number of channel taps do not match");
1401 int no_samples = channel_coeff(0).
size();
1402 it_assert(no_samples > 0,
"calc_frequency_response: channel_coeff must contain samples");
1404 frequency_response.
set_size(no_samples);
1406 it_assert(fft_size >
d_prof(
N_taps - 1),
"calc_frequency_response: fft_size must be larger than the maximum delay in samples");
1407 cvec impulse_response(fft_size);
1409 for (
int i = 0; i < no_samples; i++) {
1410 impulse_response.zeros();
1412 for (
int j = 0; j <
N_taps; j++)
1413 impulse_response(
d_prof(j)) = channel_coeff(j)(i);
1415 fft(impulse_response, frequency_response(i));
1422 it_assert(
init_flag ==
true,
"calc_frequency_response: TDL_Channel is not initialized");
1423 it_assert(
N_taps == channel_coeff.cols(),
"calc_frequency_response: number of channel taps do not match");
1425 int no_samples = channel_coeff.rows();
1426 it_assert(no_samples > 0,
"calc_frequency_response: channel_coeff must contain samples");
1428 frequency_response.set_size(fft_size, no_samples,
false);
1430 it_assert(fft_size >
d_prof(
N_taps - 1),
"calc_frequency_response: fft_size must be larger than the maximum delay in samples");
1431 cvec impulse_response(fft_size);
1434 for (
int i = 0; i < no_samples; i++) {
1435 impulse_response.zeros();
1437 for (
int j = 0; j <
N_taps; j++)
1438 impulse_response(
d_prof(j)) = channel_coeff(i, j);
1440 fft(impulse_response, freq);
1441 frequency_response.set_col(i, freq);
1447 it_assert(
N_taps > 0,
"TDL_Channel::discretize(): No channel profile specified");
1448 it_assert(delay_profile(0) == 0,
"TDL_Channel::discretize(): First tap should be at zero delay");
1452 "TDL_Channel:: discretize(): Channel profile lenghts must be equal to the number of taps");
1463 power(0) = p_prof(0);
1464 spower = p_prof(0) / (1 +
los_power(0));
1465 scattered(0) = spower;
1471 int j = 0, j_delay = 0;
1472 for (
int i = 1; i <
N_taps; i++) {
1473 if (delay_profile(i) > (j_delay + 0.5)*
discrete_Ts) {
1475 while (delay_profile(i) > (j_delay + 0.5)*
discrete_Ts) { j_delay++; }
1478 delay_prof(j) = j_delay;
1479 power(j) = p_prof(i);
1480 spower = p_prof(i) / (1 +
los_power(i));
1481 scattered(j) = spower;
1488 power(j) += p_prof(i);
1489 spower = p_prof(i) / (1 +
los_power(i));
1490 scattered(j) += spower;
1493 "TDL_Channel::discretize(): Sampling frequency too low. Can not discretize the channel with different Doppler spectra on merged taps.");
1494 it_warning(
"TDL_Channel::discretize(): Sampling frequency too low. Merging original tap " << i <<
" with new tap " << j <<
".");
1495 if (los_doppler(j) !=
los_dopp(i)) {
1496 los_doppler(j) = 0.7;
1497 it_warning(
"TDL_Channel::discretize(): LOS Doppler value reset to 0.7 for tap " << j <<
" due to the merging process.");
1502 int no_taps = j + 1;
1503 if (no_taps < N_taps) {
1504 delay_prof.set_size(no_taps,
true);
1505 power.set_size(no_taps,
true);
1506 direct.set_size(no_taps,
true);
1507 scattered.set_size(no_taps,
true);
1508 los_doppler.set_size(no_taps,
true);
1509 tap_spectrum.
set_size(no_taps,
true);
1529 int i,
length = input.length();
1530 bvec output(length);
1532 for (i = 0; i <
length; i++) {
1534 output(i) = input(i) +
bin(1);
1537 output(i) = input(i);
1550 int n = input.size();
1560 int n = input.size();