?? main.m
字號:
clear;
FrameNum=10000;%碼塊數目
leng=128;%碼塊信息長的一半,即協議中的N
data=randint(1,FrameNum*leng*2,2);%產生隨機數
L1=4;%用于估計編碼器狀態的迭代次數
niter=L1+8;%總的迭代次數
if leng==96
index=1;
CodeBlockSize=48*8;%編碼后碼塊長度,單位是比特
rate=0.5;%碼率
elseif leng==128
index=2;
CodeBlockSize=48*8;
rate=2/3;
elseif leng==144
index=3;
CodeBlockSize=48*8;
rate=0.75;
elseif leng==192
index=4;
CodeBlockSize=96*8;
rate=0.5;
elseif leng==288
index=5;
CodeBlockSize=96*8;
rate=0.75;
elseif leng==384
index=6;
CodeBlockSize=144*8;
rate=2/3;
elseif leng==432
index=7;
CodeBlockSize=144*8;
rate=0.75;
end
EbN0=5;
x=zeros(1,CodeBlockSize*FrameNum);%x存放編碼結果
ratio=zeros(length(EbN0),length(L1));%BER
FrameErrNum=zeros(length(EbN0),length(L1));%PER
%// encoding
for i=1:FrameNum
x((i-1)*CodeBlockSize+1:i*CodeBlockSize)=CtcEncoder(data((i-1)*leng*2+1:i*leng*2),index);
end
%// modulation
[ModulateResult,nindex]=modulation(x,index);
snr=EbN0+1.25;%根據各個碼的碼率以及調制方式計算EbN0與snr之間的差值.1.25是第二種ctc的修正值
for i=1:length(EbN0)
i
%// adding noise
NoiseSignal=awgn(ModulateResult,snr(i),'measured');
%// demodulation
DemoduResult=demodulation(NoiseSignal,nindex);
%// multiplied by the reliability value of the channel
en=10^(EbN0(i)/10);
L_c=4*en*rate;%為了防止計算溢出,對于16-QAM調制,再乘一個因子(1/sqrt(10)),64-QAM乘以(1/sqrt(42))
y=0.5*L_c*DemoduResult;
%CtcDecode存放譯碼結果
CtcDecode=zeros(1,FrameNum*leng*2);
for k=1:length(L1)
%迭代譯碼,統計BER和PER
for j=1:FrameNum
CtcDecode((j-1)*leng*2+1:j*leng*2)=CtcDecoder(y((j-1)*CodeBlockSize+1:j*CodeBlockSize),niter(k),index,L1(k));
[num,frameratio]=biterr(CtcDecode((j-1)*leng*2+1:j*leng*2),data((j-1)*leng*2+1:j*leng*2));
if num~=0
FrameErrNum(i,k)=FrameErrNum(i,k)+1;
end
end
[num,ratio(i,k)]=biterr(data,CtcDecode);
fid=fopen('FrameErrRatio.dat','a');
fprintf(fid,'%d,%d:ber:%f,fer:%f\n',i,k,ratio(i,k),FrameErrNum(i,k)/FrameNum);
fclose(fid);
end
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -