From 59eb3f1d1c205ea75c248db208f844c24e9205e9 Mon Sep 17 00:00:00 2001 From: unknown <2779155576@qq.com> Date: Thu, 2 Jan 2025 13:37:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=9F=E8=84=9A=E6=9C=AC=E5=A4=AA=E9=95=BF?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E5=85=B6=E5=88=92=E5=88=86=E4=B8=BA=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97=E4=BB=A5=E9=9D=A2?= =?UTF-8?q?=E5=90=91=E5=AF=B9=E8=B1=A1=E7=9A=84=E7=BC=96=E7=A8=8B=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E8=BF=9B=E8=A1=8C=E5=B0=81=E8=A3=85=E7=AE=A1=E7=90=86?= =?UTF-8?q?=20=E7=9B=AE=E5=89=8D=E5=B7=B2=E5=AE=8C=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E8=AE=BE=E8=AE=A1=EF=BC=8C=E4=BD=86=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F=E4=BC=A0=E5=8F=82=EF=BC=8C?= =?UTF-8?q?=E6=9C=AA=E6=9D=A5=E9=9C=80=E8=A6=81=E7=BB=B4=E6=8A=A4=EF=BC=9B?= =?UTF-8?q?=20=E5=8C=85=E7=BB=9C=E7=9A=84=E4=BA=A7=E7=94=9F=E8=BF=98?= =?UTF-8?q?=E4=B8=8D=E5=A4=9F=E7=81=B5=E6=B4=BB=EF=BC=9B=20=E8=BF=99?= =?UTF-8?q?=E9=87=8C=E5=8F=AA=E6=98=AF=E6=89=AB=E6=8F=8F=E7=BA=BF=E8=B7=AF?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=92=8C=E6=B3=A2=E5=BD=A2=EF=BC=8C=E4=BD=86?= =?UTF-8?q?=E8=BF=98=E6=B2=A1=E6=9C=89=E6=94=AF=E6=8C=81=E5=AF=B9=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E9=87=87=E6=A0=B7=E7=8E=87=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E6=89=AB=E6=8F=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: thfu --- script_m/diff_plot_py.m | 72 ---- script_m/z_dsp.m | 895 +++++++++++++++++++++++++--------------- script_m/z_dsp_top.m | 66 +++ 3 files changed, 624 insertions(+), 409 deletions(-) delete mode 100644 script_m/diff_plot_py.m create mode 100644 script_m/z_dsp_top.m diff --git a/script_m/diff_plot_py.m b/script_m/diff_plot_py.m deleted file mode 100644 index acadcbf..0000000 --- a/script_m/diff_plot_py.m +++ /dev/null @@ -1,72 +0,0 @@ -%compare FIL with python script -function diff_plot_py(fs,iir_out, Script_out,title1,title2,a,amp,edge,fileID) -%输入数据长度不等时取其公共部分 -N = min(length(iir_out),length(Script_out)); -iir_out = iir_out(1:N); -Script_out = Script_out(1:N); - -diff = (iir_out - Script_out)/amp;%求差,并归一化 - -n = (0:1:N-1)/fs; -%找出关心的数据点 -n_edge = find(n>=edge-1e-12);%edge代表下降沿 -n50 = find(n>=edge+20e-9-1e-12);%下降沿后20ns -n20_40 = find((n>=edge+20e-9-1e-12) & (n<=edge+40e-9+1e-12));%下降沿后20ns到40ns -n1000 = find(n>=edge+1000e-9-1e-12);%下降沿后1us -n1000_1100 = find((n>=edge+1000e-9-1e-12) & (n<=edge+1100e-9+1e-12));%下降沿后1us到1.1us - -ne = find((abs(diff)>=1e-4) & (abs(diff)<1));%误差小于万分之一的点 -ne(1) = 1; - -window_length = 100e-9*fs; -diff_mean_window = movmean(diff,window_length); -diff_std_window = movstd(diff,window_length); -n_mean_window = find((abs(diff_mean_window)>=1e-4) );%100ns窗,误差均值小于万分之一点 -n_std_window = find((abs(diff_std_window)>=1e-4) ); %100ns窗,误差方差小于万分之一点 -n_common = max(n_mean_window(end),n_std_window(end)); -%原始数据作图 -tiledlayout(2,1) -ax1 = nexttile; -plot(n,iir_out,n,Script_out) -legend(title1,title2) -xlabel('t/s') -xlim(a) -grid on -hold on - -%差值做图 -ax2 = nexttile; -plot(n,diff) -xlabel('t/s') -title('diff') -grid on -hold on -xlim(a) -linkaxes([ax1,ax2],'x'); - -plot_p = @(x)[ - plot(n(x),diff(x),'r*'); - text(n(x), diff(x)+diff(x)*0.1, ['(',num2str(n(x)),',',num2str(diff(x)),')'],'color','k'); - ]; - -ne(1) = 1; - -% [diff_max,R_mpos] = max(abs(diff));%误差最大值 -% plot_p(R_mpos); - -if a(2) <= 5e-6 - plot_p(n_edge(1));%下降沿 - % plot_p(R_mpos); -elseif a(2) == 20e-6 - plot_p(n50(1)); %下降沿20ns - plot_p(n1000(1)); %下降沿1us - plot_p(ne(end)); %误差小于万分之一 - fprintf(fileID,"Falling edge of 20ns~40ns mean :%.4e\t std :%.4e\t",mean(diff(n20_40)),std(diff(n20_40))); - fprintf(fileID,"Falling edge of 1us~1.1us mean :%.4e\t std :%.4e\t",mean(diff(n1000_1100)),std(diff(n1000_1100))); - % fprintf("The error after falling edge of 1us is:%.4e\t",diff(n1000(1))); - % fprintf("The time of erroe less than 1e-4 is :%.4e us\n",(n(ne(end))-n(n_edge(1)))); - fprintf(fileID,"The mean and std stably less than 1e-4 is :%.4e s\n",(n(n_common)-n(n_edge(1)))); -end - - - diff --git a/script_m/z_dsp.m b/script_m/z_dsp.m index e69c58f..cd2c5b7 100644 --- a/script_m/z_dsp.m +++ b/script_m/z_dsp.m @@ -1,343 +1,564 @@ -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 0 0 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 m = 1:route_num - for n = 1:env_num - wave_cal = cell(py.wave_calculation.wave_cal(wave_pre{1,n}, amp_real{1,m}, amp_imag{1,m}, time_real{1,m}, time_imag{1,m}, convolve_bound, calibration_time, cal_method, sampling_rate)); - wave_revised{m,n} = double(wave_cal{1,1}); - wave_calL = cell(py.wave_calculation.wave_cal(wave_preL{1,n}, amp_real{1,m}, amp_imag{1,m}, time_real{1,m}, time_imag{1,m}, convolve_bound, calibration_time, cal_method, sampling_rateL)); - wave_revisedL{m,n} = double(wave_calL{1,1}); - end - alpha{m} = double(wave_calL{1,2}); - beta{m} = 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 m = 1:route_num - for n = 1:env_num - optnons=simset('SrcWorkspace','current'); - sim('z_dsp_FIL',[0,simulink_time]); - sim2m = @(x)reshape(logsout.get(x).Values.Data,[],1); - dout0{m,n} = sim2m("dout0"); - dout1{m,n} = sim2m("dout1"); - dout2{m,n} = sim2m("dout2"); - dout3{m,n} = sim2m("dout3"); - - N = length(dout0{m,n}); - cs_wave{m,n} = zeros(4*N,1); +classdef z_dsp < handle + properties + %input + fs_L; + fs_H; + TargetFrequency; + G; + simulink_time; + intp_mode; + dac_mode_sel; + route_num; + env_num; - cs_wave{m,n}(1:4:4*N) = dout0{m,n}; - cs_wave{m,n}(2:4:4*N) = dout1{m,n}; - cs_wave{m,n}(3:4:4*N) = dout2{m,n}; - cs_wave{m,n}(4:4:4*N) = dout3{m,n}; + %output + Ideal2Low; + Ideal2Target; + wave_pre; + wave_preL; + amp_real; + amp_imag; + time_real; + time_imag; + name; + wave_revised; + wave_revisedL; + DownsamplingBy12GDataAlign; + HardwareMeanIntpDataAlign; + Delay; + Delay_mode; + pause_time; + filename; + rpt_num; + FallingEdge; + Amp; + itv_time; %信号具有周期性时的间隔 + end + + methods + + function obj = z_dsp(fs_L,fs_H,TargetFrequency,G,simulink_time,intp_mode,dac_mode_sel) + obj.fs_L = fs_L; + obj.fs_H = fs_H; + obj.TargetFrequency = TargetFrequency; + obj.G = G; + obj.simulink_time = simulink_time; + obj.intp_mode = intp_mode; + obj.dac_mode_sel = dac_mode_sel; + obj.Ideal2Low = fs_H/(fs_L/2); + obj.Ideal2Target = fs_H/TargetFrequency; + obj.name = [ + "第一组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿",... + "第一组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿",... + "第一组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿",... + "第一组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿",... + "第一组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿",... + "第一组S21参数_acz_持续时间30ns_下降沿",... + "第一组S21参数_acz_持续时间50ns_下降沿"; + "第二组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿",... + "第二组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿",... + "第二组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿",... + "第二组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿",... + "第二组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿",... + "第二组S21参数_acz_持续时间30ns_下降沿",... + "第二组S21参数_acz_持续时间50ns_下降沿"; + "第三组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿",... + "第三组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿",... + "第三组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿",... + "第三组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿",... + "第三组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿",... + "第三组S21参数_acz_持续时间30ns_下降沿",... + "第三组S21参数_acz_持续时间50ns_下降沿"; + "第四组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿",... + "第四组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿",... + "第四组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿",... + "第四组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿",... + "第四组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿",... + "第四组S21参数_acz_持续时间30ns_下降沿",... + "第四组S21参数_acz_持续时间50ns_下降沿"; + "第五组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿",... + "第五组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿",... + "第五组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿",... + "第五组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿",... + "第五组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿",... + "第五组S21参数_acz_持续时间30ns_下降沿",... + "第五组S21参数_acz_持续时间50ns_下降沿"; + "第一组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后",... + "第一组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后",... + "第一组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后",... + "第一组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后",... + "第一组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后",... + "第一组S21参数_acz_持续时间30ns_下降沿后",... + "第一组S21参数_acz_持续时间50ns_下降沿后"; + "第二组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后",... + "第二组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后",... + "第二组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后",... + "第二组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后",... + "第二组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后",... + "第二组S21参数_acz_持续时间30ns_下降沿后",... + "第二组S21参数_acz_持续时间50ns_下降沿后"; + "第三组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后",... + "第三组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后",... + "第三组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后",... + "第三组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后",... + "第三组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后",... + "第三组S21参数_acz_持续时间30ns_下降沿后",... + "第三组S21参数_acz_持续时间50ns_下降沿后"; + "第四组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后",... + "第四组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后",... + "第四组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后",... + "第四组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后",... + "第四组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后",... + "第四组S21参数_acz_持续时间30ns_下降沿后",... + "第四组S21参数_acz_持续时间50ns_下降沿后"; + "第五组S21参数_flattop_上升沿2ns_持续时间30ns_下降沿后",... + "第五组S21参数_flattop_上升沿4ns_持续时间30ns_下降沿后",... + "第五组S21参数_flattop_上升沿4ns_持续时间50ns_下降沿后",... + "第五组S21参数_flattop_上升沿4ns_持续时间1000ns_下降沿后",... + "第五组S21参数_flattop_上升沿100ns_持续时间10000ns_下降沿后",... + "第五组S21参数_acz_持续时间30ns_下降沿后",... + "第五组S21参数_acz_持续时间50ns_下降沿后"; + ]; + obj.pause_time = 0.5; + obj.Amp = 1.5e4; + end + + function env(obj) + + cd("D:\Work\EnvData\acz"); + obj1 = py.importlib.import_module('acz'); + py.importlib.reload(obj1); + + %按点数产生理想方波 + % 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:length(length_flattop) + [edge_H(i), length_H(i)] = deal(edge(i)*obj.fs_H/1e9,length_flattop(i)*obj.fs_H/1e9); + obj.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:length(length_acz) + length_acz_H(i) = int32(length_acz(i)*obj.fs_H/1e9); + obj.wave_pre{i+length(length_flattop)} = real(double(py.acz.aczwave(amplitude, length_acz_H(i), carrierFreq,carrierPhase, dragAlpha,thf, thi, lam2, lam3))); + end + + obj.env_num = length(length_flattop) + length(length_acz); + + for i = 1:obj.env_num + obj.wave_pre{i} = cat(2,repmat(cat(2,obj.wave_pre{i},zeros(1,round(30e-9*obj.fs_H))),1,obj.rpt_num),zeros(1,floor(obj.simulink_time*obj.fs_H))); %校正前的高频信号 + obj.wave_preL{i} = obj.wave_pre{i}(1:obj.Ideal2Low:end); %校正前的低频信号 + end + + assignin("base",'wave_preL',obj.wave_preL); + obj.FallingEdge = [30e-9,30e-9,50e-9,1000e-9,10000e-9,30e-9,50e-9]; + + end + + function route(obj) + + obj.amp_real{1}= [0.025 0.015 0.0002 0.2 0 0]; + obj.amp_imag{1}= [0 0 0 0 0 0]; + obj.time_real{1} = [-1/250, -1/650, -1/1600 -1/20 0 0]; + obj.time_imag{1} = [0 0 0 0 0 0]; + + obj.amp_real{2}= [0.025 0.015 0.0002 0.2 0 0]; + obj.amp_imag{2}= [0 0 0 0 0 0]; + obj.time_real{2} = [-1/250, -1/650, -1/1600 -1/20 0 0]; + obj.time_imag{2} = [0 -1/300 -1/500 0 0 0]; + + obj.amp_real{3}= [0.025 0.009 0.0002 0.2 0 0]; + obj.amp_imag{3}= [0 0.012 0 0 0 0]; + obj.time_real{3} = [-1/250, -1/650, -1/1600 -1/20 0 0]; + obj.time_imag{3} = [0 -1/300 -1/500 0 0 0]; + + obj.amp_real{4}= [0.025 0.015 0.0002 0.2 0 0]; + obj.amp_imag{4}= [0 0 0 0 0 0]; + obj.time_real{4} = [-1/250, -1/2000, -1/1600 -1/20 0 0]; + obj.time_imag{4} = [0 -1/15 -1/50 0 0 0]; + + obj.amp_real{5}= [0.025 0.009 0.0002 0.2 0 0]; + obj.amp_imag{5}= [0 0.012 0 0 0 0]; + obj.time_real{5} = [-1/250, -1/2000, -1/1600 -1/20 0 0]; + obj.time_imag{5} = [0 -1/15 -1/50 0 0 0]; + + [m,n] = size(obj.amp_real); + obj.route_num = n; + end + + function py_cal(obj) + + cd("D:\Work\TailCorr_20241008_NoGit"); + obj2 = py.importlib.import_module('wave_calculation'); + py.importlib.reload(obj2); + cd("D:\Work\TailCorr"); + + convolve_bound = int8(3); + calibration_time = int32(20e3); + cal_method = int8(1); + sampling_rateL = int64(obj.fs_L/2); + sampling_rate = int64(obj.fs_H); + + %校正后的高频信号 + for m = 1:obj.route_num + for n = 1:obj.env_num + wave_cal = cell(py.wave_calculation.wave_cal(obj.wave_pre{1,n}, obj.amp_real{1,m}, obj.amp_imag{1,m}, obj.time_real{1,m}, obj.time_imag{1,m}, convolve_bound, calibration_time, cal_method, sampling_rate)); + obj.wave_revised{m,n} = double(wave_cal{1,1}); + wave_calL = cell(py.wave_calculation.wave_cal(obj.wave_preL{1,n}, obj.amp_real{1,m}, obj.amp_imag{1,m}, obj.time_real{1,m}, obj.time_imag{1,m}, convolve_bound, calibration_time, cal_method, sampling_rateL)); + obj.wave_revisedL{m,n} = double(wave_calL{1,1}); + end + alpha{m} = double(wave_calL{1,2}); + beta{m} = double(wave_calL{1,3}); + end + alpha_wideth=32; + beta_width=32; + %定点化系数 + for i = 1:obj.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 + + assignin('base', 'alphaFixRe', alphaFixRe); + assignin('base', 'alphaFixIm', alphaFixIm); + assignin('base', 'betaFixRe' , betaFixRe); + assignin('base', 'betaFixIm' , betaFixIm); + end + + function FIL(obj) + + for m = 1:obj.route_num + assignin('base', 'm', m); + for n = 1:obj.env_num + assignin('base', 'n', n); + optnons=simset('SrcWorkspace','current'); + sim('z_dsp_FIL',[0,obj.simulink_time]); + sim2m = @(x)reshape(logsout.get(x).Values.Data,[],1); + dout0{m,n} = sim2m("dout0"); + dout1{m,n} = sim2m("dout1"); + dout2{m,n} = sim2m("dout2"); + dout3{m,n} = sim2m("dout3"); + + N = length(dout0{m,n}); + cs_wave{m,n} = zeros(4*N,1); + + cs_wave{m,n}(1:4:4*N) = dout0{m,n}; + cs_wave{m,n}(2:4:4*N) = dout1{m,n}; + cs_wave{m,n}(3:4:4*N) = dout2{m,n}; + cs_wave{m,n}(4:4:4*N) = dout3{m,n}; + + HardwareMeanIntpData{m,n} = cs_wave{m,n};%硬件校正后内插 + DownsamplingBy12GData{m,n} = obj.wave_revised{m,n}(1:obj.Ideal2Target:end); + [obj.DownsamplingBy12GDataAlign{m,n},obj.HardwareMeanIntpDataAlign{m,n},obj.Delay(m,n)] = ... + alignsignals(DownsamplingBy12GData{m,n}(1:round(obj.TargetFrequency*20e-6)),HardwareMeanIntpData{m,n}(1:round(obj.TargetFrequency*20e-6)),"Method","xcorr"); + end + end + obj.Delay_mode = mode(obj.Delay,'all'); + fprintf('Delay_mode = %d\n',obj.Delay_mode); + end + + function DataShow(obj,save) + + close all; + + fileID = fopen(obj.filename, 'w'); + if fileID == -1 + disp('文件打开失败'); + else + disp('文件打开成功'); + end + + start_time = abs(obj.Delay_mode)/(obj.TargetFrequency/1e9)*1e-9;%由于相位修正后会有偏移的点数,所以需要考虑上这个偏移的时间,采样率为3GHz,3个点对应1ns + + if(obj.rpt_num == 1) + for m = 1:obj.route_num + for n = 1:obj.env_num + edge_Align(n) = obj.FallingEdge(n) + start_time; + tmp(n) = edge_Align(n) + 10e-9; + a{n} = [start_time-5e-9 tmp(n)];%[1/obj.fs_H 50e-9];[50e-9 1.5e-6],[500e-9+10e-9 tmp-20e-9] + b{n} = [tmp(n) 20e-6]; + + figure('Units','normalized','Position',[0.0004 0.5174 0.4992 0.4229]); + obj.diff_plot_py(obj.TargetFrequency,obj.HardwareMeanIntpDataAlign{m,n}', obj.DownsamplingBy12GDataAlign{m,n}(1:floor(obj.TargetFrequency*20e-6)),obj.name(m,n),'硬件与脚本的差值',a{n},obj.Amp,edge_Align(n),fileID); + if(save == "save") + savefig(obj.name(m,n)); + end + + figure('Units','normalized','Position',[0.0004 0.0340 0.4992 0.4229]); + obj.diff_plot_py(obj.TargetFrequency,obj.HardwareMeanIntpDataAlign{m,n}', obj.DownsamplingBy12GDataAlign{m,n}(1:floor(obj.TargetFrequency*20e-6)),obj.name(m+5,n),'硬件与脚本的差值',b{n},obj.Amp,edge_Align(n),fileID); + if(save == "save") + savefig(obj.name(m+5,n)); + end + end + end + else + for m = 1:obj.route_num + for n = 1:obj.env_num + figure('Units','normalized','Position',[0 0.0333 1.0000 0.9125]); + title(obj.name(m,n),Interpreter="none"); + tiledlayout('vertical','TileSpacing','tight') + obj.diff_plot_py(obj.TargetFrequency,obj.HardwareMeanIntpDataAlign{m,n}', obj.DownsamplingBy12GDataAlign{m,n}(1:floor(obj.TargetFrequency*20e-6)),obj.name(m,n),'硬件与脚本的差值',obj.FallingEdge(n)+obj.itv_time,obj.Amp,start_time,fileID); + if(save == "save") + savefig(obj.name(m,n)); + end + end + end + end + + fclose(fileID); + + end - HardwareMeanIntpData{m,n} = cs_wave{m,n};%硬件校正后内插 - DownsamplingBy12GData{m,n} = wave_revised{m,n}(1:Ideal2Target:end); - [DownsamplingBy12GDataAlign{m,n},HardwareMeanIntpDataAlign{m,n},Delay(m,n)] = ... - alignsignals(DownsamplingBy12GData{m,n}(1:round(TargetFrequency*20e-6)),HardwareMeanIntpData{m,n}(1:round(TargetFrequency*20e-6)),"Method","xcorr"); + function RouteShow(obj,save) + + t = 0:1/(1e2):10000; + for i = 1:5 + amp_routing{i} = obj.amp_real{1,i} + 1j*obj.amp_imag{1,i}; + time_routing{i} = obj.time_real{1,i} + 1j*obj.time_imag{1,i}; + tau{i} = -1./time_routing{i}; + end + + figure() + set(gcf,"Position",[1 49 2560 1314]) + tiledlayout('flow','TileSpacing','tight'); + title_name = ["第一组S_{21}参数","第二组S_{21}参数","第三组S_{21}参数","第四组S_{21}参数","第五组S_{21}参数"]; + for m = 1:obj.route_num + for n = 1:1:length(amp_routing{1,m}) + S21_time{m}(:,n) = amp_routing{1,m}(n)*exp(time_routing{1,m}(n)*t); + end + nexttile + plot(t*1e-9,real(sum(S21_time{m},2))); + grid on + title(title_name(m)); + end + + if(save == "save") + savefig("S21线路参数"); + end + + end + + function FigDisplay(obj) + if(obj.rpt_num == 1) + for m = 1:obj.route_num*obj.env_num + figure(2*m-1) + figure(2*m) + pause(obj.pause_time); + end + + else + for m = 1:obj.route_num*obj.env_num + figure(m) + pause(obj.pause_time); + end + end + end + + function LoadFigAndDisplay(obj) + for n = 1:obj.route_num + for m = 1:obj.env_num + open(strcat(obj.name(n,m),'.fig')); + open(strcat(obj.name(n+5,m),'.fig')); + pause(obj.pause_time); + end + end + end + + function ErrAny(obj,save) + fid = fopen(obj.filename,'r'); + if(obj.rpt_num == 1) + data = textscan(fid,'Falling edge of 20ns~40ns mean :%s std :%s Falling edge of 1us~1.1us mean :%s std :%s The mean and std stably less than 1e-4 is :%s s'); + fclose(fid); + data{1} = cellfun(@str2num,data{1}); + data{2} = cellfun(@str2num,data{2}); + data{3} = cellfun(@str2num,data{3}); + data{4} = cellfun(@str2num,data{4}); + data{5} = cellfun(@str2num,data{5}); + title_name = ["下降沿后20ns~40ns误差的平均值","下降沿后20ns~40ns误差的标准差","下降沿后1us~1.1us误差的平均值","下降沿后1us~1.1us误差的标准差","加窗参数"]; + err_threshold = [1e-3 1e-3 1e-4 3e-4 5e-6]; + else + data = textscan(fid,'每个周期拖尾误差均值的标准差 = %s s'); + fclose(fid); + data{1} = cellfun(@str2num,data{1}); + title_name = ["多周期误差平均值的标准差"]; + err_threshold = [0.5e-3]; + end + [h,v] = size(data); + figure() + tiledlayout('flow','TileSpacing','tight') + colors = lines(obj.route_num); + set(gcf,'Position', [1 49 2560 1314]); + for m = 1:v + nexttile + hold on + for i = 1:(obj.route_num) + idx = (i-1)*(length(data{m})/obj.route_num) + 1 : i*(length(data{m})/obj.route_num); + plot(idx,abs(data{m}(idx)),'-o','Color', colors(i, :)); + end + yline(err_threshold(m),'--r'); + title(title_name(m)); + set(gca,'YScale','log'); + legend("第一组线路","第二组线路","第三组线路","第四组线路","第五组线路",'Location','northwest'); + end + if(obj.rpt_num == 1) + if(save == "save") + savefig("单周期误差分析") + end + else + if(save == "save") + savefig("多周期误差分析") + end + end + + end + + %compare FIL with python script + function diff_plot_py(obj,fs,iir_out, Script_out,title1,title2,a,amp,edge,fileID) + + %输入数据长度不等时取其公共部分 + N = min(length(iir_out),length(Script_out)); + iir_out = iir_out(1:N); + Script_out = Script_out(1:N); + + diff = (iir_out - Script_out)/amp;%求差,并归一化 + + n = (0:1:N-1)/fs; + %找出关心的数据点 + if(obj.rpt_num == 1) + n_edge = find(n>=edge-1e-12);%edge代表下降沿 + n50 = find(n>=edge+20e-9-1e-12);%下降沿后20ns + n20_40 = find((n>=edge+20e-9-1e-12) & (n<=edge+40e-9+1e-12));%下降沿后20ns到40ns + n1000 = find(n>=edge+1000e-9-1e-12);%下降沿后1us + n1000_1100 = find((n>=edge+1000e-9-1e-12) & (n<=edge+1100e-9+1e-12));%下降沿后1us到1.1us + + ne = find((abs(diff)>=1e-4) & (abs(diff)<1));%误差小于万分之一的点 + ne(1) = 1; + + window_length = 100e-9*fs; + diff_mean_window = movmean(diff,window_length); + diff_std_window = movstd(diff,window_length); + n_mean_window = find((abs(diff_mean_window)>=1e-4) );%100ns窗,误差均值小于万分之一点 + n_std_window = find((abs(diff_std_window)>=1e-4) ); %100ns窗,误差方差小于万分之一点 + n_common = max(n_mean_window(end),n_std_window(end)); + %原始数据作图 + tiledlayout(2,1) + ax1 = nexttile; + plot(n,iir_out,n,Script_out) + legend('硬件','软件'); + xlabel('t/s') + xlim(a); + title(title1,Interpreter="none"); + grid on + hold on + + %差值做图 + ax2 = nexttile; + plot(n,diff) + xlabel('t/s') + title('diff') + grid on + hold on + xlim(a) + title('硬件与脚本的差值',Interpreter="none"); + linkaxes([ax1,ax2],'x'); + + plot_p = @(x)[ + plot(n(x),diff(x),'r*'); + text(n(x), diff(x)+diff(x)*0.1, ['(',num2str(n(x)),',',num2str(diff(x)),')'],'color','k'); + ]; + + ne(1) = 1; + + % [diff_max,R_mpos] = max(abs(diff));%误差最大值 + % plot_p(R_mpos); + + if a(2) <= 5e-6 + plot_p(n_edge(1));%下降沿 + % plot_p(R_mpos); + elseif a(2) == 20e-6 + plot_p(n50(1)); %下降沿20ns + plot_p(n1000(1)); %下降沿1us + plot_p(ne(end)); %误差小于万分之一 + fprintf(fileID,"Falling edge of 20ns~40ns mean :%.4e\t std :%.4e\t",mean(diff(n20_40)),std(diff(n20_40))); + fprintf(fileID,"Falling edge of 1us~1.1us mean :%.4e\t std :%.4e\t",mean(diff(n1000_1100)),std(diff(n1000_1100))); + % fprintf("The error after falling edge of 1us is:%.4e\t",diff(n1000(1))); + % fprintf("The time of erroe less than 1e-4 is :%.4e us\n",(n(ne(end))-n(n_edge(1)))); + fprintf(fileID,"The mean and std stably less than 1e-4 is :%.4e s\n",(n(n_common)-n(n_edge(1)))); + end + else + n_start = find(n>=edge-1e-12);%edge代表下降沿 + + % 确定周期长度对应的采样点数量 + T = a; %在这种情况下,a这个参数用不到了,使用其传递周期,也就是说a这个参数有两种不同的涵义 + samples_per_period = round(T * fs); % 每个周期采样点数 + num_periods = obj.rpt_num; % 总周期数 + period_means = zeros(1, num_periods); % 存储每周期均值 + + for i = 1:num_periods + % 提取当前周期的起止索引 + start_idx(i) = n_start(1) + (i - 1) * samples_per_period; + end_idx(i) = n_start(1) + i * samples_per_period; + + % 提取当前周期的数据 + period_data = diff(start_idx(i):end_idx(i)); + + % 计算当前周期的均值 + period_means(i) = mean(period_data); + end + fprintf(fileID,"每个周期拖尾误差均值的标准差 = %.4e s\n",std(period_means)); + ax1 = nexttile; + plot(n,iir_out,n,Script_out); + hold on + plot(n(start_idx), Script_out(start_idx), 'r*'); % 标记每个周期的起始点 + plot(n(end_idx), Script_out(end_idx), 'g*'); % 标记每个周期的起始点 + legend('硬件','软件'); + xlabel('t/s'); + title(title1,Interpreter="none"); + ax2 = nexttile; + hold on + plot(n, diff); hold on; % 原始信号 + plot(n(end_idx), diff(end_idx), 'g*'); % 标记每个周期的起始点 + xlabel('t/s'); + ylabel('归一化误差'); + linkaxes([ax1,ax2],'x'); + xlim([0,n(end_idx(end)) + 5e-7]); + title(title2,Interpreter="none"); + + end + end + + + end -end -% signalAnalyzer(wave_revised,'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",... - "第一组S21参数_acz_持续时间50ns_下降沿后10ns"; - "第二组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",... - "第二组S21参数_acz_持续时间50ns_下降沿后10ns"; - "第三组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",... - "第三组S21参数_acz_持续时间50ns_下降沿后10ns"; - "第四组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",... - "第四组S21参数_acz_持续时间50ns_下降沿后10ns"; - "第五组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",... - "第五组S21参数_acz_持续时间50ns_下降沿后10ns"; - "第一组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",... - "第一组S21参数_acz_持续时间50ns_下降沿后1us"; - "第二组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",... - "第二组S21参数_acz_持续时间50ns_下降沿后1us"; - "第三组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",... - "第三组S21参数_acz_持续时间50ns_下降沿后1us"; - "第四组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",... - "第四组S21参数_acz_持续时间50ns_下降沿后1us"; - "第五组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",... - "第五组S21参数_acz_持续时间50ns_下降沿后1us"; -]; - -Delay_mode = mode(Delay,'all'); -fileID = fopen('20241226_output.txt', 'w'); -if fileID == -1 - disp('文件打开失败'); -else end -for m = 1:route_num - for n = 1:env_num - start_time(n) = abs(Delay_mode)/(TargetFrequency/1e9)*1e-9;%由于相位修正后会有偏移的点数,所以需要考虑上这个偏移的时间,采样率为3GHz,3个点对应1ns - edge_Align(n) = FallingEdge(n) + start_time(n); - tmp(n) = edge_Align(n) + 10e-9; - a{n} = [start_time(n)-5e-9 tmp(n)];%[1/fs_H 50e-9];[50e-9 1.5e-6],[500e-9+10e-9 tmp-20e-9] - b{n} = [tmp(n) 20e-6]; - fig1 = figure('Units','normalized','Position',[0.000390625,0.517361111111111,0.49921875,0.422916666666667]); - diff_plot_py(TargetFrequency,HardwareMeanIntpDataAlign{m,n}', DownsamplingBy12GDataAlign{m,n}(1:floor(TargetFrequency*20e-6)),'HardwareRevised','ScriptRevised',a{n},Amp,edge_Align(n),fileID); - title(name(m,n),Interpreter="none"); - savefig(name(m,n)); - fig2 = figure('Units','normalized','Position',[0.000390625,0.034027777777778,0.49921875,0.422916666666667]); - diff_plot_py(TargetFrequency,HardwareMeanIntpDataAlign{m,n}', DownsamplingBy12GDataAlign{m,n}(1:floor(TargetFrequency*20e-6)),'HardwareRevised','ScriptRevised',b{n},Amp,edge_Align(n),fileID); - title(name(m,n),Interpreter="none"); - savefig(name(m+5,n)); - end -end -fclose(fileID); -%% 可视化S21参数 -t = 0:1/(1e2):10000; -for m = 1:route_num - for n = 1:1:length(amp_routing{1,m}) - S21_time{m}(:,n) = amp_routing{1,m}(n)*exp(time_routing{1,m}(n)*t); - end - figure - plot(t*1e-9,real(sum(S21_time{m},2))); - grid on - title("s(t)"); -end - -% 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')); -%% 查看图像 -for m = 1:35 - figure(2*m-1) - figure(2*m) - pause(0.2); -end -%% 读图像并查看 -% cd("D:\Work\TailCorr\仿真结果\20241101_125M八倍内插至1G_第1组S21参数"); -close all -for n = 1:route_num - for m = 1:env_num - open(strcat(name(n,m),'.fig')); - open(strcat(name(n+5,m),'.fig')); - pause(); - end -end -%% -close all -fid = fopen('20241226_output.txt','r'); -data = textscan(fid,'Falling edge of 20ns~40ns mean :%s std :%s Falling edge of 1us~1.1us mean :%s std :%s The mean and std stably less than 1e-4 is :%s s'); -fclose(fid); -data{1} = cellfun(@str2num,data{1}); -data{2} = cellfun(@str2num,data{2}); -data{3} = cellfun(@str2num,data{3}); -data{4} = cellfun(@str2num,data{4}); -data{5} = cellfun(@str2num,data{5}); -title_name = ["下降沿后20ns~40ns误差的平均值","下降沿后20ns~40ns误差的标准差","下降沿后1us~1.1us误差的平均值","下降沿后1us~1.1us误差的标准差","加窗参数"]; -err_threshold = [1e-3 1e-3 1e-4 3e-4 5e-5]; -figure() -tiledlayout('flow','TileSpacing','tight') -colors = lines(route_num); - -for m = 1:5 - nexttile - hold on - for i = 1:(route_num) - idx = (i-1)*(length(falling20_mean)/route_num) + 1 : i*(length(falling20_mean)/route_num); - plot(idx,abs(data{m}(idx)),'-o','Color', colors(i, :)); - end - yline(err_threshold(m),'--r'); - title(title_name(m)); - set(gca,'YScale','log'); -end - -%% -figure() -semilogy(abs(falling20_mean),'-o'); diff --git a/script_m/z_dsp_top.m b/script_m/z_dsp_top.m new file mode 100644 index 0000000..c718f02 --- /dev/null +++ b/script_m/z_dsp_top.m @@ -0,0 +1,66 @@ +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; +simulink_time = 20e-6; %1.5*16e-6;1.5e-3 +intp_mode = 3; %0不内插,1内插2倍,2内插4倍,3内插8倍 +route_num = 1; %线路个数 +env_num = 1; %包络个数 +alpha_wideth=32; %滤波器系数定点化 +beta_width=32; +G = 1; +dac_mode_sel = 0; %选择DAC模式,0出八路,1邻近插值,2邻近插值 + +z_dsp1 = z_dsp(fs_L,fs_H,TargetFrequency,G,simulink_time,intp_mode,dac_mode_sel); +z_dsp1.filename = 'output.txt'; +z_dsp1.rpt_num = 1; +if(z_dsp1.rpt_num > 1) + z_dsp1.name = [ + "第一组S21参数_flattop_上升沿2ns_持续时间30ns_重复100次",... + "第一组S21参数_flattop_上升沿4ns_持续时间30ns_重复100次",... + "第一组S21参数_flattop_上升沿4ns_持续时间50ns_重复100次",... + "第一组S21参数_acz_持续时间30ns_重复100次",... + "第一组S21参数_acz_持续时间50ns_重复100次"; + "第二组S21参数_flattop_上升沿2ns_持续时间30ns_重复100次",... + "第二组S21参数_flattop_上升沿4ns_持续时间30ns_重复100次",... + "第二组S21参数_flattop_上升沿4ns_持续时间50ns_重复100次",... + "第二组S21参数_acz_持续时间30ns_重复100次",... + "第二组S21参数_acz_持续时间50ns_重复100次"; + "第三组S21参数_flattop_上升沿2ns_持续时间30ns_重复100次",... + "第三组S21参数_flattop_上升沿4ns_持续时间30ns_重复100次",... + "第三组S21参数_flattop_上升沿4ns_持续时间50ns_重复100次",... + "第三组S21参数_acz_持续时间30ns_重复100次",... + "第三组S21参数_acz_持续时间50ns_重复100次"; + "第四组S21参数_flattop_上升沿2ns_持续时间30ns_重复100次",... + "第四组S21参数_flattop_上升沿4ns_持续时间30ns_重复100次",... + "第四组S21参数_flattop_上升沿4ns_持续时间50ns_重复100次",... + "第四组S21参数_acz_持续时间30ns_重复100次",... + "第四组S21参数_acz_持续时间50ns_重复100次"; + "第五组S21参数_flattop_上升沿2ns_持续时间30ns_重复100次",... + "第五组S21参数_flattop_上升沿4ns_持续时间30ns_重复100次",... + "第五组S21参数_flattop_上升沿4ns_持续时间50ns_重复100次",... + "第五组S21参数_acz_持续时间30ns_重复100次",... + "第五组S21参数_acz_持续时间50ns_重复100次"; + ]; + z_dsp1.FallingEdge = [30e-9 30e-9 50e-9 30e-9 50e-9]; + z_dsp1.itv_time = 30e-9; +end +z_dsp1.env(); %产生理想z信号 +z_dsp1.route(); %配置线路参数 +% z_dsp1.route_num = 1; +% z_dsp1.env_num = 1; +z_dsp1.py_cal(); %12G采样率,基于python脚本计算校正后的波形 +z_dsp1.FIL(); %调用FIL模块计算校正后的波形 +z_dsp1.DataShow("save"); %计算结束后展示波形,有save时保存图片 +%% +z_dsp1.FigDisplay(); %图片播放 +%% +z_dsp1.RouteShow("save"); %可视化线路参数 +%% +z_dsp1.ErrAny("save") %对关心的指标进行可视化处理 +%% +close all +z_dsp1.pause_time = 0.3; +z_dsp1.LoadFigAndDisplay()