MPI Simulations and stuff

This commit is contained in:
Silas Oettinghaus
2024-08-14 09:36:51 +02:00
parent 1eeb970d8f
commit 34f9149346
61 changed files with 4295 additions and 429 deletions

View File

@@ -46,7 +46,7 @@ classdef AWG < handle
options.lpf_type = 0;
options.f_cutoff = 32e9;
options.H_lpf Filter
end
fn = fieldnames(options);
@@ -60,26 +60,33 @@ classdef AWG < handle
function signalclass_out = process(obj,signalclass_in)
% 0) START AWG SIMULATION
len_in = length(signalclass_in.signal);
% disp(['Power Raw Input: ', num2str(mean(abs(real(signalclass_in.signal).^2)))]);
% 1) RESAMPLE IF NESSECARY
if signalclass_in.fs ~= obj.fdac
k = obj.kover*obj.fdac / signalclass_in.fs;
signalclass_in = signalclass_in.resample("fs_in",signalclass_in.fs,"fs_out",obj.fdac);
% min_ = min(signalclass_in.signal);
% max_ = max(signalclass_in.signal);
signalclass_in = signalclass_in.resample("fs_in",signalclass_in.fs,"fs_out",obj.fdac,"n",10,"beta",5);
% signalclass_in.signal = clip(signalclass_in.signal,-1.3414,1.3414);
% signalclass_in.signal = softclip(signalclass_in.signal,7,1.3414);
% signalclass_in.plot("displayname",'resampled and clipped','fignum',1);
end
% 1-3. actual processing of the signal (normalize->quantize->sample hold)
% disp(['Power after resamp: ', num2str(mean(abs(real(signalclass_in.signal).^2)))]);
% 4) PROCESSING of the signal (normalize->quantize->sample hold)
signalclass_in.signal = obj.process_(signalclass_in.signal);
% cast the inform. signal to electrical signal
if ~isa(signalclass_in,'Electricalsignal')
signalclass_in = Electricalsignal(signalclass_in,"fs",obj.fdac*obj.kover,"logbook",signalclass_in.logbook);
end
% normalize to 0dBm before applying the lowpass
%signalclass_in = signalclass_in.normalize("mode","milliwatt");
signalclass_in = signalclass_in.setPower(13,"dBm");
% 4. Apply LPF on the signal
if obj.lpf_active
if isa(obj.H_lpf,'Filter')
@@ -92,9 +99,9 @@ classdef AWG < handle
signalclass_in = lpf.process(signalclass_in);
end
end
disp(['AWG output power: ',num2str(signalclass_in.power),' dBm']);
% disp(['AWG output power: ',num2str(signalclass_in.power),' dBm']);
% append to logbook
current_class = class(obj);
lbdesc = ['AWG ', current_class , '// k_over:',num2str(obj.kover),'. f_dac:',num2str(obj.fdac*1e-9),'GHz. Resolution:',num2str(obj.bit_resolution),' bits.'];
@@ -125,9 +132,57 @@ classdef AWG < handle
obj.signal_length = length(data_in);
%%%%%%%%% PRECOMP SINC ROLLOFF %%%%%%%%%
if 1
% X: design FIR filter for sinc precomp
ntaps = 13;
npts = 32;
% least-squares FIR design
fmax = obj.fdac*0.5;
ff = linspace(0,fmax,npts);
hsinc = sin(pi*ff/obj.fdac)./(pi*ff/obj.fdac + eps); % transfer function of sample and hold DAC
hsinc(1) = 1;
h_goal= 1./hsinc; % goal function
f = 2.*ff./obj.fdac; %vector between 0 and 1, where 1 is nyquist is fsamp/2
b = firls(ntaps-1,f,h_goal);
data_in = conv(data_in,b,"same");
end
if 0
%compare different fir construction methods in matlab
b_fir = fir2(ntaps-1,f,h_goal);
b_pm = firpm(ntaps-1,f,h_goal);
b = firls(ntaps-1,f,h_goal);
figure(111)
freqz(b,1,[],obj.fdac);
hold on
freqz(b_fir,1,[],obj.fdac);
hold on
freqz(b_pm,1,[],obj.fdac);
plot(f.*obj.fdac./2.*1e-9,20*log10(h_goal),'Marker','o');
legend('firls','fir2','firpm','target')
end
if 0
% design filter as inverse of the goal transfer function
freq_vec = linspace(-obj.fdac/2,obj.fdac/2,length(data_in));
h = sin(pi*freq_vec/obj.fdac)./(pi*freq_vec/obj.fdac + eps);
max_amp_db = 45;
max_amp_lin = 10^(-max_amp_db/20);
p = find(h<max_amp_lin);
% h(p)=10^(-max_amp_db/20);
h_sinc = 1./h;
convol = fftshift(h_sinc).'.*fft(data_in);
data_in = ifft(convol);
data_in = real(data_in);
end
%%%%%%%%% Normalize to DAC range %%%%%%%%%
% X:
if obj.normalize2dac
% 0a Normalize the signal to full scale DAC range
data_in = data_in - min(data_in); %set "foot" to zero
data_in = data_in / (max(data_in)-min(data_in)); %scale between 0 and 1
data_in = data_in * (obj.dac_max-obj.dac_min); %scale to desired total range of DAC
@@ -136,7 +191,10 @@ classdef AWG < handle
data_in = data_in - mean(data_in);
% 1. Quantize the signal - Full Scale is between obj.dac_min
% disp(['Power after scaling to DAC: ', num2str(mean(abs(real(data_in).^2)))]);
%%%%%%%%% Quantize %%%%%%%%%
% X. Quantize the signal - Full Scale is between obj.dac_min
% and dac_max. If signal is smaller in between, you won't use
% the full bit-resolution.
if obj.bit_resolution>0
@@ -144,9 +202,9 @@ classdef AWG < handle
else
elec_out = data_in;
end
% 2. Sample and hold + repeat (data_out: 1xsignal length)
%%%%%%%%% Sample and hold %%%%%%%%%
% X. Sample and hold + repeat (data_out: 1xsignal length)
if obj.upsampling_method == 1
% just use matlab function
elec_out = resample(elec_out,obj.kover,1);
@@ -157,8 +215,8 @@ classdef AWG < handle
else
error('chosen upsampling method not implemented?');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 3. Add skew (not implemented so far)
if obj.skew_active
elec_out = obj.skew(elec_out);