There is a type instability (see here 
<http://docs.julialang.org/en/release-0.4/manual/performance-tips/#write-type-stable-functions>)
 
that slows down your code. 

@code_warntype Jakes_Flat( 926, 1e-6, 50000, 0, 1, 0 )
shows that variable h has type Any.

I managed to track down the type instability to the concatenation 
[ phi_N pi/(N0+1)*[1:N0]']

You can get around the type instability with this modification:
function Jakes_Flat( fd, Ts, Ns, t0 = 0, E0 = 1, phi_N = 0 )
# Inputs:
#
# Outputs:
  N0  = 8;                  # As suggested by Jakes
  N   = 4*N0+2;             # An accurate approximation
  wd  = 2*pi*fd;            # Maximum Doppler frequency
  t   = t0 + [0:Ns-1;]*Ts;
  tf  = t[end] + Ts;
  coswt = [ sqrt(2)*cos(wd*t'); 2*cos(wd*cos(2*pi/N*[1:N0;])*t') ]
  temp = zeros(1,N0+1)
  temp[1,2:end] = pi/(N0+1)*[1:N0;]'
  temp[1,1] = phi_N
  h = E0/sqrt(2*N0+1)*exp(im*temp ) * coswt
  return h, tf;
end

This is faster 30% faster than before, but still not as fast as Matlab. 
Maybe someone else knows the reason for the speed difference (I guess it's 
due to temporary arrays).

On Sunday, October 18, 2015 at 1:17:50 PM UTC+2, Vishnu Raj wrote:
>
> Although Julia homepage shows using Julia over Matlab gains more in 
> performance, my experience is quite opposite.
> I was trying to simulate channel evolution using Jakes Model for wireless 
> communication system.
>
> Matlab code is:
> function [ h, tf ] = Jakes_Flat( fd, Ts, Ns, t0, E0, phi_N )
> %JAKES_FLAT 
> %   Inputs:
> %       fd, Ts, Ns  : Doppler frequency, sampling time, number of samples
> %       t0, E0      : initial time, channel power
> %       phi_N       : initial phase of the maximum Doppler frequeny
> %       sinusoid
> %
> %   Outputs:
> %       h, tf       : complex fading vector, current time
>
>     if nargin < 6,  phi_N = 0;  end
>     if nargin < 5,  E0 = 1;     end
>     if nargin < 4,  t0 = 0;     end
>     
>     N0 = 8;         % As suggested by Jakes
>     N  = 4*N0 + 2;  % an accurate approximation
>     wd = 2*pi*fd;   % Maximum Doppler frequency[rad]
>     t  = t0 + [0:Ns-1]*Ts;  % Time vector
>     tf = t(end) + Ts;       % Final time
>     coswt = [ sqrt(2)*cos(wd*t); 2*cos(wd*cos(2*pi/N*[1:N0]')*t) ];
>     h  = E0/sqrt(2*N0+1)*exp(j*[phi_N pi/(N0+1)*[1:N0]])*coswt;
> end
> Enter code here...
>
> My call results in :
> >> tic; Jakes_Flat( 926, 1E-6, 50000, 0, 1, 0 ); toc
> Elapsed time is 0.008357 seconds.
>
>
> My corresponding Julia code is
> function Jakes_Flat( fd, Ts, Ns, t0 = 0, E0 = 1, phi_N = 0 )
> # Inputs:
> #
> # Outputs:
>   N0  = 8;                  # As suggested by Jakes
>   N   = 4*N0+2;             # An accurate approximation
>   wd  = 2*pi*fd;            # Maximum Doppler frequency
>   t   = t0 + [0:Ns-1]*Ts;
>   tf  = t[end] + Ts;
>   coswt = [ sqrt(2)*cos(wd*t'); 2*cos(wd*cos(2*pi/N*[1:N0])*t') ]
>   h = E0/sqrt(2*N0+1)*exp(im*[ phi_N pi/(N0+1)*[1:N0]']) * coswt
>   return h, tf;
> end
> # Saved this as "jakes_model.jl"
>
>
> My first call results in 
> julia> include( "jakes_model.jl" )
> Jakes_Flat (generic function with 4 methods)
>
> julia> @time Jakes_Flat( 926, 1e-6, 50000, 0, 1, 0 )
> elapsed time: 0.65922234 seconds (61018916 bytes allocated)
>
> julia> @time Jakes_Flat( 926, 1e-6, 50000, 0, 1, 0 )
> elapsed time: 0.042468906 seconds (17204712 bytes allocated, 63.06% gc 
> time)
>
> For first execution, Julia is taking huge amount of time. On second call, 
> even though Julia take considerably less(0.042468906 sec) than first(
> 0.65922234 sec), it's still much higher to Matlab(0.008357 sec).
> I'm using Matlab R2014b and Julia v0.3.10 on Mac OSX10.10.
>
> - vish
>

Reply via email to