📄 rx_frequency_sync.m
字号:
%Frequency error estimation and correction
function [out_signal, freq_est] = rx_frequency_sync(rxsignal, thres_idx, sys_parm)
global ofdm_data_parm_const;
%Estimate the frequency error
if sys_parm.FreqSync
%Short training symbol periodicity
D = (sys_parm.TotNumSubc * sys_parm.OverSamp + ofdm_data_parm_const.CPLength) * 2 / 10;
%Allows for error in packet detection
pkt_det_offset = D;
%Averaging length
rlen = 8 * D;
phase = rxsignal(pkt_det_offset: pkt_det_offset + rlen - D) .* ...
conj(rxsignal(pkt_det_offset + D : pkt_det_offset + rlen));
%Add all estimates
phase = sum(phase);
freq_est = - angle(phase) / (2 * D * pi / sys_parm.SampFreq);
radians_per_sample = 2 * pi * freq_est / sys_parm.SampFreq;
else
%Magic number
freq_est = sys_parm.FreqErr;
radians_per_sample = 2 * pi * freq_est / sys_parm.SampFreq;
end
% fprintf('The frequency estimation is : %d\n', freq_est);
%Now create a signal that has the frequency offset in the other direction
siglen = length(rxsignal);
time_base = [0 : siglen - 1];
correction_signal = exp(- j * (radians_per_sample) * time_base);
%And finally apply correction on the signal
out_signal = rxsignal .* correction_signal;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -