exponenta event banner

Выравнивание двух простых сигналов

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

Рассмотрим два сигнала, идентичных за исключением числа окружающих нулей и того факта, что один из них отстает от другого.

sz = 30;
sg = randn(1,randi(8)+3);
s1 = [zeros(1,randi(sz)-1) sg zeros(1,randi(sz)-1)];
s2 = [zeros(1,randi(sz)-1) sg zeros(1,randi(sz)-1)];

mx = max(numel(s1),numel(s2));

subplot(2,1,1)
stem(s1)
xlim([0 mx+1])

subplot(2,1,2)
stem(s2,'*')
xlim([0 mx+1])

Figure contains 2 axes. Axes 1 contains an object of type stem. Axes 2 contains an object of type stem.

Определите, какой из двух сигналов длиннее другого в смысле наличия большего количества элементов, будь то нули или нет.

if numel(s1) > numel(s2)
    slong = s1;
    sshort = s2;
else
    slong = s2;
    sshort = s1;
end

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

[acor,lag] = xcorr(slong,sshort);

[acormax,I] = max(abs(acor));
lagDiff = lag(I)
lagDiff = 15
figure
stem(lag,acor)
hold on
plot(lagDiff,acormax,'*')
hold off

Figure contains an axes. The axes contains 2 objects of type stem, line.

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

  • Если lagDiff является положительным, «сокращает» длинный сигнал, рассматривая его элементы из lagDiff+ 1 до конца.

  • Если lagDiff отрицательный, «удлиняют» короткий сигнал, рассматривая его элементы из -lagDiff+ 1 до конца.

Необходимо добавить 1 к разнице запаздывания, поскольку MATLAB ® использует индексирование на основе одного элемента.

if lagDiff > 0
    sorig = sshort;
    salign = slong(lagDiff+1:end);
else
    sorig = slong;
    salign = sshort(-lagDiff+1:end);
end

Постройте график выровненных сигналов.

subplot(2,1,1)
stem(sorig)
xlim([0 mx+1])

subplot(2,1,2)
stem(salign,'*')
xlim([0 mx+1])

Figure contains 2 axes. Axes 1 contains an object of type stem. Axes 2 contains an object of type stem.

Метод работает, потому что операция взаимной корреляции является антисимметричной и потому что xcorr имеет дело с сигналами разной длины, добавляя нули в конце более короткого сигнала. Эта интерпретация позволяет легко выравнивать сигналы с помощью MATLAB ®end оператор без необходимости укладывать их вручную.

Можно также выровнять сигналы в один ход, вызвав alignsignals функция.

[x1,x2] = alignsignals(s1,s2);

subplot(2,1,1)
stem(x1)
xlim([0 mx+1])

subplot(2,1,2)
stem(x2,'*')
xlim([0 mx+1])

Figure contains 2 axes. Axes 1 contains an object of type stem. Axes 2 contains an object of type stem.

См. также

|