HE/WaveAdp/STS_demod.m

68 lines
2.2 KiB
Mathematica
Raw Permalink Normal View History

2024-03-30 16:35:40 +08:00
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