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

これで、データと sig の間の相関関係が最も高い 5 つが得られるはずです。これらは、ストリームの反復ごとにストリーム内のデータの最後のビットに対応する必要があります。これは、データが sig と最も強く相互相関する場所だと思うからですが、そうではありません。場合によっては、最大値が 1 ストリームの長さでさえ離れていないことがあります。だから私はここで混乱しています。

質問

3 部構成の質問:

  1. 特定のステップがありませんか?この場合、データと sig が最も強く相関している場所を見つけるために xcorr を使用するにはどうすればよいですか?

  2. 私の方法全体が間違っていますか?最大相関を探すべきではありませんか?

  3. または、この問題を別の角度から攻撃する必要がありますか、id est、xcorr を使用せず、おそらくフィルターまたは別の関数を使用する必要がありますか?

4

3 に答える 3

2

あなたの全体的な方法は素晴らしく、非常に理にかなっています。あなたが抱えている問題は、ガベージデータとの実際の相関関係を取得していることです。すべてのストリームをゼロ中心にシフトしたことに気付きましたが、データには同じことをしていませんでした。データをゼロ中心にすると、相関ピークがより明確になります (少なくとも、私が試したときはうまくいきました)。

data = 2*data -1;

また、単純な並べ替えを使用してピークを見つけることはお勧めしません。ノイズの多い信号で特に発生する可能性がある広いピークがある場合は、2 つの高いポイントが隣り合っている可能性があります。単一の最大値を見つけてから、その点といくつかの近傍をゼロにします。あとは好きなだけ繰り返します。または、エポックの長さがわかっている場合は、1 エポック分のデータとの相関のみを行い、信号が到着したら反復処理します。

于 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;

第 2 に、データが元のビット長であり、引き伸ばされた反復長ではない場合、信号内で見つけることができますが、非常にノイズが多くなります。ノイズを減らすには、単純にデータを引き伸ばして、反復信号で引き伸ばされた長さに一致させます。そう

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これで、このケースに対応することになり、 corrsnseqがあるべき場所に 5 つのインデックス時間が必要になります。c別のループ andまたはで簡単にビットを引き出すことができますlength(maxIndex)。また、これをより「現実世界」のおもちゃのスクリプトにしました。データ ストリーム、ドップラー、フェージングがあり、サンプルではなく秒単位の時間ベクトルです。

助けてくれてありがとう!

于 2013-05-02T10:38:12.453 に答える
0

信号を反転してみてください。

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

それはもっと良いですか?

于 2013-04-23T22:22:20.803 に答える