<< 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 . 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
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
long, and with
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)
Notification Switch
Would you like to follow the 'Software receiver design' conversation and receive update notifications?