function fre_offset_estimation = Kay_algorithm(received_signal,pulse_wave,training_data)
%--------------------------------------------------------------------------
% 函数功能:Kay算法频率偏移估计
% 输入参数:received_signal:从信道接收的QPSK信号
% pulse_wave:基带成型脉冲,作为MF的冲激响应
% training_data:训练符号集,用于辅助估计频率偏移
% 输出参数:fre_offset_estimation:频率偏移估计
%--------------------------------------------------------------------------
global fs fc fb pulse_type training_symbol_num;
received_signal = received_signal(1,1:training_symbol_num*fs/fb); %只提取接收信号中包含训练符号的部分进行处理
t = 0 : 1/fs : (length(received_signal)-1)/fs;
%-----------------I路和Q路信号分别解调------------------%
I_base_signal = sqrt(2) * received_signal .* cos(2*pi*fc*t); %I路信号解调
Q_base_signal = -sqrt(2) * received_signal .* sin(2*pi*fc*t); %Q路信号解调
if strcmp(pulse_type,'rect')==1
inf_signal_I = filter(pulse_wave,1,[I_base_signal,zeros(1,16*fs/fb)])./length(pulse_wave); %用矩形成型脉冲进行匹配滤波时,为了避免星座图的幅度失真,需要除以归一化因子length(pulse_wave),另外对I路信号补零是为了避免使用filter函数对输出信号进行截断,如果使用conv函数可以不用补零
inf_signal_Q = filter(pulse_wave,1,[Q_base_signal,zeros(1,16*fs/fb)])./length(pulse_wave);
else
inf_signal_I = filter(pulse_wave,1,[I_base_signal,zeros(1,16*fs/fb)]); %用根方升余弦成型脉冲进行匹配滤波
inf_signal_Q = filter(pulse_wave,1,[Q_base_signal,zeros(1,16*fs/fb)]);
end
data_sample_flag = length(pulse_wave): fs/(fb) : length(pulse_wave)+(training_symbol_num-1)*(fs/fb)+1; %确定采样位置
sampled_point_I = inf_signal_I(1,data_sample_flag); %对I、Q两路匹配滤波器输出进行采样
sampled_point_Q = inf_signal_Q(1,data_sample_flag);
demodulation_data = sampled_point_I + sqrt(-1).*sampled_point_Q; %获得x(k),用于进行频偏估计
%-----------利用Kay算法进行频偏估计-------------%
Z_vector = demodulation_data .* (training_data').'; %先求出z(k)
gama=zeros(1,training_symbol_num);
arg=zeros(1,training_symbol_num);
mult=zeros(1,training_symbol_num);
for k=2:training_symbol_num
gama(k)=3*training_symbol_num*(training_symbol_num^2-(2*k-training_symbol_num)^2)/((training_symbol_num^2)*2*(training_symbol_num^2-1));
arg(k)=angle(Z_vector(k)*Z_vector(k-1)');
mult(k)=gama(k)*arg(k);
end
fre_offset_estimation = fb * sum(mult.')/(2*pi);
end
评论3