306 lines
14 KiB
Matlab
306 lines
14 KiB
Matlab
clc;clear;close all
|
||
|
||
% hdlsetuptoolpath('ToolName','Xilinx Vivado','ToolPath','D:\SoftWare\Xilinx\Vivado\2019.2\bin\vivado.bat');
|
||
%%配置参数
|
||
fs_L = 0.75e9; %硬件频率
|
||
fs_H = 12e9; %以高频近似理想信号
|
||
TargetFrequency = 3e9;
|
||
G = 1;
|
||
DownSample = 2;
|
||
simulink_time = 20e-6; %1.5*16e-6;1.5e-3
|
||
intp_mode = 3; %0不内插,1内插2倍,2内插4倍,3内插8倍
|
||
dac_mode_sel = 0; %选择DAC模式,0出八路,1邻近插值,2邻近插值
|
||
route_num = 5;
|
||
env_num = 7;
|
||
|
||
Ideal2Low = fs_H/(fs_L/2);
|
||
Ideal2Target = fs_H/TargetFrequency;
|
||
%% 添加路径、产生包络、配置S21参数、使用脚本计算
|
||
|
||
%%添加路径
|
||
% addpath(genpath('D:\Work\EnvData'));
|
||
% addpath(genpath('D:\Work\EnvData\data-v2'));
|
||
% addpath(genpath('D:\Work\TailCorr_20241008_NoGit'));
|
||
% addpath('D:\Work\TailCorr\script_m');
|
||
cd("D:\Work\EnvData\acz");
|
||
obj1 = py.importlib.import_module('acz');
|
||
py.importlib.reload(obj1);
|
||
cd("D:\Work\TailCorr_20241008_NoGit");
|
||
obj2 = py.importlib.import_module('wave_calculation');
|
||
py.importlib.reload(obj2);
|
||
cd("D:\Work\TailCorr");
|
||
%%产生包络
|
||
%按点数产生理想方波
|
||
% amp_rect = 1.5e4;
|
||
% %单位是ns front是到达时间,flat是持续时间,lagging是后边还有多少个0,会影响脚本的修正时间
|
||
% [front(1), flat(1), lagging(1)] = deal(50,100,7400);% 50,100,7400;100ns方波
|
||
% [front(2), flat(2), lagging(2)] = deal(50,4000,11500);% 50,4000,11500;4us方波
|
||
%
|
||
% for i = 1:2
|
||
% front_H(i) = front(i)*fs_H/1e9; flat_H(i) = flat(i)*fs_H/1e9; lagging_H(i) = lagging(i)*fs_H/1e9;
|
||
% wave_pre{i} = amp_rect*cat(2,zeros(1,front_H(i)),ones(1,flat_H(i)),zeros(1,lagging_H(i)));%脚本的单位是点数
|
||
% end
|
||
|
||
%flattop波
|
||
A = 1.5e4;
|
||
[edge(1), length_flattop(1)] = deal(2,30);%ns,在fsn_L取1时是参数里的length
|
||
[edge(2), length_flattop(2)] = deal(4,30);
|
||
[edge(3), length_flattop(3)] = deal(4,50);
|
||
[edge(4), length_flattop(4)] = deal(4,1000);
|
||
[edge(5), length_flattop(5)] = deal(100,10000);
|
||
for i = 1:5
|
||
[edge_H(i), length_H(i)] = deal(edge(i)*fs_H/1e9,length_flattop(i)*fs_H/1e9);
|
||
wave_pre{i} = flattop(A, edge_H(i), length_H(i), 1);
|
||
end
|
||
|
||
%acz波
|
||
amplitude = 1.5e4;
|
||
|
||
carrierFreq = 0.000000;
|
||
carrierPhase = 0.000000;
|
||
dragAlpha = 0.000000;
|
||
thf = 0.864;
|
||
thi = 0.05;
|
||
lam2 = -0.18;
|
||
lam3 = 0.04;
|
||
|
||
length_acz(1) = 30;
|
||
length_acz(2) = 50;
|
||
|
||
for i = 1:2
|
||
length_acz_H(i) = int32(length_acz(i)*fs_H/1e9);
|
||
wave_pre{i+5} = real(double(py.acz.aczwave(amplitude, length_acz_H(i), carrierFreq,carrierPhase, dragAlpha,thf, thi, lam2, lam3)));
|
||
end
|
||
|
||
for i = 1:7
|
||
wave_pre{i} = cat(2,wave_pre{i},zeros(1,floor(simulink_time*fs_H))); %校正前的高频信号
|
||
wave_preL{i} = wave_pre{i}(1:Ideal2Low:end); %校正前的低频信号
|
||
end
|
||
|
||
%%S21参数
|
||
amp_real{1} = [0.025 0.015 0.0002 0.2 0 0];
|
||
amp_imag{1} = [0 0 0 0 0 0];
|
||
time_real{1} = [-1/250, -1/650, -1/1600 -1/20 0 0];
|
||
time_imag{1} = [0 -1/300 -1/500 0 0 0];
|
||
|
||
amp_real{2} = [0.025 0.015 0.0002 0.2 0 0];
|
||
amp_imag{2} = [0 0 0 0 0 0];
|
||
time_real{2} = [-1/250, -1/650, -1/1600 -1/20 0 0];
|
||
time_imag{2} = [0 -1/300 -1/500 0 0 0];
|
||
|
||
amp_real{3} = [0.025 0.009 0.0002 0.2 0 0];
|
||
amp_imag{3} = [0 0.012 0 0 0 0];
|
||
time_real{3} = [-1/250, -1/650, -1/1600 -1/20 0 0];
|
||
time_imag{3} = [0 -1/300 -1/500 0 0 0];
|
||
|
||
|
||
amp_real{4}= [0.025 0.015 0.0002 0.2 0 0];
|
||
amp_imag{4}= [0 0 0 0 0 0];
|
||
time_real{4}= [-1/250, -1/2000, -1/1600 -1/20 0 0];
|
||
time_imag{4}= [0 -1/15 -1/50 0 0 0];
|
||
|
||
amp_real{5} = [0.025 0.009 0.0002 0.2 0 0];
|
||
amp_imag{5} = [0 0.012 0 0 0 0];
|
||
time_real{5} = [-1/250, -1/2000, -1/1600 -1/20 0 0];
|
||
time_imag{5} = [0 -1/15 -1/50 0 0 0];
|
||
|
||
for i = 1:5
|
||
amp_routing{i} = amp_real{1,i} + 1j*amp_imag{1,i};
|
||
time_routing{i} = time_real{1,i} + 1j*time_imag{1,i};
|
||
tau{i} = -1./time_routing{i};
|
||
end
|
||
|
||
%%python脚本校正结果
|
||
|
||
convolve_bound = int8(3);
|
||
calibration_time = int32(20e3);
|
||
cal_method = int8(1);
|
||
sampling_rateL = int64(fs_L/2);
|
||
sampling_rate = int64(fs_H);
|
||
|
||
%校正后的高频信号
|
||
for j = 1:route_num
|
||
for i = 1:env_num
|
||
wave_cal = cell(py.wave_calculation.wave_cal(wave_pre{1,i}, amp_real{1,j}, amp_imag{1,j}, time_real{1,j}, time_imag{1,j}, convolve_bound, calibration_time, cal_method, sampling_rate));
|
||
wave_revised{j,i} = double(wave_cal{1,1});
|
||
wave_calL = cell(py.wave_calculation.wave_cal(wave_preL{1,i}, amp_real{1,j}, amp_imag{1,j}, time_real{1,j}, time_imag{1,j}, convolve_bound, calibration_time, cal_method, sampling_rateL));
|
||
wave_revisedL{j,i} = double(wave_calL{1,1});
|
||
end
|
||
alpha{j} = double(wave_calL{1,2});
|
||
beta{j} = double(wave_calL{1,3});
|
||
end
|
||
% signalAnalyzer(wave_pre{1,1},'SampleRate',fs_H);
|
||
|
||
%校正后的低频信号
|
||
|
||
alpha_wideth=32;
|
||
beta_width=32;
|
||
%定点化系数
|
||
for i = 1:route_num
|
||
alphaFixRe{i} = ceil((2^(alpha_wideth-1))*real(alpha{i}));
|
||
alphaFixIm{i} = ceil((2^(alpha_wideth-1))*imag(alpha{i}));
|
||
betaFixRe{i} = ceil((2^(beta_width-1))*real(beta{i}));
|
||
betaFixIm{i} = ceil((2^(beta_width-1))*imag(beta{i}));
|
||
end
|
||
%% 仿真
|
||
for j = 1:route_num
|
||
for i = 1:env_num
|
||
options=simset('SrcWorkspace','current');
|
||
sim('z_dsp',[0,simulink_time]);
|
||
sim2m = @(x)reshape(logsout.get(x).Values.Data,[],1);
|
||
dout0{j,i} = sim2m("dout0");
|
||
dout1{j,i} = sim2m("dout1");
|
||
dout2{j,i} = sim2m("dout2");
|
||
dout3{j,i} = sim2m("dout3");
|
||
|
||
N = length(dout0{j,i});
|
||
cs_wave{j,i} = zeros(4*N,1);
|
||
|
||
cs_wave{j,i}(1:4:4*N) = dout0{j,i};
|
||
cs_wave{j,i}(2:4:4*N) = dout1{j,i};
|
||
cs_wave{j,i}(3:4:4*N) = dout2{j,i};
|
||
cs_wave{j,i}(4:4:4*N) = dout3{j,i};
|
||
|
||
HardwareMeanIntpData{j,i} = cs_wave{j,i};%硬件校正后内插
|
||
DownsamplingBy12GData{j,i} = wave_revised{j,i}(1:Ideal2Target:end);
|
||
[DownsamplingBy12GDataAlign{j,i},HardwareMeanIntpDataAlign{j,i},Delay(j,i)] = ...
|
||
alignsignals(DownsamplingBy12GData{j,i}(1:round(TargetFrequency*20e-6)),HardwareMeanIntpData{j,i}(1:round(TargetFrequency*20e-6)),"Method","xcorr");
|
||
end
|
||
end
|
||
% signalAnalyzer(DownsamplingBy12GDataAlign{1},HardwareMeanIntpDataAlign{1},'SampleRate',3e9);
|
||
%% 绘图并保存
|
||
close all;
|
||
|
||
Amp = 1.5e4;
|
||
FallingEdge = [
|
||
% 150e-9,4050e-9,...%矩形波
|
||
30e-9,30e-9,50e-9,1000e-9,10000e-9,...%flattop
|
||
30e-9,50e-9%acz
|
||
];
|
||
|
||
name = [
|
||
"第一组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||
"第一组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||
"第一组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||
"第一组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||
"第一组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||
"第一组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||
"第一组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||
"第二组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||
"第二组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||
"第二组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||
"第二组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||
"第二组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||
"第二组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||
"第二组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||
"第三组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||
"第三组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||
"第三组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||
"第三组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||
"第三组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||
"第三组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||
"第三组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||
"第四组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||
"第四组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||
"第四组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||
"第四组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||
"第四组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||
"第四组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||
"第四组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||
"第五组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后10ns",...
|
||
"第五组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后10ns",...
|
||
"第五组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后10ns",...
|
||
"第五组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后10ns",...
|
||
"第五组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后10ns",...
|
||
"第五组S21参数_acz_持续时间30ns_下降沿后10ns.fig",...
|
||
"第五组S21参数_acz_持续时间50ns_下降沿后10ns.fig";
|
||
"第一组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||
"第一组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||
"第一组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||
"第一组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||
"第一组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||
"第一组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||
"第一组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||
"第二组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||
"第二组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||
"第二组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||
"第二组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||
"第二组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||
"第二组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||
"第二组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||
"第三组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||
"第三组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||
"第三组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||
"第三组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||
"第三组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||
"第三组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||
"第三组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||
"第四组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||
"第四组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||
"第四组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||
"第四组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||
"第四组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||
"第四组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||
"第四组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||
"第五组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后1us",...
|
||
"第五组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后1us",...
|
||
"第五组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后1us",...
|
||
"第五组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后1us",...
|
||
"第五组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后1us",...
|
||
"第五组S21参数_acz_持续时间30ns_下降沿后1us.fig",...
|
||
"第五组S21参数_acz_持续时间50ns_下降沿后1us.fig";
|
||
];
|
||
|
||
Delay_mode = mode(Delay,'all');
|
||
fileID = fopen('20241223_output.txt', 'w');
|
||
if fileID == -1
|
||
disp('文件打开失败');
|
||
else
|
||
|
||
end
|
||
|
||
for j = 1:route_num
|
||
for i = 1:env_num
|
||
start_time(i) = abs(Delay_mode)/(TargetFrequency/1e9)*1e-9;%由于相位修正后会有偏移的点数,所以需要考虑上这个偏移的时间,采样率为3GHz,3个点对应1ns
|
||
edge_Align(i) = FallingEdge(i) + start_time(i);
|
||
tmp(i) = edge_Align(i) + 10e-9;
|
||
a{i} = [start_time(i)-5e-9 tmp(i)];%[1/fs_H 50e-9];[50e-9 1.5e-6],[500e-9+10e-9 tmp-20e-9]
|
||
b{i} = [tmp(i) 20e-6];
|
||
fig1 = figure('Units','normalized','Position',[0.000390625,0.517361111111111,0.49921875,0.422916666666667]);
|
||
diff_plot_py(TargetFrequency,HardwareMeanIntpDataAlign{j,i}', DownsamplingBy12GDataAlign{j,i}(1:floor(TargetFrequency*20e-6)),'HardwareRevised','ScriptRevised',a{i},Amp,edge_Align(i),fileID);
|
||
title(name(i,1),Interpreter="none");
|
||
savefig(name(j,i));
|
||
fig2 = figure('Units','normalized','Position',[0.000390625,0.034027777777778,0.49921875,0.422916666666667]);
|
||
diff_plot_py(TargetFrequency,HardwareMeanIntpDataAlign{j,i}', DownsamplingBy12GDataAlign{j,i}(1:floor(TargetFrequency*20e-6)),'HardwareRevised','ScriptRevised',b{i},Amp,edge_Align(i),fileID);
|
||
title(name(i,2),Interpreter="none");
|
||
savefig(name(j+5,i));
|
||
end
|
||
end
|
||
fclose(fileID);
|
||
%% 可视化S21参数
|
||
t = 0:1/(1e2):10000;
|
||
|
||
for i = 1:1:length(amp_routing)
|
||
S21_time(:,i) = amp_routing(i)*exp(time_routing(i)*t);
|
||
end
|
||
|
||
figure
|
||
plot(t*1e-9,real(sum(S21_time,2)));
|
||
grid on
|
||
title("s(t)");
|
||
% savefig("S21参数");
|
||
|
||
% signalAnalyzer(real(sum(S21_time,2)),'SampleRate',1e11);%时间是1ns,还得加上采样率
|
||
|
||
% rmpath(genpath('D:\Work\EnvData'));
|
||
% rmpath(genpath('D:\Work\EnvData\data-v2'));
|
||
% rmpath(genpath('D:\Work\TailCorr_20241008_NoGit'));
|
||
%% 图像可视化
|
||
cd("D:\Work\TailCorr\仿真结果\20241101_125M八倍内插至1G_第1组S21参数")
|
||
for i = 1:8
|
||
close all
|
||
open(name(i,1));
|
||
open(name(i,2));
|
||
pause()
|
||
end
|