Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

16-QAM 信号でのパルス整形の使用

この例はMATLAB を使用した 16-QAM の調査の例を拡張したもので、一組のルート レイズド コサイン (RRC) フィルターを使用してパルス整形とレイズド コサイン フィルター処理を実行します。フィルターは関数rcosdesignで作成します。この通信リンクに前方誤り訂正 (FEC) を追加すると BER 性能を改善できます。パルス整形フィルターを適用した通信リンクの例に FEC を追加するには、16-QAM 信号での前方誤り訂正の使用の例を参照してください。

この例では、ベースバンド変調器、チャネル、復調器、およびパルス整形とレイズド コサイン フィルターで構成される通信リンクを使用してバイナリ データ ストリームを処理する方法を示します。この例では、ビット エラー レート (BER) を計算し、フィルターの効果をアイ ダイアグラムに表示し、送信信号と受信信号をコンスタレーション ダイアグラムに表示します。

シミュレーションのフレームワークの確立

16-QAM 変調スキームとレイズド コサイン フィルター処理、および AWGN チャネルについて、シミュレーション パラメーターを定義します。

M = 16;            % Modulation order
k = log2(M);       % Bits per symbol
numBits = k*7.5e4; % Bits to process
sps = 4;           % Samples per symbol (oversampling factor)

RRC フィルターの作成

RRC フィルターのパラメーターを設定します。

filtlen = 10;      % Filter length in symbols
rolloff = 0.25;    % Filter rolloff factor

関数rcosdesignを使用して、RRC フィルターを作成します。

rrcFilter = rcosdesign(rolloff,filtlen,sps);

impzを使用して、RRC フィルターのインパルス応答を表示します。

impz(rrcFilter)

システム BER の計算

関数randiを使用して、ランダムなバイナリ データを生成します。例で結果を繰り返し再現できるように、関数rngを既定の状態または静的なシード値に設定します。

rng default;                     % Default random number generator
dataIn = randi([0 1],numBits,1); % Generate vector of binary data

関数bit2intを使用して、k 組のバイナリ ワードを整数シンボルに変換します。

dataSymbolsIn = bit2int(dataIn,k);

関数qammodを使用して、16-QAM 変調を適用します。

dataMod = qammod(dataSymbolsIn,M);

関数upfirdnを使用して、オーバーサンプリング係数で信号をアップサンプリングし、RRC フィルターを適用します。関数 upfirdn は、アップサンプリングされた信号の最後にゼロをパディングしてフィルターをフラッシュします。その後、この関数でフィルターが適用されます。

txFiltSignal = upfirdn(dataMod,rrcFilter,sps,1);

シンボルあたりのビット数 (k)、シンボルあたりのサンプル数 (sps)、および関数convertSNRを使用して、ノイズ パワー スペクトル密度に対する 1 ビットあたりのエネルギーの比 (EbNo) を関数awgnで使用する SNR 値に変換します。

EbNo = 10;
snr = convertSNR(EbNo,'ebno', ...
    samplespersymbol=sps, ...
    bitspersymbol=k);

フィルター処理された信号を AWGN チャネルを通して渡します。

rxSignal = awgn(txFiltSignal,snr,'measured');

関数upfirdnを受信信号に対して使用して、信号をダウンサンプリングしてフィルター処理します。ダウンサンプリングには、送信信号のアップサンプリングで適用した同じオーバーサンプリング係数を使用します。フィルター処理には、送信信号に適用した同じ RRC フィルターを使用します。

それぞれのフィルター処理の操作により、信号がシンボル内のフィルターの長さの半分である filtlen/2 ずつ遅延します。したがって、送信と受信のフィルター処理による遅延の合計はフィルターの長さである filtlen と等しくなります。BER の計算では、送信信号と受信信号のサイズが同じでなければならず、送信信号と受信信号の間の遅延を考慮しなければなりません。送信と受信のフィルター処理の操作による累積遅延を考慮して、間引き後の信号から最初の filtlen 個のシンボルを削除します。復調器の出力のサンプル数が変調器の入力のサンプル数と一致するように、間引き後の信号から最後の filtlen 個のシンボルを削除します。

rxFiltSignal = ...
    upfirdn(rxSignal,rrcFilter,1,sps);       % Downsample and filter
rxFiltSignal = ...
    rxFiltSignal(filtlen + 1:end - filtlen); % Account for delay

関数qamdemodを使用して、フィルター処理された受信信号を復調します。

dataSymbolsOut = qamdemod(rxFiltSignal,M);

関数int2bitを使用して、復元された整数シンボルをバイナリ データに変換します。

dataOut = int2bit(dataSymbolsOut,k);

関数biterrを使用して、誤り数と関連する BER を求めます。

[numErrors,ber] = biterr(dataIn,dataOut);
fprintf(['\nFor an EbNo setting of %3.1f dB, ' ...
    'the bit error rate is %5.2e, based on %d errors.\n'], ...
    EbNo,ber,numErrors)
For an EbNo setting of 10.0 dB, the bit error rate is 1.92e-03, based on 575 errors.

フィルター効果の可視化

フィルターの効果をアイ ダイアグラムで可視化するには、Eb/N0 の設定を小さくして受信データを再生成します。アイ ダイアグラムを使用して、他のマルチパスの影響がない高 SNR 信号を可視化することにより、パルス整形 RRC フィルターのペアの出力で符号間干渉 (ISI) の低減を強調表示できます。RRC フィルターの ISI は、2 つ目の RRC フィルターと組み合わせられ、カスケード状のレイズド コサイン フィルターが形成されるまで、ゼロになりません。

EbNo = 20;
snr = convertSNR(EbNo,'ebno', ...
    samplespersymbol=sps, ...
    bitspersymbol=k);
rxSignal = awgn(txFiltSignal,snr,'measured');
rxFiltSignal = ...
    upfirdn(rxSignal,rrcFilter,1,sps);       % Downsample and filter
rxFiltSignal = ...
    rxFiltSignal(filtlen + 1:end - filtlen); % Account for delay

フィルター処理され、ノイズのない信号の一部についてアイ ダイアグラムを作成して、パルス整形の効果を可視化します。送信信号に RRC フィルター処理が適用され、"アイの開口部" が狭くなっているという ISI が示されます。

eyediagram(txFiltSignal(1:2000),sps*2);

チャネル ノイズ後の信号のアイ ダイアグラムを表示して、RRC フィルター処理とノイズが適用された信号を確認します。ノイズ レベルにより、アイ ダイアグラムのアイの開口部がさらに狭くなっています。

eyediagram(rxSignal(1:2000),sps*2);

受信フィルター処理を適用した後の信号のアイ ダイアグラムを表示すると、レイズド コサイン フィルター処理が適用された信号が示されます。RRC フィルター処理が適用された信号に比べ、アイ ダイアグラムのアイの開口部が広くなり、信号の ISI がレイズド コサイン フィルター処理によって低減されています。

eyediagram(rxFiltSignal(1:2000),2);

フィルター処理の前後における受信信号のコンスタレーション ダイアグラムを作成します。受信信号をシンボルあたりのサンプル数の平方根でスケーリングして、送信と受信の強度レベルを正規化します。

scatplot = scatterplot(sqrt(sps)*...
    rxSignal(1:sps*5e3),...
    sps,0);
hold on;
scatterplot(rxFiltSignal(1:5e3),1,0,'bx',scatplot);
title('Received Signal, Before and After Filtering');
legend('Before Filtering','After Filtering');
axis([-5 5 -5 5]); % Set axis ranges
hold off;

参考

関数

関連するトピック