📄 sttc_test_2x2.m
字号:
% 2X2 STTC,QPSK,4 states%% initializationclear all;close all;clc;frame_length=10000;original_bits=randint(frame_length,2);code_matrix(:,:,1)=[0 0 0 0; 1 1 1 1; 2 2 2 2; 3 3 3 3];code_matrix(:,:,2)=[0 1 2 3; 0 1 2 3; 0 1 2 3; 0 1 2 3];%% STTC codingorig_num=bi2de(original_bits,'left-msb'); % 0~3sig_sttc=zeros(2,length(orig_num));now_num=1;for ii=1:length(orig_num) next_num=orig_num(ii,1)+1; % 1~4 sig_sttc(:,ii)=reshape(code_matrix(now_num,next_num,:),2,1); now_num=next_num;endsig_sttc=qammod(sig_sttc,4);%% channel matrix% you can modify the channel to a 2*2*length matrix, in which '2*2' means Nr*NtH=zeros(2,2,frame_length);for n=1:2 H(n,:,:)=(randn(size(sig_sttc))+j*randn(size(sig_sttc)))/sqrt(2); %Raylaigh channelendreceived_sig=zeros(size(sig_sttc));for n=1:length(sig_sttc) received_sig(:,n)=reshape(H(:,:,n),2,2)*sig_sttc(:,n);end%% viterbi algorithmsurvivors=zeros(4,frame_length);s_temp=survivors;distance=zeros(4,1); % Euclidian distanced_temp=distance;d_q=zeros(1,4);% snr=20dbreceived_sig=received_sig+sqrt(2/(10^(20/10)))*(randn(size(received_sig))+j*randn(size(received_sig)));for p=1:4 X_e=qammod(reshape(code_matrix(1,p,:),2,1),4); distance(p,1)=sum(abs(received_sig(:,1)-reshape(H(:,:,1),2,2)*X_e).^2); survivors(p,1)=p-1;endfor n=2:frame_length for p=1:4 % check state_p for q=1:4 % check state_q to state_p X_e=qammod(reshape(code_matrix(q,p,:),2,1),4); d_q(q)=sum(abs(received_sig(:,n)-reshape(H(:,:,n),2,2)*X_e).^2)+distance(q,1); end [v in]=min(d_q); d_temp(p,1)=v; s_temp(p,1:n)=[survivors(in,1:(n-1)) p-1]; end distance=d_temp; survivors=s_temp;end[v in]=min(distance);decoded_num=survivors(in,:);decoded_num=decoded_num.';decoded_bits=de2bi(decoded_num,'left-msb');[err_num ber]=biterr(original_bits,decoded_bits);ber
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -