я пытаюсь написать код для взаимной корреляции передаваемого сигнала с полученным сигналом для определения задержки отсчетов - PullRequest
3 голосов
/ 17 октября 2011

Кросс-корреляция должна использоваться для измерения расстояния до воздушного судна путем передачи известный широкополосный сигнал и корреляция передаваемого сигнала с входящими сигналами получен через радиолокационную приемную антенну

Переданный сигнал x (n) имеет длину N = 512, а принятый сигнал y (n) имеет длину N = 2048.

у (п) = кх (п-г) + W (N); где 'kx (n-d)' - это x (n), задержанное на d выборок и ослабленное на коэффициент k, а w (n) - шум приема.

Я пытаюсь написать программу MATLAB для взаимной корреляции x (n) с y (n), чтобы определить значение d, количество задержек выборок. А также определить подходящую частоту дискретизации, если расстояние до самолета должно быть определяется в пределах 50 км с точностью до 50 м, учитывая, что передаваемый и полученные данные движутся со скоростью света.

Ответы [ 4 ]

4 голосов
/ 17 октября 2011

Самый простой способ сделать это с помощью функции "xcorr". Это часть панели инструментов обработки сигналов для Matlab, но она должна быть доступна для GNU Octave здесь . Я не проверял, полностью ли совместим октавный скрипт с MATLAB.

Вы можете использовать функцию xcorr как:

[correlation,lags] = xcorr(x,y);

Значение задержки можно найти с помощью

delay = lags(find(correlation==max(correlation)))

При скорости света сигнал будет распространяться со скоростью 3 x 10 ^ 8 м / с, поэтому, чтобы получить разрешение 50 м, необходимо производить выборку как минимум (3e8 / 50 м) = 6 МГц. При такой частоте дискретизации каждое отставание будет 1/6000000 секунды. Если вы умножите задержку на это значение, вы получите общее время между передачей и приемом сигнала. Умножьте это время на скорость света, чтобы получить расстояние.

3 голосов
/ 08 ноября 2012

мы можем игнорировать функцию 'find' в matlab, команду можно изменить на

delay = lags(correlation==max(correlation))

'xcorr' подходит для векторов с большой длиной;
'gcc' предпочитает кадр за кадром.

3 голосов
/ 03 ноября 2011

Вы можете использовать обобщенную взаимную корреляцию - Фазовое преобразование GCC PHAT. Ниже приведен код MATLAB для него

function time=GCCPHAT_testmode(b1,b2)

b1f=fft(b1);

b2f=fft(b2);

b2fc=conj(b2f);

neuma=(b1f).*(b2fc);

deno=abs((b1f).*(b2fc));

GPHAT=neuma./deno;

GPHATi=ifft(GPHAT);

[maxval ind]= max(GPHATi);

samp=ind

end
2 голосов
/ 06 августа 2014

Комментарий Aj463 выше хорош, действительно, GCC-PHAT лучше, чем невзвешенная корреляция для оценки задержки широкополосных сигналов.

Я бы предложил небольшое улучшение кода, размещенного выше: добавить небольшое значение epsilon к знаменателю, epsilon -> 0, чтобы избежать возможного деления на ноль.

Таким образом, я бы изменил строку

deno=abs((b1f).*(b2fc));

до

deno=abs((b1f).*(b2fc)) + epsilon; 
...