📄 fix_1_soft1664qam 44.txt
字号:
% 16qam and 64qam ; t4*r4系统; 码率= 3/4;
% 软判决译码
% 添加定点dsp仿真
% 定点仿真结果:
% 输入进行8bits ,16bits输出,几乎和16bits量化效果一样
% 输入进行8bits ,15bits输出,几乎和16bits量化效果一样
clear
clc
color_flag = 2;
snr_min=0;
snr_max=35;
stepsize = 2.5;
%------------------------仿真参数设定-------------------------------------%
bits = 100; %一个ofdm符号长度
Mod_type = 4; %qam调制 4=16qam;
Max_bit_num = 8;
scale_eff = 3; % 加法器缩放系数
global Max_value Min_value Sub_max_value Sub_min_value
Max_value = 2^(Max_bit_num-1); % Max_value = 2^15
Min_value = -Max_value;
Sub_max_value = 2^(Max_bit_num-1);
Sub_min_value = -Sub_max_value;
Max_add_value = 2^(2*Max_bit_num-1);
Max_div_value = 2^(2*Max_bit_num-3);
mult_flow_num = 0;
add_flow_num = 0;
star_index_length = 16;
Tx_num = 4; %发送天线个数(4)
Rx_num = 4;
Time_length = 4;
pqam_length = bits*Mod_type;
Source_length = (Tx_num-1)*bits*Mod_type; %因为天线3和天线4是一样的码子
p_s_length = bits*Mod_type*Time_length;
%-------------------------------------------------------------------------%
j=sqrt(-1);
st2 = sqrt(2);
ch_scale = sqrt(4); % Tx_num = 4
st2 = fix(st2*Max_value)/Max_value;
ch_scale = fix(ch_scale*Max_value)/Max_value;
%------------------产生信号源------------------------%
sig_code = zeros(Tx_num,pqam_length);
sig_code = randint(Tx_num-1,pqam_length);
sig_code(4,:) = sig_code(3,:);
%-------------------------QAM 映射,STBC编码--------------%
table16 = [1+j, 3+ j, 1+3j, 3+3j,...
1-j, 1-3j, 3- j, 3-3j,...
-1+j,-1+3j,-3+ j,-3+3j,...
-1-j,-3- j,-1-3j,-3-3j];
table64 = [1+j, 3+ j, 1+3j, 3+3j, 7+1j, 5+ j, 7+3j, 5+3j, 1+7j, 3+7j, 1+5j, 3+5j, 7+7j, 5+7j, 7+5j, 5+5j,...
1-j, 1-3j, 3- j, 3-3j, 1-7j, 1-5j, 3-7j, 3-5j, 7- j, 7-3j, 5- j, 5-3j, 7-7j, 7-5j, 5-7j, 5-5j,...
-1+j,-1+3j,-3+ j,-3+3j,-1+7j,-1+5j,-3+7j,-3+5j,-7+ j,-7+3j,-5+ j,-5+3j,-7+7j,-7+5j,-5+7j,-5+5j,...
-1-j,-3- j,-1-3j,-3-3j,-7- j,-5- j,-7-3j,-5-3j,-1-7j,-3-7j,-1-5j,-3-5j,-7-7j,-5-7j,-7-5j,-5-5j];
table16 = table16/sqrt(10);
table64 = table64/sqrt(42);
table16 = round(table16*Max_value)/Max_value;
table64 = round(table64*Max_value)/Max_value;
qam_code = zeros(Tx_num,bits); %qam映射矩阵的大小(stbc编码之前)
switch Mod_type
case 4
for i=1:Tx_num
for n=1:bits
table_index = sig_code(i,(n-1)*Mod_type+1)*8+sig_code(i,(n-1)*Mod_type+2)*4+...
sig_code(i,(n-1)*Mod_type+3)*2+sig_code(i,(n-1)*Mod_type+4);
qam_code(i,n) = table16(table_index+1);
end
end
case 6
for i=1:Tx_num
for n=1:bits
table_index = sig_code(i,(n-1)*Mod_type+1)*32+sig_code(i,(n-1)*Mod_type+2)*16+...
sig_code(i,(n-1)*Mod_type+3)*8+sig_code(i,(n-1)*Mod_type+4)*4+...
sig_code(i,(n-1)*Mod_type+5)*2+sig_code(i,(n-1)*Mod_type+6);
qam_code(i,n) = table64(table_index+1);
end
end
end
%qam_code = qam_code/sqrt(10);
stbc_code = zeros(Time_length,Tx_num,bits); %stbc 编码矩阵
stbc_code(1,1,:) = qam_code(1,:);
stbc_code(1,2,:) = qam_code(2,:);
stbc_code(1,3,:) = qam_code(3,:)/st2;
stbc_code(1,4,:) = qam_code(3,:)/st2;
stbc_code(2,1,:) = -conj(qam_code(2,:));
stbc_code(2,2,:) = conj(qam_code(1,:));
stbc_code(2,3,:) = qam_code(3,:)/st2;
stbc_code(2,4,:) = -qam_code(3,:)/st2;
stbc_code(3,1,:) = conj(qam_code(3,:)/st2);
stbc_code(3,2,:) = conj(qam_code(3,:)/st2);
stbc_code(3,3,:) = -real(qam_code(1,:))+j*imag(qam_code(2,:));
stbc_code(3,4,:) = -real(qam_code(2,:))+j*imag(qam_code(1,:));
stbc_code(4,1,:) = conj(qam_code(3,:)/st2);
stbc_code(4,2,:) = -conj(qam_code(3,:)/st2);
stbc_code(4,3,:) = real(qam_code(2,:))+j*imag(qam_code(1,:));
stbc_code(4,4,:) = -(real(qam_code(1,:))+j*imag(qam_code(2,:)));
stbc_code = stbc_code/ch_scale; % 所有发送天线发送信号归一化
%-----------------------迭代开始 信噪比 由小到大-----------------------------------%
table16 = fix(table16*Max_value);
table64 = fix(table64*Max_value*127/138);
%__________________________________________________________________________________%
iterative_length = 0;
for snr_db_step =snr_min:stepsize:snr_max % 信噪比从snr_min--snr_max
iterative_length = iterative_length+1
%------------(省略CP头和训练序列)上信道,乘性噪声------------------------%
rec_code = zeros(Time_length,Rx_num,bits);
ch_mul_noice = zeros(Tx_num,Rx_num,bits);
ch_mul_noice = sqrt(0.5)*(randn(Tx_num,Rx_num,bits)+j*randn(Tx_num,Rx_num,bits));
for n = 1:Time_length
for m = 1:bits
rec_code(n,:,m) = stbc_code(n,1:Tx_num,m)*ch_mul_noice(1:Tx_num,1:Rx_num,m);
end
end
%---------------------信号功率统计,加高斯白噪声----------------------------%
% 注意:这里只有0.75的信号平均功率!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rec_code = rec_code*sqrt(4/3);
sig_pante_pow = 0;
for n = 1:Rx_num
Agwn = sqrt(10^(-snr_db_step/10)/2)*(randn(Time_length,1,bits)+j*randn(Time_length,1,bits));
rec_code(:,n,:) = rec_code(:,n,:) + Agwn;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%---------------------接收信号并进行stbc译码(定点仿真开始)-----------------%
rec_code = rec_code/sqrt(4/3);
rec_code = rec_code*ch_scale; % 接收信号(叠加高斯白噪声后)
[max_rec_sig,max_index] = max(max(max(max(real(rec_code),imag(rec_code)))));
max_rec_sig = fix(max_rec_sig/(fix(max_rec_sig)+1)*Max_value)/Max_value*(fix(max_rec_sig)+1);
rec_code = rec_code/max_rec_sig; % 信号归一化,归一化后信号都为纯小数
rec_code = fix(rec_code*Max_value);
[max_ch_est,max_index] = max(max(max(max(real(ch_mul_noice),imag(ch_mul_noice)))));
max_ch_est = fix(max_ch_est/(fix(max_ch_est)+1)*Max_value)/Max_value*(fix(max_ch_est)+1);
ch_mul_noice = ch_mul_noice/max_ch_est; % 信道估计值归一化
ch_mul_noice = fix(ch_mul_noice*Max_value);
rec_code_r = real(rec_code);
rec_code_i = imag(rec_code);
ch_mul_noice_r = real(ch_mul_noice);
ch_mul_noice_i = imag(ch_mul_noice);
decode_out = zeros((Tx_num-1),bits); % 输出星座点的值
demap_int = zeros(Tx_num,bits); % 输出qam映射的下标
for n = 1:bits
decode_tempt_r = zeros(1,(Tx_num-1)); % 信号长度=Tx_num (4)-1
decode_tempt_i = zeros(1,(Tx_num-1));
decode_tempt = zeros(1,(Tx_num-1));
m = reshape(ch_mul_noice(:,:,n),1,16); % 16 = Tx_num*Rx_num=4*4 ------ ch_mul_noice
tempt_eff = scale_eff;
for r = 1:Rx_num
mult_tempt(1,1) = rec_code_r(1,r,n)*ch_mul_noice_r(1,r,n);
mult_tempt(1,2) = rec_code_i(1,r,n)*ch_mul_noice_i(1,r,n);
mult_tempt(1,3) = rec_code_r(2,r,n)*ch_mul_noice_r(2,r,n);
mult_tempt(1,4) = rec_code_i(2,r,n)*ch_mul_noice_i(2,r,n);
mult_tempt(1,5) = -rec_code_r(4,r,n)*ch_mul_noice_r(4,r,n);
mult_tempt(1,6) = -rec_code_i(4,r,n)*ch_mul_noice_i(4,r,n);
mult_tempt(1,7) = -rec_code_r(3,r,n)*ch_mul_noice_r(3,r,n);
mult_tempt(1,8) = -rec_code_i(3,r,n)*ch_mul_noice_i(3,r,n);
for nnn = 1:8
if mult_tempt(1,nnn) >= Max_add_value
mult_tempt(1,nnn) = Max_add_value-1;
mult_flow_num = mult_flow_num+1;
elseif mult_tempt(1,nnn) < -Max_add_value
mult_tempt(1,nnn) = -Max_add_value;
mult_flow_num = mult_flow_num+1;
end
end
sum_tempt = fix((mult_tempt(1,1)+mult_tempt(1,2)+mult_tempt(1,3)+mult_tempt(1,4)+...
mult_tempt(1,5)+mult_tempt(1,6)+mult_tempt(1,7)+mult_tempt(1,8))/2^tempt_eff);
decode_tempt_r(1,1) = decode_tempt_r(1,1)+sum_tempt;
mult_tempt(1,1) = -rec_code_r(1,r,n)*ch_mul_noice_i(1,r,n);
mult_tempt(1,2) = rec_code_i(1,r,n)*ch_mul_noice_r(1,r,n);
mult_tempt(1,3) = rec_code_r(2,r,n)*ch_mul_noice_i(2,r,n);
mult_tempt(1,4) = -rec_code_i(2,r,n)*ch_mul_noice_r(2,r,n);
mult_tempt(1,5) = -rec_code_r(4,r,n)*ch_mul_noice_i(3,r,n);
mult_tempt(1,6) = rec_code_i(4,r,n)*ch_mul_noice_r(3,r,n);
mult_tempt(1,7) = -rec_code_r(3,r,n)*ch_mul_noice_i(4,r,n);
mult_tempt(1,8) = rec_code_i(3,r,n)*ch_mul_noice_r(4,r,n);
for nnn = 1:8
if mult_tempt(1,nnn) >= Max_add_value
mult_tempt(1,nnn) = Max_add_value-1;
mult_flow_num = mult_flow_num+1;
elseif mult_tempt(1,nnn) < -Max_add_value
mult_tempt(1,nnn) = -Max_add_value;
mult_flow_num = mult_flow_num+1;
end
end
sum_tempt = (mult_tempt(1,1)+mult_tempt(1,2) +...
mult_tempt(1,3)+mult_tempt(1,4)+...
mult_tempt(1,5)+mult_tempt(1,6)+...
mult_tempt(1,7)+mult_tempt(1,8))/2^tempt_eff;
decode_tempt_i(1,1) = decode_tempt_i(1,1)+sum_tempt;
mult_tempt(1,1) = rec_code_r(1,r,n)*ch_mul_noice_r(2,r,n);
mult_tempt(1,2) = rec_code_i(1,r,n)*ch_mul_noice_i(2,r,n);
mult_tempt(1,3) = -rec_code_r(2,r,n)*ch_mul_noice_r(1,r,n);
mult_tempt(1,4) = -rec_code_i(2,r,n)*ch_mul_noice_i(1,r,n);
mult_tempt(1,5) = rec_code_r(4,r,n)*ch_mul_noice_r(3,r,n);
mult_tempt(1,6) = rec_code_i(4,r,n)*ch_mul_noice_i(3,r,n);
mult_tempt(1,7) = -rec_code_r(3,r,n)*ch_mul_noice_r(4,r,n);
mult_tempt(1,8) = -rec_code_i(3,r,n)*ch_mul_noice_i(4,r,n);
for nnn = 1:8
if mult_tempt(1,nnn) >= Max_add_value
mult_tempt(1,nnn) = Max_add_value-1;
mult_flow_num = mult_flow_num+1;
elseif mult_tempt(1,nnn) < -Max_add_value
mult_tempt(1,nnn) = -Max_add_value;
mult_flow_num = mult_flow_num+1;
end
end
sum_tempt = fix((mult_tempt(1,1)+mult_tempt(1,2) +...
mult_tempt(1,3)+mult_tempt(1,4)+...
mult_tempt(1,5)+mult_tempt(1,6)+...
mult_tempt(1,7)+mult_tempt(1,8))/2^tempt_eff);
decode_tempt_r(1,2) = decode_tempt_r(1,2)+sum_tempt;
mult_tempt(1,1) = -rec_code_r(1,r,n)*ch_mul_noice_i(2,r,n);
mult_tempt(1,2) = rec_code_i(1,r,n)*ch_mul_noice_r(2,r,n);
mult_tempt(1,3) = -rec_code_r(2,r,n)*ch_mul_noice_i(1,r,n);
mult_tempt(1,4) = rec_code_i(2,r,n)*ch_mul_noice_r(1,r,n);
mult_tempt(1,5) = rec_code_r(4,r,n)*ch_mul_noice_i(4,r,n);
mult_tempt(1,6) = -rec_code_i(4,r,n)*ch_mul_noice_r(4,r,n);
mult_tempt(1,7) = -rec_code_r(3,r,n)*ch_mul_noice_i(3,r,n);
mult_tempt(1,8) = rec_code_i(3,r,n)*ch_mul_noice_r(3,r,n);
for nnn = 1:8
if mult_tempt(1,nnn) >= Max_add_value
mult_tempt(1,nnn) = Max_add_value-1;
mult_flow_num = mult_flow_num+1;
elseif mult_tempt(1,nnn) < -Max_add_value
mult_tempt(1,nnn) = -Max_add_value;
mult_flow_num = mult_flow_num+1;
end
end
sum_tempt = fix((mult_tempt(1,1)+mult_tempt(1,2) +...
mult_tempt(1,3)+mult_tempt(1,4)+...
mult_tempt(1,5)+mult_tempt(1,6)+...
mult_tempt(1,7)+mult_tempt(1,8))/2^tempt_eff);
decode_tempt_i(1,2) = decode_tempt_i(1,2)+sum_tempt;
mult_tempt(1,1) = rec_code_r(1,r,n)*ch_mul_noice_r(3,r,n);
mult_tempt(1,2) = rec_code_i(1,r,n)*ch_mul_noice_i(3,r,n);
mult_tempt(1,3) = rec_code_r(2,r,n)*ch_mul_noice_r(3,r,n);
mult_tempt(1,4) = rec_code_i(2,r,n)*ch_mul_noice_i(3,r,n);
mult_tempt(1,5) = rec_code_r(1,r,n)*ch_mul_noice_r(4,r,n);
mult_tempt(1,6) = rec_code_i(1,r,n)*ch_mul_noice_i(4,r,n);
mult_tempt(1,7) = -rec_code_r(2,r,n)*ch_mul_noice_r(4,r,n);
mult_tempt(1,8) = -rec_code_i(2,r,n)*ch_mul_noice_i(4,r,n);
mult_tempt(1,9) = rec_code_r(3,r,n)*ch_mul_noice_r(1,r,n);
mult_tempt(1,10) = rec_code_i(3,r,n)*ch_mul_noice_i(1,r,n);
mult_tempt(1,11) = rec_code_r(3,r,n)*ch_mul_noice_r(2,r,n);
mult_tempt(1,12) = rec_code_i(3,r,n)*ch_mul_noice_i(2,r,n);
mult_tempt(1,13) = rec_code_r(4,r,n)*ch_mul_noice_r(1,r,n);
mult_tempt(1,14) = rec_code_i(4,r,n)*ch_mul_noice_i(1,r,n);
mult_tempt(1,15) = -rec_code_r(4,r,n)*ch_mul_noice_r(2,r,n);
mult_tempt(1,16) = -rec_code_i(4,r,n)*ch_mul_noice_i(2,r,n);
for nnn = 1:16
if mult_tempt(1,nnn) >= Max_add_value
mult_tempt(1,nnn) = Max_add_value-1;
mult_flow_num = mult_flow_num+1;
elseif mult_tempt(1,nnn) < -Max_add_value
mult_tempt(1,nnn) = -Max_add_value;
mult_flow_num = mult_flow_num+1;
end
end
sum_tempt = fix((mult_tempt(1,1)+mult_tempt(1,2) +...
mult_tempt(1,3)+mult_tempt(1,4)+...
mult_tempt(1,5)+mult_tempt(1,6)+...
mult_tempt(1,7)+mult_tempt(1,8)+...
mult_tempt(1,9)+mult_tempt(1,10) +...
mult_tempt(1,11)+mult_tempt(1,12)+...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -