00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "JakesFading.h"
00017 #include <BaseWorldUtility.h>
00018
00019 DimensionSet JakesFadingMapping::dimensions(Dimension::time_static());
00020
00021 double JakesFadingMapping::getValue(const Argument& pos) const {
00022 double f = model->carrierFrequency;
00023 double v = relSpeed;
00024 simtime_t t = pos.getTime();
00025 double re_h = 0;
00026 double im_h = 0;
00027
00028
00029 double doppler_shift = v * f / BaseWorldUtility::speedOfLight;
00030
00031 for (int i = 0; i < model->fadingPaths; i++) {
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 double phi_d = model->angleOfArrival[i] * doppler_shift;
00043
00044 double phi_i = model->delay[i].dbl() * f;
00045
00046 double phi = 2.00 * M_PI * (phi_d * t.dbl() - phi_i);
00047
00048
00049
00050
00051 double attenuation = (1.00 / sqrt(static_cast<double>(model->fadingPaths)));
00052
00053
00054 re_h = re_h + attenuation * cos(phi);
00055 im_h = im_h - attenuation * sin(phi);
00056 }
00057
00058
00059
00060 return re_h * re_h + im_h * im_h;
00061 }
00062
00063
00064 JakesFading::JakesFading(int fadingPaths, simtime_t delayRMS,
00065 Move* hostMove, double carrierFrequency,
00066 simtime_t interval):
00067 fadingPaths(fadingPaths),
00068 hostMove(hostMove),
00069 carrierFrequency(carrierFrequency),
00070 interval(interval)
00071 {
00072 angleOfArrival = new double[fadingPaths];
00073 delay = new simtime_t[fadingPaths];
00074
00075 for (int i = 0; i < fadingPaths; i++) {
00076 angleOfArrival[i] = cos(uniform(0, M_PI));
00077 delay[i] = exponential(delayRMS);
00078 }
00079 }
00080
00081 JakesFading::~JakesFading() {
00082 delete[] delay;
00083 delete[] angleOfArrival;
00084 }
00085
00086 void JakesFading::filterSignal(Signal& s)
00087 {
00088 const Move& senderMove = s.getMove();
00089 double relSpeed = (senderMove.getDirection() * senderMove.getSpeed()
00090 - hostMove->getDirection() * hostMove->getSpeed()).length();
00091
00092 simtime_t start = s.getSignalStart();
00093 simtime_t end = start + s.getSignalLength();
00094
00095 s.addAttenuation(new JakesFadingMapping(this, relSpeed,
00096 Argument(start),
00097 interval,
00098 Argument(end)));
00099 }