Forums

result of cross correlation

Started by sangthong January 27, 2008
Hi,

I quiet confuse with using 'xcorr' function. I understand that there is a
problem of wrap-around effect so it gives the result of N+M-1, but I don't
understand how to observe that the result of the correlation occurs at the
right place.

For example, if I have signal x(t) = 1024 numbers (length) and same for
y(t) but the later is padded to zero and I copy 501:532 of x(t) into y(t)
I should have the peak occur at 501.

However from the function xcorr(x(t),y(t)), which gave me the result of
length 2047 as expected and it gave me a peak at 1024 and when I change
the copy series from x(t) to 301:332, I still got the result with paek at
1024.

So could anyone explain to me what should it be or what function do I need
so as to do the cross correlation in matlab correctly?

Thanks,
Sangthong 
Hi,

I forgot to detail that as I changed the series I copied from x(t) to
y(t), the overall signal has moved its location from left to right, but
the peak was at the same location (at 1024). I still don't get it, please
explain if you could.

Thanks,
Sangthong
"sangthong" <sangthong2548@yahoo.com> wrote in message 
news:o46dndLmdo-0oQDanZ2dnUVZ_uSgnZ2d@giganews.com...
> Hi, > > I forgot to detail that as I changed the series I copied from x(t) to > y(t), the overall signal has moved its location from left to right, but > the peak was at the same location (at 1024). I still don't get it, please > explain if you could. > > Thanks, > Sangthong
You need to manage the indices. That is, you need to keep track of where time=0 is. It would also be helpful to express your situation more clearly. I take it that you mean this: There is a sequence x(k) that represents a time sequence. There is another sequence y(k) that represents another time sequence. For some reason, it appears y(k) is shorter than x(k) because you said you zero-padded y(k). Is that right? Now, is y(k) shorter than x(k) because it has a different underlying sample rate? Or, is y(k) shorter than x(k) just because it covers a different/shorter time span? This is important!! You need to have sequences with the same underlying sample rate. Perhaps you're already there. Anyway, only then can you make them the same length by zero-padding the shorter one or plug them into xcorr. Then, it appears you're summing a segment of one into the other so that you can do some correlation computation experiments. Right? If you know where zero time is for each sequence then it should be easy to know the time at which the summed short sequence is placed. xcorr takes care of the zero padding. The description of xcorr isn't very easy to figure out how the indices work out but that's something you have to figure out. You could experiment with some very simple functions - that's what I do. I haven't thought about it much but the "time" scale for the correlated output is expressed in "delay" and not absolute time. Does that help at all? I think it means that you have to decide for yourself how the scales relate. It takes a bit of time and effort. Fred
Thanks, Fred

I think I can figure out the relationship of the scale now as I've tried
and compared the result with the correlation by FFT method, which I can
get the same result and I can shift the lag time backward and get the
correct location of the peak.

However, I now have a problem that for some correlation, if the signal of
y(t) that I have copied from part of signal x(t) is very small, there will
be a problem that the peak occurs at the wrong location because at some
point, the amplitude of data is higher than the expected peak at
particualr location. I don't know how to fix this. I've thought of
normalized cross correlation because I've read that it will give the peak
at amplitude of 1, am I correct about this?

and how can I do this in Matlab? I found only the function for 2D
normalized cross correlation not for 1D. Do you have any idea about the
code to do so?

Thanks,
Sangthong
"sangthong" <sangthong2548@yahoo.com> wrote in message 
news:vuadnXWJybqDdy3anZ2dnUVZ_judnZ2d@giganews.com...
> Thanks, Fred > > I think I can figure out the relationship of the scale now as I've tried > and compared the result with the correlation by FFT method, which I can > get the same result and I can shift the lag time backward and get the > correct location of the peak. > > However, I now have a problem that for some correlation, if the signal of > y(t) that I have copied from part of signal x(t) is very small, there will > be a problem that the peak occurs at the wrong location because at some > point, the amplitude of data is higher than the expected peak at > particualr location. I don't know how to fix this. I've thought of > normalized cross correlation because I've read that it will give the peak > at amplitude of 1, am I correct about this? > > and how can I do this in Matlab? I found only the function for 2D > normalized cross correlation not for 1D. Do you have any idea about the > code to do so? > > Thanks, > Sangthong
I think you're at the stage where it would help to think of the correlation process in a somewhat different framework. Correlation, particularly when one of the sequences is short, is perhaps better viewed as a filtering operation. When you have a short sequence, that's the same as a short filter. A short filter generally has frequency response that's coarser than a long filter. Take two cases (one of which is the one you stated): Case 1: A long and relatively noisy sequence. Compute the autocorrelation. Convolve it with itself. Think of this as a matched filter. When the registration is exact you expect to get maximum output. Case 2: Same as above but take shorter and shorter sequences to be the "filter" half of the convolution. As the filter gets shorter, the correlation peak is reduced. As the filter gets shorter, it's possible that some parts of the longer sequence actually correlate *better* than its exact matched sequence because: - they are shaped similarly enough .. are "OK" - the "OK" parts have higher amplitude than the exact match. Note that the correlation peak will reduce more or less proportionately to the length of the "filter" sequence. Is it obvious enough why? I have avoided getting into time reversal and the difference between convolution and correlation. If the sequences are even, it doesn't matter. If not, then you can figure it out. Fred
>I think you're at the stage where it would help to think of the
correlation
>process in a somewhat different framework. Correlation, particularly
when
>one of the sequences is short, is perhaps better viewed as a filtering >operation. When you have a short sequence, that's the same as a short >filter. A short filter generally has frequency response that's coarser
than
>a long filter. > >Take two cases (one of which is the one you stated): >Case 1: A long and relatively noisy sequence. Compute the
autocorrelation.
>Convolve it with itself. Think of this as a matched filter. When the >registration is exact you expect to get maximum output. > >Case 2: Same as above but take shorter and shorter sequences to be the >"filter" half of the convolution. As the filter gets shorter, the >correlation peak is reduced. As the filter gets shorter, it's possible
>that some parts of the longer sequence actually correlate *better* than
its
>exact matched sequence because: >- they are shaped similarly enough .. are "OK" >- the "OK" parts have higher amplitude than the exact match. >Note that the correlation peak will reduce more or less proportionately
to
>the length of the "filter" sequence. Is it obvious enough why? > >I have avoided getting into time reversal and the difference between >convolution and correlation. If the sequences are even, it doesn't
matter.
>If not, then you can figure it out. > >Fred > > >
Thanks again, I think I understand the problem now. I've found out that as I used x(t) as a random number (with the same location of y(t) copied from x(t)) and each time I randomed it, the correlation gave peaks at different locations, only some times that it gave peaks at the correct lcoation. So now I know that it's up to the amplitude of orginal data. But I still don't understand how to solve the problem. Does normalization do the job. I've tried but it didn't work out correctly.