3

这是我的目标:

我试图找到一种方法来搜索数据信号并找到(索引)已知重复二进制数据序列所在的位置。然后,因为扩频码和解调是已知的,所以拉出对应的数据码片读取。目前,我相信 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

现在,我认为这应该拉动 data 和 sig 之间的五个最高相关性。对于流的每次迭代,这些应该对应于流中数据的结束位,因为我认为这是数据与 sig 最强烈交叉相关的地方,但事实并非如此。有时最大值甚至不是一个流长度。所以我在这里很困惑。

问题

在一个三部分的问题中:

  1. 我错过了某个步骤吗?在这种情况下,我如何使用 xcorr 来查找数据和 sig 最密切相关的位置?

  2. 我的整个方法错了吗?我不应该寻找最大相关性吗?

  3. 或者我应该从另一个角度解决这个问题,id est,不使用 xcorr,也许使用过滤器或其他功能?

4

3 回答 3

2

你的整体方法很棒,很有意义。您遇到的问题是您与垃圾数据有一些实际的相关性。我注意到您将所有的 sream 都以零为中心,但对您的数据却没有这样做。如果您将数据归零,您的相关峰值将得到更好的定义(至少在我尝试时有效)。

data = 2*data -1;

另外,我不建议使用简单的排序来查找您的峰值。如果你有一个很宽的峰值,尤其是在有噪声信号的情况下,你可以有两个相邻的高点。找到一个最大值,然后将该点和几个邻居归零。然后重复你喜欢的次数。或者,如果您知道您的 epoch 有多长,只需与一个 epoch 的数据价值进行关联,并在信号到达时对其进行迭代。

于 2013-04-24T20:05:42.593 回答
1

在@David K 和@Patrick Mineault 的帮助下,我设法找出了哪里出错了。首先@Patrick Mineault 建议我翻转信号。查看您对结果的期望的最佳方法是沿着搜索到的较大向量滑动小向量。所以

corr = xcorr2(sig,data);

然后我喜欢把结尾剪掉,因为它只是额外的。我使用我制作的修剪功能做到了这一点,该功能只需获取您正在滑动的信号并修剪它与 xcorr 结果末尾无关的部分。

trim = @(x,s2) x(1:end - (length(s2) - 1));
trim(corr,data);

然后,正如@David K 建议的那样,您需要将您正在寻找的数据流编码为与您搜索的信号相同。所以在这种情况下

data = 2*data-1;

其次,如果您的数据只是原始位长度,而不是拉伸、迭代长度,则可以在信号中找到它,但会非常嘈杂。为了减少噪声,只需拉伸数据以匹配它在迭代信号中的拉伸长度。所以

rdata = repmat(data',1,nspb/nseq);
rdata = repmat(rdata',1,nseq);
data = rdata(:)';

现在最后,我们应该对这个案例有非常清晰的相关性。并拉出应该对应于我写的那些相关性的最大值

[sortedValues sortIndex] = sort(corr(:),'descend');
c = 0 ;
for r = 1 : length(sortedValues)
    if sortedValues(r,:) == max(corr)
        c = c + 1;
        maxIndex(1,c) = sortIndex(r,:);
    else break % If you don't do this, you get loop lock
    end
 end 

现在c应该最终nseq适用于这种情况,并且您应该有 5 个索引时间,corrs 应该是!c您可以使用另一个循环和or轻松拉出位length(maxIndex)。我还把它做成了一个更“真实世界”的玩具脚本,其中有一个数据流、多普勒、衰落,它是在几秒钟内超过一个时间向量而不是样本。

谢谢您的帮助!

于 2013-05-02T10:38:12.453 回答
0

尝试翻转信号,即:

corr = abs(xcorr2(data,sig(end:-1:1));

这样更好吗?

于 2013-04-23T22:22:20.803 回答