Вот моя цель:
Я пытаюсь найти способ поиска по сигналу данных и найти (индексировать) места, где находится известная повторяющаяся последовательность двоичных данных. Затем, поскольку известны код расширения и демодуляция, извлеките соответствующий чип данных и прочитайте его. В настоящее время я считаю, что xcorr справится с задачей.
Вот моя проблема:
Кажется, я не могу интерпретировать свой результат от xcorr или xcorr2, чтобы дать мне то, что я ищу. У меня либо проблема с перекрестными ссылками от местоположения вектора моей функции xcorr к моему вектору времени, либо проблема с правильной идентификацией моей последовательности данных с помощью xcorr, либо и то, и другое. Могут существовать и другие возможности.
Где я нахожусь/Что у меня есть:
Я создал случайный сигнал BPSK, который состоит из интересующей последовательности данных и мусорных данных за повторяющийся период. Я попытался обработать его с помощью xcorr, и здесь я застрял.
Вот мой код:
%% Clear Variables
clc;
clear all, close all;
%% Create random data
nbits = 2^10;
ngarbage = 3*nbits;
data = randi([0,1],1,nbits);
garbage = randi([0,1],1,ngarbage);
stream = horzcat(data,garbage);
%% Convert from Unipolar to Bipolar Encoding
stream_b = 2*stream - 1;
%% Define Parameters
%%% Variable Parameters
nsamples = 20*nbits;
nseq = 5 %# Iterate stream nseq times
T = 10; %# Number of periods
Ts = 1; %# Symbol Duration
Es = Ts/2; %# Energy per Symbol
fc = 1e9; %# Carrier frequency
%%% Dependent Parameters
A = sqrt(2*Es/Ts); %# Amplitude of Carrier
omega = 2*pi*fc %# Frequency in radians
t = linspace(0,T,nsamples) %# Discrete time from 0 to T periods with nsamples samples
nspb = nsamples/length(stream) %# Number of samples per bit
%% Creating the BPSK Modulation
%# First we have to stretch the stream to fit the time vector. We can quickly do this using _
%# simple matrix manipulation.
% Replicate each bit nspb/nseq times
repStream_b = repmat(stream_b',1,nspb/nseq);
% Tranpose and replicate nseq times to be able to fill to t
modSig_proto = repmat(repStream_b',1,nseq);
% Tranpose column by column, then rearrange into a row vector
modSig = modSig_proto(:)';
%% The Carrier Wave
carrier = A*cos(omega*t);
%% Modulated Signal
sig = modSig.*carrier;
Использование XCORR
Я использую xcorr2()
, чтобы устранить эффект заполнения нулями xcorr
на неравных векторах. Смотрите комментарии ниже для уточнения.
corr = abs(xcorr2(data,sig); %# pull the absolute correlation between data and sig
[val,ind] = sort(corr(:),'descend') %# sort the correlation data and assign values and indices
ind_max = ind(1:nseq); %# pull the nseq highest valued indices and send to ind_max
Теперь я думаю, что это должно выявить пять самых высоких корреляций между данными и сигналом. Они должны соответствовать конечному биту данных в потоке для каждой итерации потока, потому что я думаю, что именно здесь данные будут наиболее сильно коррелировать с сигналом, но это не так. Иногда максимумы не отличаются даже на одну длину потока. Так что я тут запутался.
Вопрос
В трехчастном вопросе:
Я пропустил определенный шаг? Как мне использовать xcorr в этом случае, чтобы найти, где данные и сигнал наиболее сильно коррелируют?
Весь мой метод неверен? Разве я не должен искать максимальные корреляции?
Или я должен атаковать эту проблему с другой стороны, то есть не использовать xcorr и, возможно, использовать фильтр или другую функцию?
data
в модулированном сигналеsig
? - person endowdly   schedule 24.04.2013xcorr
;) Пожалуйста, добавьте это - person Dan   schedule 24.04.2013corr = abs(xcorr2(data,sig);
затем я использовал простую сортировку, чтобы получить максимальное количество корреляций. Это то, что вы имеете в виду? Я только что отредактировал свой вопрос, чтобы лучше выделить блокxcorr
. - person endowdly   schedule 24.04.2013int16(xcorr2) == int16(xcorr(xcorr ~= 0)
на самом делеint16(xcorr2(data,sig)) == int16(xcorr(xcorr(data, sig) ~= 0)
?? Потому что, как у вас есть в вашем вопросе, похоже, что вы используетеxcorr
как переменную, а не функцию. - person Dan   schedule 24.04.2013corr = xcorr(x,y)
иcorr2 = xcorr2(x,y)
, тоint16(corr2) == int16(corr(corr ~= 0);
. Я просто пытался показать, почему я выбираю функцию xcorr2, а не xcorr. Прошу прощения, если это было запутанно, я отредактирую вопрос, чтобы прояснить это. - person endowdly   schedule 24.04.2013