📄 cpm_sim.m.bak
字号:
%clc
clear all
close all
T=1;
L=3;
h=2/7;
m=8; % 八进制
p = 2/h;
OVS=40;
OVR=40;
frame_num = 100;
frame_size = 50;
t=[0:T/OVS:L*T];
gt=( 1-cos( 2*pi*t/(L*T) ) )/(2*L*T);
for i=1:L*OVS
QT(i)=sum(gt(1:i).*(T/OVS));
end
bit = 2*(randint(1,10,8)) - (m-1);
phas = zeros(1,length(bit));
acc_ph = zeros(1,length(bit)*OVS);
for k = 3:length(bit)
if k>3
phas(k) = mod(phas(k-1) + pi*h*bit(k-3),2*pi);
end;
acc_ph((k-1)*OVS+1:k*OVS) = mod( 2*pi*h*( bit(k-2)*QT(2*OVS+1:3*OVS) + bit(k-1)*QT(OVS+1:2*OVS) + bit(k)*QT(1:OVS) ) + phas(k), 2*pi );
end;
%%%%%%%%%%%%%%%%%%%%%%% plot acc_ph %%%%%%%%%%%%%%%%%%%%%%%%%
% x = 1./OVS:1./OVS:length(bit);
% plot(x,acc_ph);
% ylim([0,2*pi]);
%%%%%%%%%%%%%%%%%%%%%%% End plot %%%%%%%%%%%%%%%%%%%%%%%%%
trans_sig = exp(j*acc_ph);
%%%%%%%%%%%%%%%%%%%%%%% transmit %%%%%%%%%%%%%%%%%%%%%%%%%
% Ir = It;
% Qr = Qt;
%%%%%%%%%%%%%%%%%%%%% End transmit %%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%% receive %%%%%%%%%%%%%%%%%%%%%%%%%
%
% sampling
%
%%%%%%%%%%%%%%%%%%%%% End receive %%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% % DEMODULATION
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rec_sig = trans_sig;
%[state_from_input, state_from, to_state_output, to_state, phase_state] = gen_trellis(m, h, L); % generate state trans table()
%correlator = gen_mtchd_fltr(OVR, m, h, QT); % generate mtchd_fltr(m,m,m,Ns)
load state_from state_from;
load correlator correlator;
%save state_from_input state_from_input;
%save state_from state_from;
%save correlator correlator
%load state_from_input state_from_input;
rec_sym_num = length(trans_sig)/OVR;
branch_metric = zeros(p,m,m,m);
acc_metric_left = zeros(p,m,m);
acc_metric_right = zeros(p,m,m);
surv_path = ones(rec_sym_num,p,m,m);
sub_acc_every_state = zeros(1,m);
bit_dmod = zeros(1,rec_sym_num);
err_total = 0;
for frm = 1:frm_num
for sym = 3:rec_sym_num % for each symbol
% left trevills states
for phk = 1:p % for each state
for ak2 = 1:m % for each state
for ak1 = 1:m % for each state
for ak = 1:m % for each incoming branch
temp = rec_sig((sym-1)*OVR+1 : sym*OVR ) * conj( reshape(correlator(ak2,ak1,ak,:),OVR,1) ); % 复数相关
branch_metric(phk,ak2,ak1,ak) = real(temp * exp(-j*pi*h*(phk-1))); % 得到Zk
end;
end;end;end;
% right trevills states
for phk = 1:p % for each state
for ak2 = 1:m % for each state
for ak1 = 1:m % for each state
for i = 1:m % for each incoming branch
v = reshape( state_from(phk,ak2,ak1,i,:),1,3); % which state from
sub_acc_every_state(i) = acc_metric_left(v(1),v(2),v(3)) + branch_metric(v(1),v(2),v(3),ak1);
end;
[acc_metric_right(phk,ak2,ak1),surv_path(sym,phk,ak2,ak1)] = max(sub_acc_every_state); % update acc_metric
end;end;end;
acc_metric_left = acc_metric_right;
end; % end of (sym = 3:rec_sym_num)
maximum = 0;
for i = 1:p
for j = 1:m
for k = 1:m
if(acc_metric_right(i,j,k) > maximum)
v = [i,j,k];
maximum = acc_metric_right(i,j,k);
end;
end;end;end;
for i = rec_sym_num:-1:1
bit_dmod(i) = 2*(v(3)-1) - (m-1);
v = reshape( state_from(v(1),v(2),v(3),surv_path(i,v(1),v(2),v(3)),:),1,3);
end;
[err_num, err_rat] = symerr(bit, bit_dmod, 'column-wise');
err_total = err_total + err_num;
end; % end of (frm = 1:frm_num)
sprintf('error bits = %d, error rate = %f',err_num,err_rat)
disp('done');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -