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;

View File

@@ -249,8 +249,12 @@ classdef Filter < handle
end
function showHere(obj)
obj.signal_length = 512;
[H_,~] = obj.buildFilter();
if isempty(obj.H)
obj.signal_length = 4096;
[H_,~] = obj.buildFilter();
else
H_ = obj.H;
end
fs = obj.fs;
frex = linspace(-fs/2,fs/2,numel(H_)).*1e-9;
@@ -265,6 +269,12 @@ classdef Filter < handle
[~, index] = min(abs(filt - (-3)));
threedB = frex(index);
[~, index] = min(abs(filt - (-6)));
sixdB = frex(index);
[~, index] = min(abs(filt - (-10)));
ninedB = frex(index);
cur_module_name = '';
filter_desc = char([num2str(obj.filtdegree),'th-order ',char(obj.filterType),'; f cut:',num2str(fc.*1e-9),' GHz']);
@@ -273,10 +283,17 @@ classdef Filter < handle
legend Interpreter none
title('Magnitude')
hold on
p = plot(frex,filt,'LineWidth',1,'LineStyle','-','DisplayName',[cur_module_name,': ',filter_desc]);
p = plot(frex,filt,'LineWidth',1,'LineStyle','-','DisplayName',[cur_module_name,': ',filter_desc, '; 3/6/10 dB: ', num2str(threedB),'/ ',num2str(sixdB),'/ ',num2str(ninedB)]);
xline([-threedB,threedB],'LineStyle','-','LineWidth',1,'HandleVisibility','off','Color',p.Color);
xline([-sixdB,sixdB],'LineStyle','-','LineWidth',1,'HandleVisibility','off','Color',p.Color);
xline([-ninedB,ninedB],'LineStyle','-','LineWidth',1,'HandleVisibility','off','Color',p.Color);
xline(fcut_,'LineStyle',':','LineWidth',1,'HandleVisibility','off','Color',p.Color);
yline(-3,'LineStyle',':','LineWidth',1,'HandleVisibility','off');
yline([-3, -6, -9],'LineStyle',':','LineWidth',1,'HandleVisibility','off');
xlim([0 fc.*2].*1e-9);
ylim([ninedB-6, 2]);
legend
end