Jump to content

    

Взаимнокорреляционная функция выдает максимум не в точке совпадения сигналов

Recommended Posts

tankist

Есть два сигнала: переданный и принятый. Необходимо найти позицию принятого сигнала в записи переданного. Запись переданного сигнала больше по времени в 3 раза, чем длительность принятого сигнала. Использую взаимнокорреляционную функцию для поиска позиции начала принятого буфера в записи переданного, но возникла проблема: иногда пик корреляции получается не при точном совпадении сигналов во времени, а с некоторым сдвигом. Как решить данную проблему?

Share this post


Link to post
Share on other sites

des00

ну например:

1. базу увеличить

2. сигнал-шум увеличить

3. алгоритм усложнить

4. посчитать вероятность неверного обнаружения при вашей базе и вашем сигнал-шуме и понять что ошибка всегда возможна)

Share this post


Link to post
Share on other sites

Alex11

Часто помогает (в смысле ранее предложенных пп. 2 и 3) профильтровать принятый сигнал и дальше считать корреляцию в более узкой полосе. Может быть придется пропустить через тот же фильтр и переданный, но это зависит от спектров.

Share this post


Link to post
Share on other sites

alexPec
6 часов назад, tankist сказал:

Как решить данную проблему?

Дурацкий вопрос: а у вас среднее значение функций на интервале корреляции часом не отличны от нуля? Сам на такое натыкался, только с двумерными функциями. А фильтр поди ка помогает тем что просто сдвигает среднее значение ближе к нулю

Share this post


Link to post
Share on other sites

tankist

Коррелируемые сигналы однополярные (положительные), соответственно, среднее значение больше нуля.

 

1. базу увеличить - это невозможно (если под базой вы понимаете интервал корреляции)

2. сигнал-шум увеличить - сигнал на приемнике получается с обратной связи передатчика, фактически он стремится к идеальному, я ничего уже улучшить не могу

3. алгоритм усложнить - хороший совет. Может подскажете какие-нибудь варианты?

 

Насколько я понял из советов, вы считаете, что проблема в том, что сигналы отличаются по форме из-за искажений. А может быть такое, что сигналы идеальны и одинаковы, но максимум корреляции все равно не в точке совпадения?

Edited by tankist

Share this post


Link to post
Share on other sites

Alex11

Поясните еще, насколько сильно отличается точки совпадения и максимума. Это совсем в стороне или в пределах одного отсчета? И какова примерно форма корреляционной функции - там один пик? И большой, относительно всего остального?

Share this post


Link to post
Share on other sites

alexPec
1 час назад, tankist сказал:

Коррелируемые сигналы однополярные (положительные), соответственно, среднее значение больше нуля

 

Сместите один из сигналов так чтобы среднее было 0 и скорее всего проблема решится. А так у вас ВКФ будет максимальна не в месте максимальной похожести сигнала, а там, где сигналы максимального уровня. Например, если один из сигналов сделать постоянным на некотором участке и максимального уровня, то тут и будет максимальна ВКФ. Произведения то складываются, а раз все положительные - то такая картина и получится. Ну это конечно если вы делаете корреляцию как sum(a1(i)*a2(i)), где а1 и а2 - отсчеты сигналов, и они всегда положительны. Может у вас какая-то другая хитрая математика.

1 час назад, tankist сказал:

 А может быть такое, что сигналы идеальны и одинаковы, но максимум корреляции все равно не в точке совпадения?

 

Как раз таки да, если оба сигнала всегда положительны. Максимум будет в точке где интеграл функции максимален.

Share this post


Link to post
Share on other sites

tankist
On 5/23/2022 at 5:42 PM, Alex11 said:

Поясните еще, насколько сильно отличается точки совпадения и максимума. Это совсем в стороне или в пределах одного отсчета? И какова примерно форма корреляционной функции - там один пик? И большой, относительно всего остального?

Различие не постоянно, максимально достигало до 15 отсчетов (кадр приемного сигнала 240 отсчетов). Пик не выраженный, при большом периоде тестового сигнала может иметь несколько одинаковых отсчетов максимума.

Quote

Сместите один из сигналов так чтобы среднее было 0 и скорее всего проблема решится.

В matalb вычислил значение mean() кадра, потом вычел его из отсчетов кадра у обоих сигналов. Результирующее отличие - 8 отсчетов при исходном 10. Но вообще заметил, что отличие сильно меняется в зависимости от смещения сигналов. У меня динамический диапазон сигналов 0~33000, при смещении вниз не на mean(), а на половину диапазона (16384), отличие становится равным 3 отсчета.

Quote

Может у вас какая-то другая хитрая математика

Нет, алгоритм вычисления классический.

Прикрепил для примера два кадра: g_rx - принятый, g_tx - переданный. Ищу позиции принятого в буфере переданного (сигнал периодический, позиций может быть несколько).

g_rx.dat g_tx.dat

Edited by tankist

Share this post


Link to post
Share on other sites

Eddy_Em

Я не понял, что у вас там не получается.

Вот:

rx = dlmread ('g_rx.dat');
tx = dlmread ('g_tx.dat');
[r lag] = xcorr(tx, rx);
	plot(lag, r);
print -dpng out.png

 

 

out.png

Share this post


Link to post
Share on other sites

Alex11

Впечатление складывается, что сдвиг появляется из-за несимметричности принятого сигнала. Можно попробовать отрезать данные так, чтобы данных от максимума в обе стороны было одинаковое количество (если это всегда возможно, т.е. у нас всегда есть пик). Но пики плавные, я не уверен, что это всегда будет хорошо. Можно попробовать решить задачу по-другому. Аппроксимировать пики принятого и посланного сигналов квадратичной функцией (они очень близки, и вычислительных затрат там немного) и затем вычислять сдвиг. При аппроксимации взять пик и данные до 1/3 амплитуды в обе стороны, если они есть.

Share this post


Link to post
Share on other sites

tankist
53 minutes ago, Alex11 said:

Впечатление складывается, что сдвиг появляется из-за несимметричности принятого сигнала. Можно попробовать отрезать данные так, чтобы данных от максимума в обе стороны было одинаковое количество (если это всегда возможно, т.е. у нас всегда есть пик). Но пики плавные, я не уверен, что это всегда будет хорошо. Можно попробовать решить задачу по-другому. Аппроксимировать пики принятого и посланного сигналов квадратичной функцией (они очень близки, и вычислительных затрат там немного) и затем вычислять сдвиг. При аппроксимации взять пик и данные до 1/3 амплитуды в обе стороны, если они есть.

К сожалению, принятый сигнал может быть захвачен в любом месте, не обязательно на вершине. При выбранной частоте сигнала в буфер приема попадает меньше одного периода.

21 hours ago, Eddy_Em said:

Я не понял, что у вас там не получается.

Вот:

 

rx = dlmread ('g_rx.dat');
tx = dlmread ('g_tx.dat');
[r lag] = xcorr(tx, rx);
	plot(lag, r);
print -dpng out.png

 

 

 

out.png

В вопросе четко сформулирована проблема, и она не в том, что я не могу сделать корреляцию. Попробуйте автоматизировать процесс поиска пика корреляции, а потом вырезать из переданного сигнала соответствующий кусок и наложите на один рисунок с принятым.

На всякий случай приведу код Matlab, которым провожу исследование:
 

path = 'd:\';
rx = importdata(strcat(path, 'g_rx.dat'));
tx = importdata(strcat(path, 'g_tx.dat'));

clear path;

m_conv = conv(tx, rx(end:-1:1));
m_conv = m_conv(240:240+480-1);

pos = find(m_conv == max(m_conv));

hold on;
plot(tx(pos:pos+240-1), 'b');
plot(rx, 'r');

 

corr_res.png

Куски волны должны совпадать во времени, но они не всегда совпадают. Я привел пример ситуации, когда полного совпадения нет.

Share this post


Link to post
Share on other sites

alexPec

Частично соглашусь с Alex11, виноват сигнал. А точнее, на мой взгляд, сказывается не несимметричность, а неполный период в образце. Остатки от полного периода остаются "за кадром", т.е. часть сигнала не учитывается в ВКФ, поэтому "возможны варианты" как поставить образец на принятый сигнал, максимизируя ВКФ.

Вообще, есть ведь функции с "плохой" АКФ и "хорошей". Например отличный пик у ЛЧМ сигнала.

Share this post


Link to post
Share on other sites

Eddy_Em
On 5/27/2022 at 2:22 PM, tankist said:

Попробуйте автоматизировать процесс поиска пика корреляции, а потом вырезать из переданного сигнала соответствующий кусок и наложите на один рисунок с принятым.

Элементарно могу это сделать: по производной, например…

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.