Finding delay b/w two signals using gccphat
1 次查看(过去 30 天)
显示 更早的评论
Hi all
I am simulating signals on two hydrophones H1 and H2 of linear array which are at a distance 'd' from each other. The geometry is shown below:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1284965/image.jpeg)
Assuming Plane Wave assumption, there will be some delay b/w signals arriving at H1 and H2 assuming zero noise and pure sinusoidal signals. After simulating the signals with delays, I am trying to calculate back the delay using MATLAB 'gccphat' function, but its output does not match with the delay simulated in signals? MATLAB code is given below:
clc
clear
close all
%%%%=======================================================================
%%%%============================General Parameters=========================
%%%%=======================================================================
total_sens=2;
fo=8500;%frequency in Hz
samp_f=30*51.2e3;%Sampling frequency
samp_t=1/samp_f;
chunk_size=163840;
total_chunks=1;
chunk_time=chunk_size/samp_f;
chunk_t=0:samp_t:(samp_t*(chunk_size-1));%time vector calculated
c=1500;%speed of sound
%%%%=======================================================================
%%%%=====================DA PRA Array Parameters===========================
%%%%=======================================================================
D=15;%separation b/w sensors in m
Target_theta=40;%Source angle in deg
delay_=D*sind(Target_theta)/c
H1(1:chunk_size,1)=sin(2*pi*fo*(chunk_t))+0*randn(1,chunk_size);%Sensor H1 signal
H2(1:chunk_size,1)=sin(2*pi*fo*(chunk_t+delay_))+0*randn(1,chunk_size);%Sensor H2 signal
% figure,plot(H1(1:2000)),hold on,plot(H2(1:2000),'r')
tau12=gccphat(H1,H2,samp_f)
The simulated delay_ is approx. 0.0064s whereas delay calculated by 'gccphat is 0s?.
Kindly help me in this regard. Thanks
0 个评论
回答(1 个)
Mathieu NOE
2023-3-6
编辑:Mathieu NOE
2023-3-6
hello
I think I can get the correct result with the regular xcorr function (I have not the toolbox for gccphat function)
but I needed to create more "realistic" signals. With you definition, both signals are sine stationnary signals without any amplitude shape that also includes the delay
So I opted for a bell (gaussian) shaped amplitude modulation. and you will see that xcorr gives the correct value in that case
clc
clearvars
close all
%%%%=======================================================================
%%%%============================General Parameters=========================
%%%%=======================================================================
total_sens=2;
fo=8500;%frequency in Hz
samp_f=30*51.2e3;%Sampling frequency
samp_t=1/samp_f;
chunk_size=163840;
% chunk_size=20000;
total_chunks=1;
chunk_time=chunk_size/samp_f;
chunk_t=samp_t*(0:(chunk_size-1));%time vector calculated
c=1500;%speed of sound
%%%%=======================================================================
%%%%=====================DA PRA Array Parameters===========================
%%%%=======================================================================
D=15;%separation b/w sensors in m
Target_theta=40;%Source angle in deg
delay_=D*sind(Target_theta)/c % in seconds
delay_samples = round(delay_*samp_f); % in samples
% your signals definition
H1(1:chunk_size,1)=sin(2*pi*fo*(chunk_t))+0*randn(1,chunk_size);%Sensor H1 signal
H2(1:chunk_size,1)=sin(2*pi*fo*(chunk_t+delay_))+0*randn(1,chunk_size);%Sensor H2 signal
figure,plot(H1(1:2000)),hold on,plot(H2(1:2000),'r')
% compute delay with xcorr
[c_a, lag_a] = xcorr(H1,H2);
[~, i_a] = max(c_a);
tau_xcorr = lag_a(i_a)/samp_f % lag in seconds (incorrect)
% tau_gccphat = gccphat(H1,H2,samp_f)
% % my signals definition
t0 = round(chunk_size/2)/samp_f; % create a bell shaped signal with a peak of the bell located mid x range
H1(1:chunk_size,1)=exp(-(chunk_t-t0).^2/4e-4).*sin(2*pi*fo*(chunk_t))+0*randn(1,chunk_size);%Sensor H1 signal
H2(1:chunk_size,1)= exp(-(chunk_t+delay_-t0).^2/4e-4).*sin(2*pi*fo*(chunk_t+delay_))+0*randn(1,chunk_size);%Sensor H2 signal
figure,plot(H1),hold on,plot(H2,'r')
% compute delay with xcorr
[c_a, lag_a] = xcorr(H1,H2);
[~, i_a] = max(c_a);
tau_xcorr = lag_a(i_a)/samp_f % lag in seconds (correct)
% tau_gccphat = gccphat(H1,H2,samp_f)
1 个评论
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!