📄 main1003.asv
字号:
% Number of bit errors in current iteration
err(iter) = length(find(xhat(1:L_total-m)~=x));
if err(iter)>0
nferr(1,iter) = nferr(1,iter)+1;
end
end %iter
errs(1,1:niter) = errs(1,1:niter) + err(1:niter);
error_bit(:,it) = errs(1,niter);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'TURBO'
%signal.modulation_type = 'BPSK'; % 'BPSK', 'QPSK'
%channel(1).attenuation(1).pattern = 'no';% 'no','Rayleigh'
dec_alg = 1; % the decoding algorithm. (0:Log-MAP, 1:SOVA) default 0)
niter = 5; % number of iterations for each frame: default 5
L_total = 130;
g = [ 1 1 1; 1 0 1 ];
[n,K] = size(g);
m = K - 1;
nstates = 2^m;
puncture = 1; % choose punctured / unpunctured (0/1): default 0
rate = 1/(2+puncture);
errs(1,1:niter) = zeros(1,niter);
%L_total = L_info + m;
x1 = round(rand(1, L_total-m-16)); % info. bits 信息比特
CRC_CCITT = CRC_16(x1);
x =[x1,CRC_CCITT]; %加上CRC 比特信息
L_info = length(x);
input = x;
[temp, alpha] = sort(rand(1,L_total)); % random interleaver mapping 随机交织映射
en_output = encoderm( x, g, alpha, puncture ); % encoder output (+1/-1) 编码输出
switch channel(1).attenuation(1).pattern
case 'no'
%if(channel(1).attenuation(1).pattern == 'no')
% Fading amplitude; a=1 in AWGN channel
a = 1;
en = 10^(SNR(iSNR)/10);
L_c = 4*a*en*rate; % reliability value of the channel信道可靠性常量
sigma = 1/sqrt(2*rate*en); % standard deviation of AWGN noise
r = en_output+sigma*randn(1,L_total*(2+puncture)); % received bits 输出信息+噪声
case 'Rayleigh'
channel_fad = randn(1,1) + j * randn(1,1);
[channel_phi, channel_mag] = cart2pol(real(channel_fad),imag(channel_fad));
channel_phi = -channel_phi;
a = channel_mag;
en = 10^(SNR(iSNR)/10);
sigma = a/sqrt(2*rate*en);
%L_c = 4*a*en*rate; % reliability value of the channel信道可靠性常量
L_c = 4*a*en*rate;
r = en_output*channel_fad + sigma * (randn(1,L_total*(2+puncture)) + j* randn(1,L_total*(2+puncture))); % received bits 输出信息+噪声
r = r.* exp(j * (channel_phi));
r = real(r);
end
yk = demultiplex(r,alpha,puncture); % demultiplex to get input for decoder 1 and 2 解复用
% Scale the received bits
rec_s = 0.5*L_c*yk;
% Initialize extrinsic information
L_e(1:L_total) = zeros(1,L_total);
for iter = 1:niter
% Decoder one
% deinterleave the extrinsic information for first decoder
L_a(alpha) = L_e; % a priori info. 先验信息
if dec_alg == 0
L_all = logmapo(rec_s(1,:), g, L_a, 1); % complete info.
else
L_all = sova0(rec_s(1,:), g, L_a, 1); % complete info.
end
L_e = L_all - 2*rec_s(1,1:2:2*L_total) - L_a; % extrinsic info.
% Decoder two
L_a = L_e(alpha); % a priori info.
if dec_alg == 0
L_all = logmapo(rec_s(2,:), g, L_a, 2); % complete info.
else
L_all = sova0(rec_s(2,:), g, L_a, 2); % complete info.
end
L_e = L_all - 2*rec_s(2,1:2:2*L_total) - L_a; % extrinsic info.
% Estimate the info. bits
xhat(alpha) = (sign(L_all)+1)/2;
% Number of bit errors in current iteration 本次迭代中错误比特数
err(iter) = length(find(xhat(1:L_total-m)~=x));
end
errs(1,1:niter) = errs(1,1:niter) + err(1:niter);
error_bit(:,it) = errs(1,niter);
%编码协作部分
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case 'RCPC'
source_bit = randint(1,112);
[source_crc,coded_bit] = generate_coded_data(source_bit);%加上CRC位后,卷积编码
transmit_symbol = coded_bit;
if (coop_rate==1/4)
%puncture set puncture period P=8,punctured to rate=1/3
transmit_symbol_N1 = zeros(1,384);
transmit_symbol_N1(1:3:end) = transmit_symbol(1:4:end);
transmit_symbol_N1(2:3:end) = transmit_symbol(2:4:end);
transmit_symbol_N1(3:3:end) = transmit_symbol(3:4:end);
N1_symbol = transmit_symbol_N1;
%the remained N2 bits
transmit_symbol_N2 = transmit_symbol(4:4:end);
N2_symbol = transmit_symbol_N2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
else
transmit_symbol_N1 = zeros(1,256);
transmit_symbol_N1(1:2:end) = transmit_symbol(1:4:end);
transmit_symbol_N1(2:2:end) = transmit_symbol(2:4:end);
N1_symbol = transmit_symbol_N1;
transmit_symbol_N2 = zeros(1,256);
transmit_symbol_N2(1:2:end) = transmit_symbol(3:4:end);
transmit_symbol_N2(2:2:end) = transmit_symbol(4:4:end);
N2_symbol = transmit_symbol_N2;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
signal(1).nr_of_bits = length(N1_symbol);
signal.modulation_type = 'BPSK'; % 'BPSK', 'QPSK'
calculate_signal_parameter(N1_symbol); %BPSK modulation
%源端发送信息
if (use_direct_link == 1)
[channel(1), rx] = add_channel_effect(channel(1), rx,signal(1).symbol_sequence,1/4);
rx = rx_correct_phaseshift(rx, channel(1).attenuation.phi); %校正相位
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%decode the N1 symbols
rx.signal2analyse = real(rx.signal2analyse);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if (coop_rate==1/4)
insert_decode_data = zeros(1,512);
insert_decode_data(1:4:end) = rx.signal2analyse(1:3:end);
insert_decode_data(2:4:end) = rx.signal2analyse(2:3:end);
insert_decode_data(3:4:end) = rx.signal2analyse(3:3:end);
insert_decode_data(4:4:end) = 0; %删除比特补0
else
insert_decode_data = zeros(1,512);
insert_decode_data(1:4:end) = rx.signal2analyse(1:2:end);
insert_decode_data(2:4:end) = rx.signal2analyse(2:2:end);
insert_decode_data(3:4:end) = 0;
insert_decode_data(4:4:end) = 0; %删除比特补0
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
decode_symbol_N1 =data_decode(insert_decode_data);
error_count1 = sum(abs(source_crc - decode_symbol_N1));%1*128
%error_bit(:,it) = error_count1;
%中继端接收源端的信号,译码,通过CRC校验位检查是否译码正确
% Relay decode the N1 bits
if (use_relay == 1)
[channel(2), relay.rx] = add_channel_effect(channel(2),relay.rx, signal(1).symbol_sequence,1/4);
relay.rx =rx_correct_phaseshift(relay.rx,channel(2).attenuation.phi);
relay.rx.signal2analyse = real(relay.rx.signal2analyse);
if (coop_rate==1/4)
relay_insert_decode_data = zeros(1,512);
relay_insert_decode_data(1:4:end) = relay.rx.signal2analyse(1:3:end);
relay_insert_decode_data(2:4:end) = relay.rx.signal2analyse(2:3:end);
relay_insert_decode_data(3:4:end) = relay.rx.signal2analyse(3:3:end);
relay_insert_decode_data(4:4:end) = 0; %删除比特补0
else
relay_insert_decode_data = zeros(1,512);
relay_insert_decode_data(1:4:end) = relay.rx.signal2analyse(1:2:end);
relay_insert_decode_data(2:4:end) = relay.rx.signal2analyse(2:2:end);
relay_insert_decode_data(3:4:end) = 0;
relay_insert_decode_data(4:4:end) = 0;
end
relay_decode_symbol_N1 = data_decode(relay_insert_decode_data);%译码
% The number of relay decode error bits
error_count2= sum(abs(source_crc - relay_decode_symbol_N1));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Check the CRC
relay_received_bit =relay_decode_symbol_N1;
relay_code = coded_data(relay_received_bit);
%relay_code_data =relay_code;
relay_N2_symbol=relay_code(4:4:end);%1*128
relay_received_source = relay_received_bit(1:112);%1*112,the source bits R received
relay_received_crc = relay_received_bit(113:128);%1*16,the CRC bits R received
relay_crc_bit = CRC_16(relay_received_source); %译码比特生成CRC,并与接收的CRC位比较
if ((relay_crc_bit - relay_received_crc) == 0)
% Relay transmit the N2 bits,译码正确则由中继转发原删除的比特
%relay.signal2send =2* relay_N2_symbol-1; %BPSK调制
relay.signal2send =2* N2_symbol-1;
%relay to destination
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -