TailCorr/script_m/z_dsp.m

210 lines
8.1 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

clc;clear;close all
% hdlsetuptoolpath('ToolName','Xilinx Vivado','ToolPath','D:\SoftWare\Xilinx\Vivado\2019.2\bin\vivado.bat');
addpath(genpath('D:\Work\EnvData'));
addpath(genpath('D:\Work\EnvData\data-v2'));
% addpath(genpath('D:\Work\TailCorr_20241008_NoGit'));
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\script_m");
fs_L = 0.75e9; %硬件频率
fs_H = 12e9; %以高频近似理想信号
TargetFrequency = 3e9;
Ideal2Low = fs_H/(fs_L/2);
Ideal2Target = fs_H/TargetFrequency;
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邻近插值
%按点数产生理想方波
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,115004us方波
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(6,50);
for i = 1:4
[edge_H(i), length_H(i)] = deal(edge(i)*fs_H/1e9,length_flattop(i)*fs_H/1e9);
wave_pre{i+2} = 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+6} = real(double(py.acz.aczwave(amplitude, length_acz_H(i), carrierFreq,carrierPhase, dragAlpha,thf, thi, lam2, lam3)));
end
% signalAnalyzer(wave_pre{2},'SampleRate',fs_H);
for i = 1:8
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
% signalAnalyzer(HardwareMeanIntpDataAlign{1},'SampleRate',3e9);
%%%python脚本校正结果
%S21参数
amp_real = [0.025 0.015 0.0002 0 0 0];
amp_imag = [0 0 0 0 0 0];
time_real = [-1/250, -1/650, -1/1600 0 0 0];
time_imag = [0 0 0 0 0 0];
% amp_real = [0.0539981,-0.0319766,0.084015161,0.0048,0,0];
% amp_imag = [0,-0.041014189,-0.052936266,0,0,0];
% time_real = [-0.0024820146,-0.0080529118,-0.006728925,-0.0001,0,0];
% time_imag = [0,-0.008137675,-0.0033212836,0,0,0];
%
% amp_real = [0.025 0.015 0.0002 0.2 0 0];
% amp_imag = [0 0 0 0 0 0];
% time_real = [-1/250, -1/650, -1/1600 -1/20 0 0];
% time_imag = [0 0 0 0 0 0];
amp_routing = amp_real + 1j*amp_imag;
time_routing = time_real + 1j*time_imag;
tau = -1./time_routing;
convolve_bound = int8(3);
calibration_time = int32(20e3);
cal_method = int8(1);
sampling_rateL = int64(fs_L/2);
sampling_rate = int64(fs_H);
%校正后的高频信号
for i = 1:8
wave_cal = cell(py.wave_calculation.wave_cal(wave_pre{i}, amp_real, amp_imag, time_real, time_imag, convolve_bound, calibration_time, cal_method, sampling_rate));
wave_revised{i} = double(wave_cal{1,1});
wave_calL = cell(py.wave_calculation.wave_cal(wave_preL{i}, amp_real, amp_imag, time_real, time_imag, convolve_bound, calibration_time, cal_method, sampling_rateL));
wave_revisedL{i} = double(wave_calL{1,1});
end
%校正后的低频信号
alpha = double(wave_calL{1,2});
beta = double(wave_calL{1,3});
beta(5:6) = 0;
alpha_wideth=32;
beta_width=32;
alphaFixRe = ceil((2^(alpha_wideth-1))*real(alpha));
alphaFixIm = ceil((2^(alpha_wideth-1))*imag(alpha));
betaFixRe = ceil((2^(beta_width-1))*real(beta));
betaFixIm = ceil((2^(beta_width-1))*imag(beta));
%%%仿真
for i = 1:8
options=simset('SrcWorkspace','current');
sim('z_dsp',[0,simulink_time]);
sim2m = @(x)reshape(logsout.get(x).Values.Data,[],1);
dout0{i} = sim2m("dout0");
dout1{i} = sim2m("dout1");
dout2{i} = sim2m("dout2");
dout3{i} = sim2m("dout3");
N(i) = length(dout0{i});
cs_wave{i} = zeros(4*N(i),1);
cs_wave{i}(1:4:4*N) = dout0{i};
cs_wave{i}(2:4:4*N) = dout1{i};
cs_wave{i}(3:4:4*N) = dout2{i};
cs_wave{i}(4:4:4*N) = dout3{i};
HardwareMeanIntpData{i} = cs_wave{i};%硬件校正后内插
DownsamplingBy12GData{i} = wave_revised{i}(1:Ideal2Target:end);
[DownsamplingBy12GDataAlign{i},HardwareMeanIntpDataAlign{i},Delay(i)] = ...
alignsignals(DownsamplingBy12GData{i}(1:round(TargetFrequency*20e-6)),HardwareMeanIntpData{i}(1:round(TargetFrequency*20e-6)),"Method","xcorr");
end
% signalAnalyzer(DownsamplingBy12GDataAlign{1},HardwareMeanIntpDataAlign{1},'SampleRate',3e9);
%% 绘图并保存
close all;
Amp = 1.5e4;
FallingEdge = [
150e-9,4050e-9,...%矩形波
30e-9,30e-9,50e-9,50e-9,...%flattop
30e-9,50e-9%acz
];
name = [
"rect_100ns_校正后的波形_下降沿后10ns.fig","rect_100ns_校正后的波形_下降沿后1us.fig";
"rect_4us_校正后的波形_下降沿后10ns.fig","rect_4us_校正后的波形_下降沿后1us.fig";
"flattop_上升沿2ns_持续时间30ns_校正后的波形_下降沿后10ns.fig","flattop_上升沿2ns_持续时间30ns_校正后的波形_下降沿后1us.fig";
"flattop_上升沿4ns_持续时间30ns_校正后的波形_下降沿后10ns.fig","flattop_上升沿4ns_持续时间30ns_校正后的波形_下降沿后1us.fig";
"flattop_上升沿4ns_持续时间50ns_校正后的波形_下降沿后10ns.fig","flattop_上升沿4ns_持续时间50ns_校正后的波形_下降沿后1us.fig";
"flattop_上升沿6ns_持续时间50ns_校正后的波形_下降沿后10ns.fig","flattop_上升沿6ns_持续时间50ns_校正后的波形_下降沿后1us.fig";
"acz_持续时间30ns_校正后的波形_下降沿后10ns.fig","acz_持续时间30ns_校正后的波形_下降沿后1us.fig";
"acz_持续时间50ns_校正后的波形_下降沿后10ns.fig","acz_持续时间50ns_校正后的波形_下降沿后1us.fig";
];
Delay_mode = mode(Delay);
for i = 1:8
start_time(i) = abs(Delay_mode)/(TargetFrequency/1e9)*1e-9;%由于相位修正后会有偏移的点数所以需要考虑上这个偏移的时间采样率为3GHz3个点对应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) 10e-6];
fig1 = figure('Units','normalized','Position',[0.000390625,0.517361111111111,0.49921875,0.422916666666667]);
diff_plot_py(TargetFrequency,HardwareMeanIntpDataAlign{i}', DownsamplingBy12GDataAlign{i}(1:floor(TargetFrequency*20e-6)),'HardwareRevised','ScriptRevised',a{i},Amp,edge_Align(i));
title(name(i,1),Interpreter="none");
savefig(name(i,1));
fig2 = figure('Units','normalized','Position',[0.000390625,0.034027777777778,0.49921875,0.422916666666667]);
diff_plot_py(TargetFrequency,HardwareMeanIntpDataAlign{i}', DownsamplingBy12GDataAlign{i}(1:floor(TargetFrequency*20e-6)),'HardwareRevised','ScriptRevised',b{i},Amp,edge_Align(i));
title(name(i,2),Interpreter="none");
savefig(name(i,2));
end
%% 可视化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