1. 程式人生 > >利用matlab求兩個訊號的延遲

利用matlab求兩個訊號的延遲

fs=10e4;
T=1/fs;
L=1000;
t=(0:L-1)*T;
f0=10e3;
x=sin(2*pi*f0*t);
y=x(100:200);
z=x(103:203);
%delay=xcorr(y,y,'coeff');
[delay,zuobiao]=xcorr(y,z,'coeff');
figure(1)
plot(y);
hold on
plot(z);
figure(2)
stem(zuobiao,delay)

zuobiao(find(delay==max(delay)))

ans =

     3

可以求出兩個正弦訊號的延遲為3個取樣間隔。

貌似xcorr函式只能求整數延遲,我在一個專案中需要求分數時延,我的思路是將訊號插值n倍,再將時延結果縮小1/n。

部分程式碼如下:

x=1:4900;
xi=x(1):(x(2)-x(1))/10:x(end);
in=src_data(x);
out=delay_data(x);

delay_data_10=interp1(x,out,xi);
src_data_10=interp1(x,in,xi);
figure(2)
plot(src_data_10/max(src_data));
hold on
plot(delay_data_10/max(delay_data));
%%自相關函式
[delay,zuobiao]=xcorr(src_data_10,delay_data_10,'coeff');
figure(3)
stem(zuobiao,delay)
%延遲
zuobiao(find(delay==max(delay)))

其中interp1是插值函式,詳見help文件。