Solution to Cross-correlation problem of 2 audio signals There are 2 audio signals, X &amp; Y.
X is of 15 second duration. The duration of Y is not given.
Y is a part of signal X (ie a small part of audio X is extracted &amp; made into audio Y)
I have to find the starting &amp; ending location, in seconds, in the signal X from where signal Y is derived.
I was told to NOT use built-in MATLAB functions like conv, xcorr etc.  

So I wrote a MATLAB code which compares sample by sample of X &amp; Y starting from the 1st sample.  

clear;
[A1,FS1,NBITS1]=wavread('x.wav');
[A2,FS2,NBITS2]=wavread('y.wav');

for i=1:(length(A1)-length(A2)),
    if(A1(i:i+length(A2)-1) == A2)
        found = 1;
        time1 = i/FS1;
        time2 = (i+length(A2))/FS1;
        break;
    else
        found=0;
    end
end   


A1 has 120000 samples, FS1 = 8000, NBITS1 = 16
A2 has 20000 samples, FS2 = 8000, NBITS2 = 16
Therefore,
120000/8000 = 15 sec(length of audio X)
20000/8000 = 2.5 sec(length of audio Y)  

time1(starting time) = 6.5001 sec
time2(ending time) = 9.0001 sec  

Just to make sure the code was correct, I plotted the impulse response of X &amp; Y using fvtool &amp; found that the impulse response of Y matches that of X between 6.5 to 9 seconds.  

Now I want to verify the result using built-in MATLAB functions, namely xcorr
So I used   

A3 = xcorr(A1,A2);  
plot(A3);  



A3 is 239999 samples long. Then using  

[max idx] = max(A3)  


Using the above index location I found the location of maximum correlation value to be at sample 172000. which gives the midpoint at 172000/8000=21.5sec(clearly wrong). However, the location of the maximum correlation value must come to 7.7501 samples. How do I obtain that from the above value?
Having looked at how xcorr is defined I think I know what is happening.

There are two issues:


The range of xcorr is $2N-1$ (N = length of signal X). The initial values are for negative shifts and the second half is positive shifts. Therefore subtract 120000 to get the correct shift.
xcorr pads Y with zeros to the same length as X. The first 20000 points will be sample Y and the rest of the data zeros. Therefore the value of the maximum correlation will be the start point, not the mid point of the signal (as I originally thought). To prove this think what would happen if Y was the beginning of signal X.


If we now do this on your data we get a start point of (172000-12000)/8000=6.5seconds as expected. The 0.0001 sec comes from how you've defined the first point in time.

However, this is a pretty bad way to do it as any noise in the signal Y will cause your algorithm to fail. I suspect the aim of this task is to manually right code to calculate the correlation function in a similar way to corr does and then find the maximum.