|From:||Ludwig Stephan (CR/AEH4)|
|Subject:||Re: [Discuss-gnuradio] how does Doppler shift increment in flat fading channel GNU radio|
|Date:||Tue, 8 Mar 2016 13:16:30 +0000|
I thought being a bit more thorough on the SOS method never harms ;-)
Aah, I got the point: alpha_n depends on theta and theta increases. I mixed it up and thought we were talking about psi and phi.
> It does not grow, but change over time. alpha_n depends on theta, which is updated after each sample. Through theta, alpha_n is
> doing a random walk in the interval [- pi; pi] so that the term
> d_fDTs *sin(alpha_n)
> is a random walk through the Doppler spectrum.
Just to make it clear (to myself):
BUT: alpha_n depends on theta, which in turn does a random walk in the code
Bastian, you are right. In all the papers theta is a randomly chosen constant. And it should remain constant – at least for a certain time. After some time, the difference between actual process and intended process might run away such that a re-initialization might be appropriate. In this case you have to do something, which keeps the samples of previous calls continuous with the call using new parameters. By alternating the sign of the random variable, someone is trying to keep theta “in lanes”. Maybe the random walk of theta is an (I think inappropriate, because it does not work, because all other parameters get changed independently) way of achieving this.
In fact, the code should not use update_theta for every new output sample, because I fear that this makes successive samples non-continuous – and your iPython notebook backs this.
And theta should not saturate at +/- pi, either. I do not have a clue, where the step size is taken from. It is definitely not Table II in the Zajic/Stüber paper.
> "Efficient Simulation of Rayleigh Fading with Enhanced De-Correlation Properties” by Alenka G. Zajic and Gordon L. Stüber
> the authors refer to the paper, stating that:
Ahh, that is a very good reference. Actually I was searching for that in my literature database but did not find it again.
> "To improve on previously reported models, Zheng and Xiao proposed several new statistical models -. By allowing all
> three parameter sets (amplitudes, phases, and Doppler frequencies) to be random variables, Zheng and Xiao’s models obtain
> statistical properties similar to ones required by the reference model. However, the models are no longer ergodic."
> To me it looks like the model was _fixed_ by introducing this random walk that is supposed to make the model
> again. I guess this follows some paper or book since the code mentions a table
> d_step( powf(0.00125*fDTs, 1.1) ), // max step size approximated from Table 2
No, the model of Zajic/Stüber is ergodic. But yes, they fixed the previous model by choosing the parameters randomly – but constant over time and not updating for every sample. And Table II does definitely not refer to the one in their paper.
I try to summarize all the efforts
· Use sin and cos in the factors for getting (almost) uncorrelated I and Q shares of the complex random variable
· Introduce a random phase (but constant) argument into every cos(f_D*t) term in order to make the system WSS
· In order to make the signals ergodic (ever draw of parameters has the equal statistics, which also yield uncorrelated processes) let sin(f_D*t) and cos(f_D*t) have different random (but constant) phases, but thake the cos/sin factors from identical angles of arrival
· MEDS method produces WSS process of intended auto-correlation function, but introduces correlation between different random process.
· The Zheng/Xiao model combines all previous advantages: still constant but different phases
· The Zajic/Stüber model combines all previosu advantages, especially it has a random but constant phase (-> WSS), is ergodic, has uncorrelated I/Q and uncorrelated processes, while converging faster (requires smaller N).
=> In conclusion and because nobody remembers why this code was written like that, I vote for adapting the model to Zajic/Stüber by removing the update_theta function and their call (and then unused variables like d_step). Their implementation is one of the best-known ones.
|[Prev in Thread]||Current Thread||[Next in Thread]|