算法原理参考https://zhuanlan.zhihu.com/p/345445660
时间同步原理框图:
Matlab仿真流程:1)产生调制数据;
2)插入帧头(帧同步);
3)成形滤波上采样;
4)加入采样偏差;
5)接收匹配滤波;
6)gardner定时同步;
7)帧同步;
8)解调;
9)误码统计;
clc
clear
close all
%% 参数设置
len = 1e4; % 每帧仿真数据长度
fame = 4; %% 帧数,帧数越多误码率越精确,仿真速度越慢
mtype = 3; %% 调制方式 1:bpsk , 2:qpsk , 3:8psk
snr = 30 ; %% 信噪比
%% 生成bit数据
msg = randi([0 1],len*mtype,1); % 生成bit信号
[tx_mod] = modulation(mtype,msg);
figure(1)
plot(tx_mod,'.r')
title('调制后星座图')
%% 重复多帧
head = tx_mod(1:64); %% 取64个符号作为同步帧头
tx_mod_r = repmat(tx_mod.',1,fame); %% 重复帧数
%% 2倍成型滤波
sps = 2; %% 上采样倍数
Alpha = 0.45; %%滚降系数
[tx_fir,fir_hn] = rcos_up(tx_mod_r,sps,Alpha);
%% 加噪声
tx_agwn = awgn(tx_fir,snr);
%% 加入采样偏差
fs = 100e6;
ppm = 100e-6;
data_rx = func_reshape(tx_agwn,fs,ppm);
%% 接收匹配滤波
data_farrow = filter(fir_hn,1,data_rx);
figure(9)
plot(data_farrow(end-1e4:end),'.r');
title('时间同步前星座图')
%% 时间同步
[gardner_out,miu_out] = gardner_func(data_farrow);
figure(10)
plot(gardner_out(end-1e4:end),'.r');
title('时间同步后星座图')
figure(11)
plot(miu_out );
title('时间同步收敛uk')
%% 符号同步
sync_out = xcorr(head.',gardner_out);
figure(12)
plot(abs(sync_out));
title('符号同步相关峰')
function [output ] = func_reshape(input,fs,ppm)
% fs = 100e6;
% ppm = 100e-6;
fs_rx= fs + fs*ppm;
output = resample(input, fs_rx ,fs);
end
function [output,fir] = rcos_up(input,sps,Alpha)
span = 16; % number of symbols
fir = rcosdesign(Alpha,span,sps,'sqrt'); %%产生根升余弦滤波器系数
% fvtool(fir)
output = upfirdn(input,fir,sps); %%内插滤波
end
需要gardner-matlab和FPGA代码可私信交流。