Mainly AWG updates

This commit is contained in:
Silas Oettinghaus
2024-05-21 08:45:41 +02:00
parent 54b70adda2
commit 1eeb970d8f
9 changed files with 156 additions and 62 deletions

View File

@@ -1,4 +1,4 @@
classdef AWG
classdef AWG < handle
%AWG Summary of this class goes here
% Detailed explanation goes here
@@ -63,18 +63,22 @@ classdef AWG
len_in = length(signalclass_in.signal);
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);
end
% 1-3. actual processing of the signal (normalize->quantize->sample hold)
signalclass_in.signal = obj.process_(signalclass_in.signal);
% cast the inform. signal to electrical signal
signalclass_in = Electricalsignal(signalclass_in,"fs",obj.fdac*obj.kover,"logbook",signalclass_in.logbook);
% 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(6,"dBm");
signalclass_in = signalclass_in.setPower(13,"dBm");
% 4. Apply LPF on the signal
if obj.lpf_active
@@ -89,7 +93,7 @@ classdef AWG
end
end
signalclass_in.power
disp(['AWG output power: ',num2str(signalclass_in.power),' dBm']);
% append to logbook
current_class = class(obj);
@@ -123,12 +127,15 @@ classdef AWG
if obj.normalize2dac
% 0a Normalize the signal to full scale DAC range
data_in = data_in - min(data_in);
data_in = data_in/(max(data_in)-min(data_in));
data_in = data_in * (obj.dac_max-obj.dac_min);
data_in = data_in + obj.dac_min;
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
data_in = data_in + obj.dac_min; %set "foot" to desired value
end
data_in = data_in - mean(data_in);
% 1. 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.
@@ -137,6 +144,7 @@ classdef AWG
else
elec_out = data_in;
end
% 2. Sample and hold + repeat (data_out: 1xsignal length)
if obj.upsampling_method == 1
@@ -149,6 +157,7 @@ classdef AWG
else
error('chosen upsampling method not implemented?');
end
% 3. Add skew (not implemented so far)
if obj.skew_active
@@ -182,7 +191,7 @@ classdef AWG
1i*min(max(imag(x_in)-obj.dac_min,0),obj.dac_max-obj.dac_min);
% quantize signal and shift back signal
x_in = round((steps-1)/(obj.max-obj.dac_min)*x_in);
x_in = round((steps-1)/(obj.dac_max-obj.dac_min)*x_in);
% scale and shift back
quant_out = x_in*(obj.dac_max-obj.dac_min)/(steps-1) +(1+1i)*obj.dac_min;