Перейти к содержанию
    

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну например:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

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

 

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

Изменено пользователем tankist

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

1 час назад, 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

Изменено пользователем tankist

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вот:

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

 

 

out.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...