clc
clear
close all
Data_Len = 30000; % 调整运行时间
synnum = 100; % 调整同步输出时间
Fd = 800; % 符号速率
Fs = 32e3; % 采样频率
Fo = 1e3; % 残留频差
phaseo = pi/7; % 残留相差
SNR = 30; % 信道仿真S/N
RolloffCoef = 0.25; % 滚降系数
T_Gain = 9 * 1e-10; % 定时误差检测(TED)环路增益
%环路滤波器参数
K1 = 0.022013 * 1e-0;
K2 = 0.00024722 * 1e-0;
mapvalue = 2048; % 星座图映射
Ratio = Fs/Fd/2; % 0.5个符号的样点数
Offset = 32; %
timing_error = 0;
datalen = Fs / Fd * (Data_Len - Offset); % 仿真样点个数
displaysize = 512;
ted_out = zeros(1,displaysize);
Interp_Pos = 2 * Ratio + Ratio; % 6个采样点,1.5个符号(初始内插样点)
Rec_out = zeros(1,displaysize);
Rec_out_freq = zeros(1,displaysize);
Rec_out_srrc_wave = zeros(1,displaysize);
disp('1 Data Send');
%1+++++++++++++Data Source+++++++++++++++++++
disp(' 1.1 随机数据源');
rand('state', sum(100*clock));
randx = rand(2,Data_Len);
for i=1:Data_Len;
if(randx(1,i) > 0.75)
I(i) = mapvalue;
elseif((randx(1,i) > 0.50) && (randx(1,i) <= 0.75))
I(i) = mapvalue/3;
elseif((randx(1,i) > 0.25) && (randx(1,i) <= 0.50))
I(i) = -mapvalue/3;
else
I(i) = -mapvalue;
end
if(randx(2,i) > 0.75)
Q(i) = mapvalue;
elseif((randx(2,i) > 0.50) && (randx(2,i) <= 0.75))
Q(i) = mapvalue/3;
elseif((randx(2,i) > 0.25) && (randx(2,i) <= 0.50))
Q(i) = -mapvalue/3;
else
Q(i) = -mapvalue;
end
end
x = I + i * Q;
h1 = figure(1);
set(h1,'position',[20,500,600,400]);
plot(x,'rh');
xlabel('real')
ylabel('image')
title('发送星座图')
grid on;
% figure(10)
% startI = 2500;
% endI = 2850;
% plot(startI-2300:endI-2300,datai(startI : endI),'r*')
% hold on;
% plot(startI-2300:endI-2300,datai(startI : endI))
% hold off;
% grid on
% title(' SRRC后I路时域信号');
%
%+++++++++++++脉冲成型+++++++++++++++++++
% 调用matlab库函数
%+++++++++++++++++++++++++++++++++++++++
disp(' 1.2 脉冲成型');
% 缺省延时参数(delay)为3,对应滤波器阶数为 1 + 2 * delay * Fs/Fd = 61。
% 首先对输入数据x内插成Fs/Fd倍,然后经过SRRC滤波器。
% 输出数据的长度为 length(x) + 2 * delay * Fs/Fd = length(x_t)
x_t = rcosflt(x,Fd,Fs,'sqrt',RolloffCoef);
% 观察原始发送数据和经过发送SRRC数据时域图
% SRRC在30个(delay * Fs/Fd = 3 * 10 = 30)采样点后输出
x_10 = [x; x; x; x; x; x; x; x; x; x];
x_10 = reshape(x_10,1,length(x)*Fs/Fd);
% figure(10)
% startI = 1;
% endI = 300;
% delay = 3 * Fs/Fd;
% plot(startI:10:endI,real(x_10(startI :10 : endI)),'kp')
% hold on;
% stairs(startI:endI,real(x_10(startI : endI)),'m:')
% hold on
% plot(startI:endI,real(x_t(startI+delay : endI+delay)),'r*')
% hold on;
% plot(startI:endI,real(x_t(startI+delay : endI+delay)))
% hold off;
% title(' 发送原始信号和发送SRRC后I路时域信号比较');
%+++++++++++++信道仿真+++++++++++++++++++++
% 使用库函数加入高斯白噪
%+++++++++++++++++++++++++++++++++++++++++
disp('2 信道仿真,数据加噪');
c_t = awgn(x_t,SNR,'measured');
%+++++++++++++加入频偏+++++++++++++++++++++
%
%+++++++++++++++++++++++++++++++++++++++++
disp('3 加入频偏和相差');
ejw = cos( 2 * pi * (Fo / Fs) * ( 1 : 1 : length(c_t)) + phaseo) + j * sin( 2 * pi * (Fo / Fs) * ( 1 : 1 : length(c_t)) + phaseo);
c_t = c_t .* ejw';
%++++++++++++++++++接收++++++++++++++++++++
disp('4 Receive');
%4++++++++++++++波形匹配+++++++++++++++++++
disp(' 4.1 波形匹配滤波器');
r_t = rcosflt(c_t,Fd,Fs,'sqrt/Fs',RolloffCoef);
% figure(15)
% startI = 1;
% endI = 300;
% delay = 2 * 3 * Fs/Fd;
% plot(startI:10:endI,real(x_10(startI :10: endI)),'kp')
% hold on;
% stairs(startI:endI,real(x_10(startI : endI)),'m:')
% hold on
% plot(startI:endI,real(r_t(startI+delay : endI+delay)),'r*')
% hold on;
% plot(startI:endI,real(r_t(startI+delay : endI+delay)))
% hold off;
% title(' 发送原始信号和接收SRRC后I路时域信号比较');
% 取数据,把滤波器产生的时延数据去掉
matched_data = r_t( Offset+1:end-Offset );
h20 = figure(20);
set(h20,'position',[20,20,600,400]);
startI = 301;
endI = 600;
plot(startI:endI,real(matched_data(startI : endI)),'r*')
hold on;
plot(startI:endI,real(matched_data(startI : endI)))
hold off;
title(' SRRC后I路时域信号');
grid
%++++++++++++++AGC+++++++++++++++++++
disp(' 4.2 自动增益控制');
% Thr = 1.0;
% alpha = 0.001;
%
%
% % 增益调整
%
% [dataagc,gainagc] = logAGC(matched_data,Thr,alpha);
%
%
% for n = 10:20
% figure(25)
% startI = (2 * n + 1) * 200;
% endI = (2 * n + 3) * 200;
% subplot(2,1,1);
% plot(startI:endI,real(matched_data(startI : endI)),'r*')
% hold on;
% plot(startI:endI,real(matched_data(startI : endI)))
% hold on
% plot(startI:endI,real(dataagc(startI+1 : endI+1)),'kp')
% hold on;
% stairs(startI:endI,real(dataagc(startI+1 : endI+1)),'m:')
% title(' 接收SRRC后I路时域信号和AGC增益调整后比较');
% hold off;
%
% subplot(2,1,2);
% plot(startI:endI,gainagc(startI : endI),'r*')
% hold on;
% plot(startI:endI,gainagc(startI : endI))
% title(' AGC增益');
% hold off;
%
% pause(0.1);
% end
%
% % AGC后的信号
% matched_data(1:(length(matched_data)-1)) = dataagc(2:length(matched_data));
disp(' 4.3 定时同步和均衡');
disp(' 4.3.1 Gardner定时恢复');
% Gardner算法的子函数
figuren1 = 51;
figuren2 = 52;
syndata = zeros(length(matched_data) - Offset,1); % 同步数据
% syndata = GardnerSyn(matched_data,Offset,Ratio,Interp_Pos,displaysize,Rec_out,ted_out,synnum,figuren1,figuren2,T_Gain);
% 自建内联函数
C_2 = inline('0.5*u^2-0.5*u');
C_1 = inline('-0.5*u^2+1.5*u');
C0 = inline('-0.5*u^2-0.5*u+1');
C1 = inline('0.5*u^2-0.5*u');
ted_data1 = matched_data(Offset); % 第一个数据
ted_data2 = matched_data(Offset+Ratio); % 第二个数据,相差半个符号(2个样点)
k = 1; % 同步数据和定时误差检测个数
count = 0; % 处理样点个数
k_freq = 1;
count_freq = 0;
k_srrc_wave = 1;
count_srrc_wave = 0;
syndatacnt = 1; % 同步数据个数
disp(' 4.3.2 频差估计和载波同步');
% =============================================
% 频差辅助下载波同步算法 %
%
% =============================================
%
% 初始化
syndata_len = length(syndata); % 同步输出数据长度
Signal_PLL = zeros(syndata_len,1); % 相位补偿后的数据
NCO_Phase = zeros(syndata_len,1); % NCO
Discriminator_Out = zeros(syndata_len,1); % 鉴相输出
Freq_Control = zeros(syndata_len,1); % 环路输出
PLL_Phase_Part = zeros(syndata_len,1); % 环路相位部分输出
PLL_Freq_Part = zeros(syndata_len,1); % 环路相频部分输出
count_loop = 0;
while( count_loop < 1000)
count_loop = count_loop + 1;
disp(sprintf('%d\n',count_loop));
Ratio = Fs/Fd/2; % 0.5个符号的样点数
Offset = 32; %
timing_error = 0;
datalen = Fs / Fd * (Data_Len - Offset); % 仿真样点个数
displaysize = 512;
ted_out = zeros(1,displaysize);
Interp_Pos = 2 * Ratio + Ratio; % 6个采样点,1.5个符号(初始内插样点)
Rec_out = zeros(1,displaysize);
Rec_out_freq = zeros(1,displaysize);
Rec_out_srrc_wave = zeros(1,displaysize);
% 自建内联函数
C_2 = inline('0.5*u^2-0.5*u');
C_1 = inline('-0.5*u^2+1.5*u');
C0 = inline('-0.5*u^2-0.5*u+1');
C1 = inline('0.5*u^2-0.5*u');
%环路滤波器参数
K1 = 0.022013 * 1e-0;
K2 = 0.00024722 * 1e-0;
ted_data1 = matched_data(Offset); % 第一个数据
ted_data2 = matched_data(Offset+Ratio); % 第二个数据,相差半个符号(2个样点)
评论2