1

16QAM システム (送信機、チャネル、および受信機) と、結果の BER および PER 曲線を実行しています。ただし、受信機のノイズに問題があります。システムを 2 つのループ内で実行しています。すべての Eb/No 値とすべてのパケットに対して、200 個のシンボルと 1000 個のパケットを送信しましたが、これはまだ発生しています。このコードの結果が正しいかどうかを確認したい:

clear all
clc
numPkts=1000;

N = 200; % number of symbols
M = 16;   % constellation size
k = log2(M); % bits per symbol
pv=4; %prefix length


% defining the real and imaginary PAM constellation
% for 16-QAM
alphaRe = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];
alphaIm = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];
k_16QAM = 1/sqrt(10);

Eb_N0_dB  = [0:15]; % multiple Es/N0 values
Es_N0_dB  = Eb_N0_dB + 10*log10(k);
erTot=zeros(1,length(Eb_N0_dB));

% Mapping for binary <--> Gray code conversion
ref = [0:k-1];
map = bitxor(ref,floor(ref/2));
[tt ind] = sort(map);                                

for ii = 1:length(Eb_N0_dB)
for pktX=1:numPkts    
% symbol generation
% ------------------
ipBit = rand(1,N*k,1)>0.5; % random 1's and 0's
ipBitReshape = reshape(ipBit,k,N).';
bin2DecMatrix = ones(N,1)*(2.^[(k/2-1):-1:0]) ; % conversion from binary to decimal
% real
ipBitRe =  ipBitReshape(:,[1:k/2]);
ipDecRe = sum(ipBitRe.*bin2DecMatrix,2);
ipGrayDecRe = bitxor(ipDecRe,floor(ipDecRe/2));
% imaginary
ipBitIm =  ipBitReshape(:,[k/2+1:k]);
ipDecIm = sum(ipBitIm.*bin2DecMatrix,2);
ipGrayDecIm = bitxor(ipDecIm,floor(ipDecIm/2)); 
% mapping the Gray coded symbols into constellation
modRe = alphaRe(ipGrayDecRe+1);
modIm = alphaIm(ipGrayDecIm+1);
% complex constellation
mod = modRe + j*modIm;
s1 = k_16QAM*mod; % normalization of transmit power to one 

s=[s1(length(s1)-pv+1:end) s1]; %add prefix


% noise
% -----
EsNo=10^(Es_N0_dB(ii)/10);
stanDevNoise=sqrt((1)/(2*EsNo));

n =stanDevNoise *[randn(1,length(s)) + j*randn(1,length(s))]; % white guassian noise, 0dB variance 



h=(1/sqrt(2))*(randn+j*randn);
y1= conv(s,h) + n; % additive white gaussian noise



%removes prefix
        y1(1:pv) = [];   

y=y1/h;
% demodulation
% ------------
y_re = real(y)/k_16QAM; % real part
y_im = imag(y)/k_16QAM; % imaginary part

% rounding to the nearest alphabet
ipHatRe = 2*floor(y_re/2)+1;
ipHatRe(find(ipHatRe>max(alphaRe))) = max(alphaRe);
ipHatRe(find(ipHatRe<min(alphaRe))) = min(alphaRe);
ipHatIm = 2*floor(y_im/2)+1;
ipHatIm(find(ipHatIm>max(alphaIm))) = max(alphaIm);
ipHatIm(find(ipHatIm<min(alphaIm))) = min(alphaIm);

% Constellation to Decimal conversion
ipDecHatRe = ind(floor((ipHatRe+4)/2+1))-1; % LUT based
ipDecHatIm = ind(floor((ipHatIm+4)/2+1))-1; % LUT based

% converting to binary string
ipBinHatRe = dec2bin(ipDecHatRe,k/2);
ipBinHatIm = dec2bin(ipDecHatIm,k/2);

% converting binary string to number
ipBinHatRe = ipBinHatRe.';
ipBinHatRe = ipBinHatRe(1:end).';
ipBinHatRe = reshape(str2num(ipBinHatRe).',k/2,N).' ;

ipBinHatIm = ipBinHatIm.';
ipBinHatIm = ipBinHatIm(1:end).';
ipBinHatIm = reshape(str2num(ipBinHatIm).',k/2,N).' ;

% counting errors for real and imaginary
nBitErr(pktX) = size(find([ipBitRe- ipBinHatRe]),1) + size(find([ipBitIm - ipBinHatIm]),1) ;

end
erTot(ii)=erTot(ii)+sum(nBitErr); %total errors in all packets

simBer(ii)=(erTot(ii)/(N*k*numPkts)); %bit error rate

totPktErRate(ii)=(erTot(ii)/(numPkts)); 
end

theoryBer = (1/k)*3/2*erfc(sqrt(k*0.1*(10.^(Eb_N0_dB/10))));

close all; figure
semilogy(Eb_N0_dB,theoryBer,'bs-','LineWidth',2);
hold on
semilogy(Eb_N0_dB,simBer,'mx-','LineWidth',2);
axis([0 15 10^-5 1])
grid on
legend('theory', 'simulation');
xlabel('Eb/No, dB')
ylabel('Bit Error Rate')
title('Bit error probability curve for 16-QAM modulation')

ありがとう!

4

1 に答える 1

2

提供されているコードでは、次のことを前提としています。

  • グレイ コーディング ビット マッピングを使用した 16-QAM 変調
  • フラットな低速/ブロック レイリー フェージング チャネル モデル。
  • 完全なチャネル状態情報推定の下でのコヒーレント復号化

Additive-White-Gaussian-Noise (AWGN) チャネルとの類似性により、上記の仮定の下でシステム パフォーマンスを理解して調整するための論理的な最初のステップは、フェージングなしでそのパフォーマンスを評価することです (つまり、チャネル モデルを AWGN に置き換えます)。h=1提供されたコードで設定することによりチャネル)。

AWGN チャネル

Symbol-Error-Rate (SER) パフォーマンスのキャリブレーションを検証することをお勧めします。これは (BER) パフォーマンスに大きな影響を与える可能性があるためです。SER 曲線は、コード化されていない 16-QAM コンスタレーションのコヒーレント デコードにすぐに利用できます (たとえば、dsplogを参照)。 、これらの講義スライド本書など) これらの参考文献には、16-QAM の SER に対する次の近似も含まれています。

1.5*erfc(sqrt(EsN0/10))

どこでEsN0 = 10.^(0.1*EsN0_dB)

結果は、Es/N0 (シンボルあたりの平均エネルギー) または Eb/N0 (ビットあたりの平均エネルギー) のいずれかに関して同等に提供されることに注意してください。k ビットのコンスタレーション (コンスタレーション サイズ 2 k ) の場合、Es/N0 と Eb/N0 の関係は次のようになります。

Es/N0 = k*Eb/N0

したがって、16-QAM の場合、Es/N0 = 4Eb/N0 (または Es/N0 dB = Eb/N0 dB + 6dB) です。

グレイ コード方式の場合、十分に高い Eb/N0 の BER 近似は、ほとんどの場合、シンボル エラーが (シンボル内の k ビットから) 1 ビットのエラーに変換されるという事実から取得できます。 ~ SER/k (または 16-QAM の場合: BER ~ SER/4)。

Es/N0 (dB)   Eb/N0 (dB)   SER      BER approx
15           9            1.8e-2   4.5e-3
16           10           7.0e-3   1.8e-3
18           12           5.5e-4   1.4e-4
20           14           1.2e-5   3.0e-6
25           19           2.7e-15  6.7e-16

補足として、約 10 -5未満の SER で 2,000,000 シンボルを使用したシミュレーション結果の信頼区間は、かなり重要になり始める可能性があります。例として、次のグラフは 16-QAM の SER を青色で示し、2,000,000 シンボル シミュレーションの予想される 95% 信頼区間を赤色で示しています。 ここに画像の説明を入力

レイリー ブロック フェージング チャネル

AWGN チャネルのパフォーマンス キャリブレーションが確立されると、投稿されたコードで使用されているレイリー ブロック フェージング チャネルに戻ることができます。

受信機でのチャネル状態情報の推定が完全であると仮定し、ノイズがなければ、次の変換を使用して受信信号を元の送信シンボルに正確に戻すことができます。

y = y1/h;

ノイズが存在する場合、この変換は残念ながらノイズもスケーリングします。幸いなことに、ノイズはホワイトでガウスのままであるため、AWGN チャネル方程式の基本的な導出を再利用できます。独立したパケットでは、スケーリングの統計的分布はレイリー分布abs(h)に従います(パラメータ sigma 2 =1/2)。したがって、SER に対するこのスケーリングの平均効果を得るために、積分を使用して可能なスケーリング値の範囲にわたる効果の加重合計 (ここで、加重はレイリー分布の確率密度関数) を計算することができます。 ここに画像の説明を入力

これは、以下を使用して MATLAB で数値的に行うことができます。

function SER = AwgnSer(EsN0)
  SER = 1.5*erfc(sqrt(0.1*EsN0));
end
function f = WeightedAwgnSer(x)
  weight = 2*x.*exp(-x.*conj(x));
  f = weight*AwgnSer(EsN0*x.*conj(x));
end
function SER = BlockRayleighFadingSer(EsN0)
  for ii=1:length(EsN0)
    SER(ii) = quad(inline('WeightedAwgnSer(EsN0(ii),s)','s'), 0, inf);
  end
end

BER についても同様の導出を行うことができます。

function BER = AwgnBer(EsN0)
  x = sqrt(0.1*EsN0);
  q1 = 0.5*erfc(x);
  q3 = 0.5*erfc(3*x);
  q5 = 0.5*erfc(5*x);
  BER = (12*q1+8*q3-4*q5 - q1*(q1+q3-2*q5)+(q3-q5)*q5)/16;
end
function f = WeightedAwgnBer(x)
  weight = 2*x.*exp(-x.*conj(x));
  f = weight*AwgnBer(EsN0*x.*conj(x));
end
function SER = BlockRayleighFadingBer(EsN0)
  for ii=1:length(EsN0)
    SER(ii) = quad(inline('WeightedAwgnBer(EsN0(ii),s)','s'), 0, inf);
  end
end

加重平均は、近似があまり良くない低い信号対雑音比の影響を受ける傾向があるため、BER に正確な式を使用したことに注意してください。曲線上では大きな違いはありません (Eb/N0=10dB で ~0.3dB) が、性能曲線を校正するときに心配する必要はありません。

これにより、次の性能曲線が得られます。 ここに画像の説明を入力

その他の考慮事項

デコードのパフォーマンスは、この回答の範囲を超えた他の多くの要因の影響を受ける可能性があります。したがって、以下では、いくつかの一般的なものと、追加情報として使用できる外部参照へのリンクについて簡単に説明します。

投稿されたコードのデコーダーは、フェージング効果の明示的な知識を使用します (行から明らかなようにy=y1/h;)。通常はそうではなく、フェージングを最初に推定する必要があります。受信機でのチャネル効果の推定は、この回答の範囲を超えていますが、一般的に不完全な推定はパフォーマンスの低下につながります。完全な知識のパフォーマンス曲線は、不完全なチャネル推定の下でパフォーマンスを比較するための実用的なベンチマークとしてよく使用されます。

チャネル コーディングは、システム パフォーマンスを向上させるためによく行われます。AWGN チャネルでの符号化変調に使用される一般的なベンチマークは次のとおりです。

同様に、フラット ブロック レイリー フェージング チャネル上の符号化変調では、次のベンチマークが一般的に使用されます。

  • 停止確率 (本書のセクション 5.4.1 を参照)
  • 符号化されていない変調性能 (ここで導出)
于 2014-06-28T01:29:46.327 に答える