📄 bicm_8dpsk_clip.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Bit interleaved 8DPSK differentially coded modulation over
%% Ricean fading channels and impulse noise environment
%% Ver 1.0, By Liu Wei, 2005-04-14
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 常数定义
INFO_LEN = 3000; %% 信息比特
CODE_LEN = INFO_LEN * 2; %% 编码比特
DELAY = 40; %% Viterbi译码延时
SYMBOL = (CODE_LEN/3) + 1; %% 差分调制符号数目
CODE_RATE = 1.5; %% 码率(比特/符号)
DOPPLER = 0.05; K_FACTOR = 0; %% Rice信道参数
PROB_IMPULSE = 0.01; %% 脉冲噪声发生的概率
%% 生成卷积码的网格结构
Trellis = poly2trellis(7,[171 133]);
%% 生成交织器的地址表
AddrTable = randperm(CODE_LEN);
%% 8PSK调制的Gray影射
PskStar = [1 0.707+0.707j -0.707+0.707j j 0.707-0.707j -j -1 -0.707-0.707j];
%% 计算有效的比特信噪比(Eb/N0)
EbN0 = 25;
AdjEbN0 = EbN0 + 10*log10(CODE_RATE/2);
%% main program
for BitSir = 10 : 1 : 30,
%% 计算有效的比特信干比
AdjSir = BitSir + 10*log10(CODE_RATE/2) + 10*log10(PROB_IMPULSE);
BitSum = 0;
BitErrSum = 0;
while BitErrSum < 100
InfoData = randint(1,INFO_LEN);
CodeData = convenc(InfoData,Trellis);
IntrlvData = intrlv(CodeData,AddrTable);
%% 8PSK调制
for i = 1 : (SYMBOL-1),
Index = IntrlvData(i*3-2)*4 + IntrlvData(i*3-1)*2 + IntrlvData(i*3);
PskModul(i) = PskStar(Index+1);
end
%% 差分调制
DiffModul(1) = 1;
for i = 1 : (SYMBOL-1),
Temp = DiffModul(i) * PskModul(i);
DiffModul(i+1) = Temp/abs(Temp);
end
%% 生成Gaussian-Binoulli脉冲噪声
BinoulliRand = binornd(1,PROB_IMPULSE,1,SYMBOL);
GaussRand = wgn(1,SYMBOL,-AdjSir,'dbW','complex');
ImpulseNoise = BinoulliRand .* GaussRand;
%% 生成Rice衰落和白噪声
FadeChan = ricianchan(1,DOPPLER,K_FACTOR);
reset(FadeChan,randint(1,1,[1 1000]));
WhiteNoise = wgn(1,SYMBOL,-AdjEbN0,'dbW','complex');
%% 差分调制信号通过噪声信道
Receive = filter(FadeChan,DiffModul) + WhiteNoise + ImpulseNoise;
%% 差分解调
for i = 1 : (SYMBOL-1),
DiffDetect(i) = Receive(i+1) * conj(Receive(i));
end
%% 比特度量计算
for i = 1:(SYMBOL-1),
%% 计算接收信号与标准星座的欧氏距离
for nLoop = 1:8,
Dist(nLoop) = abs(DiffDetect(i) - PskStar(nLoop))^2;
end
%%计算三个影射比特的度量
BitMetric(i*3-2) = min([Dist(5) Dist(6) Dist(7) Dist(8)]) - min([Dist(1) Dist(2) Dist(3) Dist(4)]);
BitMetric(i*3-1) = min([Dist(3) Dist(4) Dist(7) Dist(8)]) - min([Dist(1) Dist(2) Dist(5) Dist(6)]);
BitMetric(i*3) = min([Dist(2) Dist(4) Dist(6) Dist(8)]) - min([Dist(1) Dist(3) Dist(5) Dist(7)]);
end
%% 比特解交织
SoftInfo = deintrlv(BitMetric,AddrTable);
%% 比特度量限幅
for i=1:CODE_LEN,
LTemp = SoftInfo(i);
if LTemp > 1.0,
SoftInfo(i) = 1.0;
end
if LTemp < -1.0,
SoftInfo(i) = -1.0;
end
end
%% Viterbi译码
DecodeData = vitdec(SoftInfo,Trellis,DELAY,'cont','unquant');
%% 计算误比特率
[ErrNumb,ErrRatio] = biterr(DecodeData((DELAY+1):end),InfoData(1:end-DELAY));
BitErrSum = BitErrSum + ErrNumb;
BitSum = BitSum + (INFO_LEN - DELAY);
end
BitErrRate = BitErrSum/BitSum;
sprintf('Eb/N0 = %3.3f , BitSir = %3.3f, BER = %0.3e ',EbN0,BitSir,BitErrRate)
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -