heldeintrlv
helintrlv
を使用したシンボルの並べ替えられた順序の復元
構文
[deintrlved,state] = heldeintrlv(data,col,ngrp,stp)
[deintrlved,state] = heldeintrlv(data,col,ngrp,stp,init_state)
deintrlved = heldeintrlv(data,col,ngrp,stp,init_state)
説明
[deintrlved,state] = heldeintrlv(data,col,ngrp,stp)
は、シンボルの順序を行ごとに配列に配置し、らせん状にグループを選択して出力 deintrlved
内に配置し、data
内のシンボルの順序を復元します。data
には、col*ngrp
要素がなければなりません。data
が複数行と列からなる行列の場合、col*ngrp
行がなければなりません。また、関数は列を個別に処理します。state
は、配列の最終状態を示す構造体です。state.value
には、配列の col
列内に維持され、出力に表示されない入力シンボルが格納されます。
この関数は内部計算に配列を使用します。配列には、1、2、3、... と順番にインデックス付けされる無限数の行と col
列があります。関数は配列の上位をゼロで初期化します。次に、col*ngrp
シンボルを入力から配列の次の ngrp
行に配置します。この関数は出力 intrlved
の配列からシンボルを配置し、同時に ngrp
シンボルを配置します。ngrp
シンボルの k 番目の集合は、行 1+(k-1)*stp
から始まる、配列の k 番目の列からのものです。出力シンボルの一部は入力シンボルではなく既定値 0 です。同様に、入力シンボルの一部は配列に残り、出力に表示されません。
[deintrlved,state] = heldeintrlv(data,col,ngrp,stp,init_state)
は、ゼロの代わりに init_state.value
に含まれているシンボルを使用して配列を初期化します。構造体 init_state
は通常、この同じ関数を以前に呼び出したときの state
出力で、対応するインターリーバーには無関係です。この構文では、出力シンボルの一部は既定値 0、一部は data
からの入力シンボル、一部は init_state.value
からの初期値です。
deintrlved = heldeintrlv(data,col,ngrp,stp,init_state)
は、デインターリーバーの最終状態を記録しないこと以外は、上の構文と同じです。この構文はこの関数への一連の呼び出しの最後に適しています。しかし、デインターリーバー処理を続行するためにこの関数を再度呼び出す場合は、上記の構文がより適しています。
インターリーバーとデインターリーバーの組み合わせの使用
この関数を関数 helintrlv
の逆関数として使用するには、両方の関数で同じ col
、ngrp
、および stp
入力を使用します。その場合は、両関数は、col*ngrp*ceil(stp*(col-1)/ngrp)
の複合遅延を考慮した後 helintrlv
に続いて heldeintrlv
を適用するとデータが変更されないという意味で逆関数といえます。畳み込みインターリーバーの遅延の詳細については、畳み込みインターリーバーの遅延を参照してください。
メモ
遅延は data
内のシンボル数の整数倍であるため、関数が遅延とそれ以外を示す結果を出力するには heldeintrlv
を最低でも "2 回" 使用しなければなりません (実際の遅延値によっては 2 回より多くなる可能性があります)。
例
インターリーバーとデインターリーバーの組み合わせの遅延を考慮して、インターリーブされたデータを復元します。
col = 4; ngrp = 3; stp = 2; % Helical interleaver parameters % Compute the delay of interleaver-deinterleaver pair. delayval = col * ngrp * ceil(stp * (col-1)/ngrp); len = col*ngrp; % Process this many symbols at one time. data = randi([0 9],len,1); % Random symbols data_padded = [data; zeros(delayval,1)]; % Pad with zeros. % Interleave zero-padded data. [i1,istate] = helintrlv(data_padded(1:len),col,ngrp,stp); [i2,istate] = helintrlv(data_padded(len+1:2*len),col,ngrp, ... stp,istate); i3 = helintrlv(data_padded(2*len+1:end),col,ngrp,stp,istate); % Deinterleave. [d1,dstate] = heldeintrlv(i1,col,ngrp,stp); [d2,dstate] = heldeintrlv(i2,col,ngrp,stp,dstate); d3 = heldeintrlv(i3,col,ngrp,stp,dstate); % Check the results. d0 = [d1; d2; d3]; % All the deinterleaved data d0_trunc = d0(delayval+1:end); % Remove the delay. ser = symerr(data,d0_trunc)
下記の出力はシンボル誤りが発生していないことを示します。
ser = 0
バージョン履歴
R2006a より前に導入