DSPRelated.com
Code

Vector alignment for verification

kaz - October 22, 2011 Coded in Matlab

In verification it is often useful to align the output of a module with some reference vector for comparison. This program does that automatically. It reads the two vectors, correlates them then aligns them.

It has high success rate provided the matched length is not too short relative to vector length

 

%"align_run" is top level for testing "align" function

function align_run  
for i = 1:1
    L1 = 3400;   %length of first vector
    L2 = 4023;   %length of second vector
   
    %generate two random vectors
    x1 = randn(1,L1);
    x2 = randn(1,L2);
   
    %generate random index values for two identical segments
    r1 = round(rand(1)*L1);
    r2 = round(rand(1)*L2);
    r1(r1 == 0) = 1;
    r2(r2 == 0) = 1;
   
    %length of identical segments as percent of vector length
    n = round(50/100 * min([L1 L2]));
    n(n >= min([L1 L2])) = min([L1 L2])-1;
    while r1+n > L1, r1 = r1-1; end;
    while r2+n > L2, r2 = r2-1; end;
   
    %create identical segments at random location
    x1(r1:r1+n) = x2(r2:r2+n);
   
    %call align function
    [y1,y2] = align(x1,x2);
   
    %check alignment
    subplot(2,1,1);
    plot(y1);hold
    plot(y2,'r--') ;
    legend('y1','y2')
   
    subplot(2,1,2);
    plot(y1 - y2,'g')
    legend('(y1 - y2)')
   
end

return

%%%%%%%%%%%%%%%%% align %%%%%%%%%%%%%%%%%%
function [y1,y2] = align(x1,x2)

%force a column orientation
x1 = x1(:);
x2 = x2(:);

L1 = length(x1);
L2 = length(x2);
L = max([L1 L2]);

%equalise vector lengths
if L1 > L2, x2 = [x2; zeros(L1-L2,1)]; end;
if L1 < L2, x1 = [x1; zeros(L2-L1,1)]; end;

%apply correlation and find index of maximum output
y = xcorr(x1,x2);
n = find(y == max(y)) ;
n = mod(n,L)+1;

%align x1 vector with x2
y1 = [x1(n:end); x1(1:n-1)] ;
y2 = x2;

return