Этот пример показывает, как использовать перекрестную корреляцию для выравнивания сигналов. В самом общем случае сигналы имеют разную длину, и чтобы синхронизировать их правильно, необходимо учитывать длины и порядок, в котором вы вводите аргументы 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])
Определите, какой из двух сигналов длиннее другого в смысле наличия большего количества элементов, будь то нули или нет.
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
Выровняйте сигналы. Считайте, что отстающий сигнал «длиннее», чем другой, в том смысле, что вы должны «подождать дольше», чтобы обнаружить его.
Если 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])
Метод работает, потому что операция перекрестной корреляции является антисимметричной и потому 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])