cross correlation mismatch

I am facing a strange situation. I have a signal x (sum of sines and cosines) of length 50000 samples. One hand, I delay it directly by converting it into frequency domain and multiplying it by the delaying exponential,then ifft to produce y. One other hand, I delay it block by block using overlap add method (also in frequency domain) to produce z. Both produce exactly identical results.
%%OLA %%
clc
clear all
close all
fs=50000; % sampling frequency in Hz
f1=500; % frequency of signal in Hz
f2=400;
f3=300;
t_duration=1; %duration of LONG signal in seconds
t = 0:1/fs:t_duration-1/fs; %sampling points
% %x=square(2*pi*f3*(t)); %LONG input signal
x = 10*(sin(2*pi*f1*t)+sin(9*pi*f3*t)+cos(10*pi*300*(t))); %LONG input signal)+s
% % plot(x)
% load('rolo');
% x=mic_in(2,:);
%x=randn(size(t));
d=-0.00656438263; % time delay in seconds
P=1000; %block length
fax = fs*[(0:P/2) (-P/2+1:-1)]/P; % Create frequency shift vector in the frequency domain
h = ifft(exp(-1i*d*2*pi*fax)); %impulse response
L = length(h);
M = length(x);
% Pad x with zeros, as needed, to make M = QL for some integer Q
M_save = M;
r = P-mod(M,L);%%%%%check point%%%%%
M = M + r;
x_z = [x(:)' zeros(1,r)];
Q = M/L;
y = zeros(1,L+M_save-1);
% Compute h_z and H_z
N = 2^nextpow2(2*L); % FFT block length for max. computational efficiency
H_z = fft(h,N); %N-point fft of impulse response 'h'
% Compute y
y0 = zeros(1,L*(Q-1)+N);
y1 = zeros(1,N);
for i = 0 : Q-1
m = i*L;
x_i = x_z(m+1:m+L);
x_iz = [x_i(:)' zeros(1,N-L)];
X_iz = fft(x_iz);
y1 = ifft(X_iz.*H_z);
y0(m+1:m+N) = y0(m+1:m+N) + y1;
end
y = real(y0(1:L+M_save-1));
yd= [y(1:L-1)+y(end-(L-2):end) y(L:end-(L-1))];
tf=(0:length(y)-1)/fs;
y_z = 10*(sin(2*pi*f1*(t-d))+sin(9*pi*f3*(t-d))+cos(10*pi*300*((t-d)))); %analytic
stem(yd-y_z) % verification
But when I perform cross correlation between them using xcorr(x,y) I get peak at the correct number of samples(say 49 for example) but by doing xcorr(x,z), I get the peak at 49-1000=-951 samples. where 1000 is my block length in OLA method.
What is the reason behind this? How can I rectify it?

4 个评论

It sounds strange that your y and z are identical while xcorr gives different result for y and z, can you clarify?
That is my point of concern sir. Its actually shifted by 1000samples to the left. 1000 being the length of my block in OLA. If my block length is 100, then it is shifted by 100 samples.
Then why do you say they produce exactly identical results? Can you explain how you did overlap-add?
I have updated my code in question above. Please have a look. What am I missing?

请先登录,再进行评论。

回答(0 个)

标签

提问:

2012-3-12

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by