<< Chapter < Page Chapter >> Page >
tnow=l*m+1; tau=0; xs=zeros(1,n);           % initialize variables tausave=zeros(1,n); tausave(1)=tau; i=0;mu=0.01;                                    % algorithm stepsize delta=0.1;                                  % time for derivativewhile tnow<length(x)-2*l*m                  % run iteration   i=i+1;  xs(i)=interpsinc(x,tnow+tau,l);           % interpolated value at tnow+tau   x_deltap=interpsinc(x,tnow+tau+delta,l);  % get value to the right  x_deltam=interpsinc(x,tnow+tau-delta,l);  % get value to the left   dx=x_deltap-x_deltam;                     % calculate numerical derivative  qx=quantalph(xs(i),[-3,-1,1,3]);          % quantize xs to nearest 4-PAM symbol  tau=tau+mu*dx*(qx-xs(i));                 % alg update: DD   tnow=tnow+m; tausave(i)=tau;              % save for plottingend
clockrecDD.m (part 2) clock recovery minimizing cluster variance (download file)

Typical output of the program is plotted in [link] , which shows the 4-PAM constellation diagram, along with thetrajectory of the offset estimation as it converges towards the negative of the “unknown” value - 0 . 3 . Observe that, initially, the values arewidely dispersed about the required 4-PAM values, but as the algorithm nears its convergent point, the estimated values of the symbolsconverge nicely.

As usual, a good way to conceptualize the action of the adaptive element is to draw the error surface—in this case, to plot J C V ( τ ) of [link] as a function of the timing offset τ . In the examples of "An Example" , the error surface was drawn by exhaustively writing downall the possible input sequences, and evaluating the performance function explicitly in terms of the offset τ . In the binary setup with an identity channel,where the pulse shape is only 2 T long, and with M = 1 oversampling, there were only four cases to consider. But when the pulse shape and channel are long andthe constellation has many elements, the number of cases grows rapidly.Since this can get out of hand, an “experimental” method can be used to approximate the errorsurface. For each timing offset, the code in clockrecDDcost.m chooses n random input sequences, evaluates the performance function, and averages.

l=10;                               % 1/2 duration of pulse shape in symbols beta=0.75;                          % rolloff for pulse shapem=20;                               % evaluate at m different points ps=srrc(l,beta,m);                  % make srrc pulse shapepsrc=conv(ps,ps);                   % convolve 2 srrc's to get rc psrc=psrc(l*m+1:3*l*m+1);           % truncate to same length as pscost=zeros(1,m); n=20000;           % calculate perf via "experimental" method x=zeros(1,n);for i=1:m                           % for each offset   pt=psrc(i:m:end);                 % rc is shifted i/m of a symbol  for k=1:n                         % do it n times     rd=pam(length(pt),4,5);         % random 4-PAM vector    x(k)=sum(rd.*pt);               % received data point w/ISI   end  err=quantalph(x,[-3,-1,1,3])-x';  % quantize to nearest 4-PAM  cost(i)=sum(err.^2)/length(err);  % DD performance function end
clockrecDDcost.m error surfaces for cluster variance performance function (download file)

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Software receiver design. OpenStax CNX. Aug 13, 2013 Download for free at http://cnx.org/content/col11510/1.3
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Software receiver design' conversation and receive update notifications?

Ask