How to calculate Time Delay Estimation?

In summary, The cross-correlation between the received data and the transmitted data is highest when there is no delay between the transmission and the reception.
  • #1
Nate Duong
126
3
I have 2 data files, which links are attached below:
Transmitted data
https://www.dropbox.com/s/0nmhw6mpgh7upmv/TX.dat?dl=0
Received data
https://www.dropbox.com/s/xgyo6le3bcmd25r/RX.dat?dl=0

Those binary data are read by this MATLAB code:
%% initial values:
nsamps = inf;
nstart = 0;
%% input files
file_tx = 'test1-qpsk-8-8000.0-ksps.dat';
file_rx_tx_on = 'tx30-rx50-2017-03-29-14.48.56-utc.dat';
%% read files
x_tx = readcplx(file_tx, nsamps,nstart);
x_rx_on = readcplx(file_rx_tx_on, nsamps,nstart);
correlation = xcorr(x_tx,x_rx_on);


%% readcplx function:

function x = readcplx(filename,nsamps,nstart);
fid = fopen(filename);
fseek(fid,4 * nstart,'bof');
y = fread(fid,[2,inf],'short');
fclose(fid);
x = complex(y(1,:),y(2,: ) );

So, how can I perform Time Delay Estimation? Cross-correlation is the method to get time delay, but I still do not understand how.

Also, I am trying to look at these 2 signal in the spectrogram, but when I have images, I don't see them similar. they are supposed to be similar.

figure,
spectrogram(x_tx ,'yaxis'); title('transmitted file')
figure,
spectrogram(x_rx_on,'yaxis'); title('Received file')

I hope you can help me to understand this problem.
 
Engineering news on Phys.org
  • #2
I assume that elements of the arrays x_tx and x_rx_on are values of each at the same time. There should be an entry of the correlation array that is highest positive value. That should tell you how many frames of delay there was between the transmission and the reception. Then you can convert that number of delayed frames to a time delay.
 
  • Like
Likes Nate Duong
  • #3
FactChecker said:
I assume that elements of the arrays x_tx and x_rx_on are values of each at the same time. There should be an entry of the correlation array that is highest positive value. That should tell you how many frames of delay there was between the transmission and the reception. Then you can convert that number of delayed frames to a time delay.
for example: if I have sample rate Fs = 8MHz and number of delay frame = 800. So, time delay will be 800/8MHz =0.0001 (second) , is it right ?
 
  • #4
Nate Duong said:
for example: if I have sample rate Fs = 8MHz and number of delay frame = 800. So, time delay will be 800/8MHz =0.0001 (second) , is it right ?
Right. As long as the times of your two series match.
 
  • Like
Likes Nate Duong
  • #5
FactChecker said:
Right. As long as the times of your two series match.
I also have question, If you could help me to answer.
 
  • #6
Nate Duong said:
I also have question, If you could help me to answer.

The plot which is attached, show us 10 seconds receiver received from the transmitter. It means, every 1 second the receiver receives single transmit data with noise included. Can I get every single peak of cross-correlation and calculate time delay? if so, I will have 10 different delay, and I can see how much delay change in 10 seconds? for example, I will have a vector of the delay in every second [0.0018,0.0018,0.0018,0.0017,-0.001,-0.001,-0.001,-0.001,-0.‌001] is it right when I say that?
 

Attachments

  • 1qlfp.png
    1qlfp.png
    7.8 KB · Views: 611
  • #7
FactChecker said:
Right. As long as the times of your two series match.
Here is my update code:

%% initial values:
nsamps = inf;
nstart = 0;
Fs = 8e6; % sample rate
flag = 0; % plot in the for loop

%% input files
file_tx = 'test1-qpsk-8-8000.0-ksps.dat';
file_rx_tx_on = 'tx30-rx50-2017-03-29-14.48.56-utc.dat';

%% read files
x_tx = readcplx(file_tx, nsamps,nstart);
x_rx = readcplx(file_rx, nsamps,nstart);

%% mav : maximum absolute value
mav_tx = max(abs(x_tx));
mav_rx = max(abs(x_rx));

%% condition for selected gain
if ((mav_rx >= 1e3) && (mav_rx <= 1e4))
fprintf('satisfy condition ! \n');
else
fprintf('look and adjust the gain from RX and TX !\n');
end

%% reshape in 1s window:
rx_data_time = 10; % 10 seconds data file
factor = rx_data_time/10;
matric = reshape(x_rx, [Fs/rx_data_time*factor, rx_data_time+1]);
size_of = size(matric);
len = 1:size_of(1);

% figure, plot(abs(matric)); grid on;
% figure, plot(abs(matric(:,1))); grid on;
% rx_at_1st_second= x_rx(1:len);

%% plot s1 & s2:
s1 = x_tx;
t1 = (0:length(s1)-1)/Fs;
s2 = matric(:,1);
t2 = (0:length(s2)-1)/Fs;
figure, plot(t1,s1,t2,s2); title('before xcorr'); grid on;
legend('s1 TX','s2 RX');
xlabel('Time (s)');

%% delay calculation:
s1 = x_tx;
t1 = (0:length(s1)-1)/Fs;
time_delay_matrix = zeros(1, rx_data_time+1);

for i = 1: size_of(2)
s2 = matric(:,i);
t2 = (0:length(s2)-1)/Fs;
[corr,lag] = xcorr(s1, s2);
[~,I] = max(abs(corr));
lagDiff = lag(I); % delay
timeDiff = lagDiff/Fs;
time_delay_matrix(i) = timeDiff;

if flag
figure; plot(lag,abs(corr));
title('define the delay position');
grid on;
xlabel('samples');
% a3 = gca;
% a3.XTick = sort([-30000:1000:30000 lagDiff]);

if (lagDiff < 0)
lagDiff = lagDiff * (-1);
end

s2al = s2(lagDiff+1:end);
t2al = (0:length(s2al)-1)/Fs;

figure, title('after xcorr');
subplot(2,1,1); plot(t2al,abs(s2al)); title('s_2, aligned');
grid on;
axis([0 0.025 0 2e4])
subplot(2,1,2); plot(t1, abs(s1)); title('s_1');
grid on;
axis([0 0.025 0 3.1e4])
xlabel('Time (s)')
pause(3);
end
end
%% finish
fprintf('\n Done! \n\n');


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
So, the vector time_delay_matrix (size 1x10) is the delay estimation for every 1 second window, such as:

time_delay_matrix = [ 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018]

I do not think I did right, because the variation of the delay expecting change, but my this situation in here is zero:
(0.0018 - 0.0018 = 0)

My questions are:

Am I doing right or wrong?

how much variation do I see between those 10 measurements of delay?

I also think about the standard deviation and Average, but I do not know how? and what I can do with these to see the variation of delay? in nanosecond or in millisecond?

I am computing the time delay by interpolating between samples, and compute xcorr, how slight those changes are?


 
  • #8
FactChecker said:
I assume that elements of the arrays x_tx and x_rx_on are values of each at the same time. There should be an entry of the correlation array that is highest positive value. That should tell you how many frames of delay there was between the transmission and the reception. Then you can convert that number of delayed frames to a time delay.
Hi, are you still with me?
 
  • #9
Please limit your code to the part that is relevant to determining the delay and ask a specific question. I think that may be a small fraction of the code above. Also, please indent the code to show loop blocks and if-then blocks.
Why do you think the delay should change in different 1 second windows?
 
  • #10
Nate Duong said:
I am computing the time delay by interpolating between samples, and compute xcorr, how slight those changes are?
That will depend a lot on the nature of the data. If you have truly random data then there would be only one maximum with the rest of the values being zero. If the data has ' repeating' sequences, for instance. there can be spurious smaller peaks. It's a matter of the autocorrelation function.
 
  • Like
Likes Nate Duong
  • #11
If you are picking out the delay with the highest autocorrelation from a lot of samples, then that can hide a lot of occasional transient delays. One second of 8MHz data is a lot of data. Unless you think there is something that would cause a major, sustained delay, I wouldn't expect the answers to change from one second to another.
 
  • Like
Likes Nate Duong
  • #12
FactChecker said:
Please limit your code to the part that is relevant to determining the delay and ask a specific question. I think that may be a small fraction of the code above. Also, please indent the code to show loop blocks and if-then blocks.
Why do you think the delay should change in different 1 second windows?
sophiecentaur said:
That will depend a lot on the nature of the data. If you have truly random data then there would be only one maximum with the rest of the values being zero. If the data has ' repeating' sequences, for instance. there can be spurious smaller peaks. It's a matter of the autocorrelation function.

the data has ' repeating' sequences for every second, the RX data is representing for 10 second and they are kind of repeating, therefore I just need to separate for 1 second, then do xcorr, the expectation will be only 1 peak of maximum value, Please look at the the attached file, do you see it's weird?
 

Attachments

  • 1.PNG
    1.PNG
    31.4 KB · Views: 608
  • #13
FactChecker said:
If you are picking out the delay with the highest autocorrelation from a lot of samples, then that can hide a lot of occasional transient delays. One second of 8MHz data is a lot of data. Unless you think there is something that would cause a major, sustained delay, I wouldn't expect the answers to change from one second to another.
I could calculate and see every second, I have delay, such as:

delay =
0.010346125000000 0.010349000000000 0.010349875000000
0.010349000000000 0.010349750000000 0.010349750000000
0.010349750000000 0.010349750000000 0.010348875000000
0.010348875000000 0.010348875000000


the changing in every second because of noise existing.

Maybe, I am doing wrong, because when i look at the plot of the xcorr, it looks weird to me
 
  • #14
FactChecker said:
If you are picking out the delay with the highest autocorrelation from a lot of samples, then that can hide a lot of occasional transient delays. One second of 8MHz data is a lot of data. Unless you think there is something that would cause a major, sustained delay, I wouldn't expect the answers to change from one second to another.
please look at the plot.
 

Attachments

  • 1.PNG
    1.PNG
    34.8 KB · Views: 598
  • #15
Nate Duong said:
the data has ' repeating' sequences for every second, the RX data is representing for 10 second and they are kind of repeating, therefore I just need to separate for 1 second, then do xcorr, the expectation will be only 1 peak of maximum value, Please look at the the attached file, do you see it's weird?
What are we looking at here?
Three time charts: tx, rx, xcorr? No, that can't be right -- the scale of the 3'rd graph Y axis is too large to be xcorr.
One second of data? No, that can't be right -- 8x105 data samples at 8MHz would be 1/10 second.
I'm getting tired of trying to figure this out.
 
  • Like
Likes Nate Duong

FAQ: How to calculate Time Delay Estimation?

1. How is Time Delay Estimation calculated?

Time Delay Estimation is calculated using the difference in arrival times of a signal at two different locations. This time difference is then divided by the speed of the signal to determine the distance between the two locations.

2. What is the speed of the signal used in Time Delay Estimation?

The speed of the signal used in Time Delay Estimation can vary depending on the type of signal being used. For example, the speed of sound in air is approximately 343 meters per second, while the speed of light in a vacuum is approximately 299,792,458 meters per second. It is important to determine the correct speed for the specific signal being used in the calculation.

3. Can Time Delay Estimation be used for any type of signal?

Time Delay Estimation can be used for a variety of signals, such as sound, radio waves, and light. However, the accuracy of the calculation may vary depending on the speed of the signal and the distance between the two locations.

4. What are some potential sources of error in Time Delay Estimation?

Some potential sources of error in Time Delay Estimation include inaccurate measurement of the time difference, variations in the speed of the signal due to environmental factors, and the presence of noise in the signal. It is important to carefully consider and account for these factors in the calculation.

5. How can Time Delay Estimation be used in scientific research?

Time Delay Estimation can be used in a variety of scientific research fields, such as astronomy, geology, and biology. It can be used to determine the location of a signal source, measure the speed of a moving object, or study the effects of distance on signal transmission. It is a valuable tool for understanding the physical world and making accurate measurements.

Similar threads

Replies
4
Views
2K
Replies
1
Views
1K
Back
Top