…looks like this topic isn’t too popular : -)
Anyhow, I wanted to make another attempt as I would really appreciate if 
someone could comment on this thread or the threads at [1] or [2].

Unfortunately, I still fail to understand the implementation of the flat fader 
and particularly these lines [3]

float s_i = scale_sin*cos(2*M_PI*d_fDTs*d_m*cos(alpha_n)+d_psi[n]);
float s_q = scale_sin*cos(2*M_PI*d_fDTs*d_m*sin(alpha_n)+d_phi[n]);

As far as I see, alpha_n is changing from sample to sample, which produces an 
amplified effect over time that changes autocorrelation properties.
(It behaves as if the instantaneous Doppler frequency would have been present 
since the start and, thus, produces larger and larger phase shifts between 
subsequent samples.)

I tried to show the effect with an iPython notebook
https://www.bastibl.net/rayleigh-autocorrelation/

It would be great if someone could point me to a paper/book with the algorithm 
that is implemented here. The only thing I could find is 

"Improved Models for the Generation of Multiple Uncorrelated Rayleigh Fading 
Waveforms”  by Yahong R. Zheng and Chengshan Xiao
http://web.mst.edu/~xiaoc/Pub/Zheng_Xiao_CommLett.pdf 
<http://web.mst.edu/~xiaoc/Pub/Zheng_Xiao_CommLett.pdf>

which proposes the parameter set, but not the random walk through the Doppler 
spectrum that seems to be an attempt to make simulations ergodic.

Best,
Bastian


[1] http://lists.gnu.org/archive/html/discuss-gnuradio/2016-02/msg00254.html 
[2] http://lists.gnu.org/archive/html/discuss-gnuradio/2016-02/msg00305.html
[3] 
https://github.com/gnuradio/gnuradio/blob/next/gr-channels/lib/flat_fader_impl.cc#L76


> On 23 Feb 2016, at 08:35, Bastian Bloessl <bloe...@ccs-labs.org> wrote:
> 
>> 
>> On 23 Feb 2016, at 02:35, Kelvin Augustin <kelvin.che...@gmail.com 
>> <mailto:kelvin.che...@gmail.com>> wrote:
>> 
>> Hi Bastian
>> 
>> What I don’t get (and what I asked in the other thread) is why this is 
>> multiplied with d_m. I think that, per sample, the current Doppler Frequency 
>> should be used to calculate an incremental angle to the previous value.
>> 
>> To answer this, I would consider of the correspondence (via a Fourier 
>> Transform) of a Doppler shift in the time domain; A shift in frequency 
>> corresponds to a "time" dependant phase shift in the time domain. Thus a 
>> Doppler shift of Fd in the time domain corresponds to exp(j*2*pi*Fd*t). And 
>> since Dynamic channel model(flat_fader to be precise) in GNURadio models the 
>> Doppler in the time domain, the d_m could be a way to model the time. 
> 
> Yes, I understand that d_m is like time here, and it would be perfectly fine 
> if fD would stay constant during the whole simulation.
> 
> But as fD changes over time, the phase change from one sample to another (due 
> to the same change in dopplers shift) will be amplified over time. AFAIS, 
> this changes the autocorrelation properties over time.
> 
> I would have expected something like
> 
> tap[n+1] = tap[n] exp(2*pi*i*fD*cos(alpha))
> 
> Best,
> Bastian
> 
>> 
>> I would also ask a supplementing question that I am having problems 
>> understanding. I would expect the Doppler shift to be modelled by a complex 
>> exponential(cos[2*pi*Fd*t*cos(alpha)] + i sin [2*pi*Fd*t*cos(alpha)]) which 
>> corroborates what we know from the Fourier correspondence of a Doppler 
>> shift. Why then, in the Dynamic channel model in GNURadio (flat_fader to be 
>> precise), the Doppler is modelled by (cos[2*pi*Fd*t*cos(alpha)] + i cos 
>> [2*pi*Fd*t*sin(alpha)]) ?? I.e why is the imaginary part a cos ? Any hints?
>>  
>> 
>> 
>>> On 22 Feb 2016, at 06:41, Nasi <nesaz...@mail.ru <mailto:nesaz...@mail.ru>> 
>>> wrote:
>>> 
>>> Hello,
>>> 
>>> The question is about how does the given Doppler shift progress, or how is 
>>> the Doppler induced phase shift implemented.
>>> 
>>> I select a simple frequency selective fading block and feed in it some 
>>> gr_complex(1, 0) values. For simplicity I run one fader (num of sinusoids).
>>> in file:
>>> https://github.com/osh/gnuradio.old/blob/master/gr-channels/lib/flat_fader_impl.cc
>>>  
>>> <https://github.com/osh/gnuradio.old/blob/master/gr-channels/lib/flat_fader_impl.cc>
>>>  
>>> in the code below,
>>> #elif FASTSINCOS == 2
>>>     float s_i = 
>>> scale_sin*d_table.cos(2*M_PI*d_fDTs*d_m*d_table.cos(alpha_n)+d_psi[n+1]);
>>>     float s_q = 
>>> scale_sin*d_table.cos(2*M_PI*d_fDTs*d_m*d_table.sin(alpha_n)+d_phi[n+1]);
>>>      
>>>     #else
>>>  d_m shows that the Doppler shift must progress sequencially. However, the 
>>> value of "2*M_PI*d_fDTs*d_m*d_table.cos(alpha_n)" as a whole, produces 
>>> floating point numbers which results in kind of random values out of 
>>> d_table.cos() function in file 
>>> https://github.com/osh/gnuradio.old/blob/master/gr-channels/lib/sincostable.h
>>>  
>>> <https://github.com/osh/gnuradio.old/blob/master/gr-channels/lib/sincostable.h>
>>> 
>>> Some more explanation:
>>> the value: 2*M_PI*d_fDTs*d_m*d_table.cos(alpha_n) gets in as x below (in 
>>> file .../lib/sincostable.h)
>>> (((int)(x*d_scale)) + d_sz) % d_sz; - this is a random integer value (may 
>>> be not, can you please help me with that?)
>>> therefore it returns a random cos value as: return d_cos[idx];
>>> 
>>> The issue arises when that floating point values inside cos() function is 
>>> converted to integers as given above.
>>> 
>>> Now, my question is, did you do that random phase shift/Doppler shift on 
>>> purpose? If yes, what is the reasoning behind that.
>>> As far as I know, the Doppler shift should be somehow linear progressive.
>>> 
>> 



_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to