1

I'm doing a 16QAM system (transmitter, channel and receiver), and BER and PER curves of the results. However, I'm having some problems with noise at the receiver. I'm running the system inside two loops: for all the Eb/No values and for all the packets and I sent 200 symbols and 1000 packets but this still happens. I would like to check whether the result from this code is correct or not:

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')

Thanks!

4

1 回答 1

2

提供的代码做了以下假设:

  • 使用格雷编码位映射的 16-QAM 调制
  • 一个平坦的慢/块瑞利衰落信道模型。
  • 完美信道状态信息估计下的相干解码

由于它与加性高斯白噪声 (AWGN) 信道相似,在上述假设下理解和校准系统性能的合乎逻辑的第一步是评估其性能而不衰落(即用 AWGN 替换信道模型通过h=1在提供的代码中设置频道)。

AWGN频道

您可能需要验证符号错误率 (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 近似值可以从符号错误在大多数时间转换为 1 位错误(在符号中的 k 位之外)的事实中获得,因此 BER ~ 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

附带说明一下,使用 2,000,000 个符号的 SER 低于大约 10 -5的模拟结果的置信区间可能开始变得非常显着。作为说明,下图以蓝色显示 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 回答