68 lines
2.2 KiB
Mathematica
68 lines
2.2 KiB
Mathematica
![]() |
function [estNumerlogy,frmError] = STS_demod(rx_STF)
|
||
|
M=32;Q=16;OVR=1;
|
||
|
load STS_M32Q16.mat theta_mod v_mod STS_freq
|
||
|
|
||
|
STS_NUM = 9;
|
||
|
RX_re = reshape(rx_STF(17:end),[],STS_NUM);
|
||
|
STS_f = fftshift(fft(RX_re,16,1));
|
||
|
STS_freq_sk = STS_f([3:8,10:15],:);
|
||
|
theta_est = mod(angle(STS_freq_sk(2:end,:)./STS_freq_sk(1:end-1,:)),2*pi);
|
||
|
|
||
|
mmse_est = zeros(Q,STS_NUM);
|
||
|
for iii = 1:STS_NUM
|
||
|
for ii = 1:Q
|
||
|
mmse_tmp = abs(theta_est(:,iii)-theta_mod(ii,:).');
|
||
|
mmse_est(ii,iii) = norm(min([mmse_tmp,2*pi - mmse_tmp],[],2))^2;
|
||
|
end
|
||
|
end
|
||
|
mmse_est2 = sum(mmse_est,2);
|
||
|
v_est_no = find(mmse_est2==min(mmse_est2));
|
||
|
v_est = exp(j*v_mod(v_est_no(1)));
|
||
|
%%------demodulate phi
|
||
|
STS_freq_sk = STS_freq_sk./abs(STS_freq_sk);
|
||
|
% [~,STS_ref] = preamble_modu1(theta_mod(v_est_no(1),:), 0, OVR);
|
||
|
STS_ref = STS_freq(:,v_est_no(1),1);
|
||
|
STS_ref = STS_ref./abs(STS_ref);
|
||
|
phi_est_angle = mod(angle(sum(sum((STS_freq_sk(:,1:STS_NUM)./STS_ref)))),2*pi);
|
||
|
phi_est = exp(j*phi_est_angle);
|
||
|
|
||
|
% demap v and phi to Bits using pskmod
|
||
|
v_data_est = pskdemod(v_est,Q,0,'gray');
|
||
|
dePreambleQ = de2bi(v_data_est,log2(Q));
|
||
|
|
||
|
phi_data_est = pskdemod(phi_est,M,0,'gray');
|
||
|
dePreambleM = de2bi(phi_data_est,log2(M));
|
||
|
|
||
|
% CRC
|
||
|
poly = 'z4+z3+z2+z+1';
|
||
|
crcdetector = comm.CRCDetector(poly);
|
||
|
codeword = [dePreambleM,dePreambleQ];
|
||
|
[msg,frmError] = crcdetector(codeword.');
|
||
|
estNumerlogy = bi2de(msg.')+1;
|
||
|
|
||
|
end
|
||
|
|
||
|
%%
|
||
|
function [STS_time,STS_freq] = preamble_modu1(theta, phi, OVR)
|
||
|
% N_FFT =64;
|
||
|
s_k(1) = 1*exp(j*phi);
|
||
|
s_k(1) = sqrt(2)/abs(s_k(1))*s_k(1);
|
||
|
for i = 1:11
|
||
|
s_k(i+1) = s_k(i)*exp(j*theta(i));
|
||
|
end
|
||
|
STS_LOC = [9,13,17,21,25,29,37,41,45,49,53,57];
|
||
|
Short_preamble_slot_Frequency = zeros(1,64); % [1x64]
|
||
|
Short_preamble_slot_Frequency(STS_LOC) = s_k;
|
||
|
STS_freq = ifftshift(Short_preamble_slot_Frequency);
|
||
|
STS = ifft([STS_freq(1:32),zeros(1,64*(OVR-1)),STS_freq(33:64)])*sqrt(64);
|
||
|
STS = sqrt(1/mean(abs(STS).^2))*STS;
|
||
|
|
||
|
STS_f = fft(STS);
|
||
|
STS_f = [STS_f(1:32),STS_f((end-31:end))];
|
||
|
STS_freq = fftshift(STS_f);
|
||
|
|
||
|
STS_time = STS(1:16*OVR);
|
||
|
STS_freq = STS_freq(STS_LOC);
|
||
|
% STS_dpsk = mod(angle(STS_freq((2:end))./STS_freq((1:end-1))),2*pi);
|
||
|
% STS_dpsk(theta==0) = min([STS_dpsk(theta==0);2*pi - STS_dpsk(theta==0)],[],1);
|
||
|
end
|