ecoc measurements

This commit is contained in:
Silas Labor Zizou
2025-04-13 16:29:12 +02:00
parent 00f1c557c0
commit 0236103b13
19 changed files with 709 additions and 359 deletions

View File

@@ -38,6 +38,9 @@ classdef ChannelFreqResp < handle
Nfft
df
faxis
fileName
path
end
methods (Access=public)
@@ -194,7 +197,9 @@ classdef ChannelFreqResp < handle
obj.H_apply = H_inv;
Target.signal = real((ifft( ( fft(real( Target.signal' )) .* H_inv ) )));
H_inv = reshape(H_inv,size(Target.signal));
Target.signal = real((ifft( ( fft(real( Target.signal )) .* H_inv ) )));
Target.signal = Target.signal';
end
@@ -250,8 +255,18 @@ classdef ChannelFreqResp < handle
% Havg_smooth = smooth(Havg,10);
symaxis = (obj.faxis-(obj.f_ref/2))/1e9;
Havg = fftshift(Havg);
%Havg = smooth(Havg);
plot(symaxis, 20*log10(abs(Havg)),'LineWidth',0.5);
Havg = smooth(Havg);
Havg = Havg./max(Havg);
if ~isempty(obj.fileName)
dpname = obj.fileName;
else
dpname = 'Measured System response';
end
plot(symaxis, 20*log10(abs(Havg)),'LineWidth',0.5,'DisplayName',dpname);
legend('Interpreter','latex')
grid on;
@@ -368,6 +383,8 @@ classdef ChannelFreqResp < handle
end
fprintf('Frequency response information successfully loaded from %s\n', fullFileName);
obj.fileName = options.fileName;
obj.path = options.loadPath;
end
end

View File

@@ -11,6 +11,7 @@ classdef PAMsource
db_precode
db_encode
duobinary_mode
mrds_code
mrds_blocklength
@@ -38,6 +39,7 @@ classdef PAMsource
options.db_precode = 0;
options.db_encode = 0;
options.duobinary_mode = db_mode.no_db;
options.mrds_code = 0;
options.mrds_blocklength = 512;
@@ -102,8 +104,7 @@ classdef PAMsource
para.reset_prms = 0;
para.method = 1;
data_in = [];
global loop;
loop = 0;
@@ -134,43 +135,52 @@ classdef PAMsource
symbols.fs = obj.fsym;
%%%%%% Duobinary %%%%%%%%%%%
if obj.db_precode
symbols = Duobinary().precode(symbols);
switch obj.duobinary_mode
case db_mode.no_db
case db_mode.db_precoded
symbols = Duobinary().precode(symbols);
case db_mode.db_encoded
symbols = Duobinary().precode(symbols);
symbols = Duobinary().encode(symbols);
end
if obj.db_encode
symbols = Duobinary().encode(symbols);
end
% figure(12);hold on;histogram(symbols.signal,'Normalization','probability');
%%%%%% MRDS %%%%%%%%%%%
if obj.mrds_code
symbols = MRDS_coding("blocklength",obj.mrds_blocklength).encode(symbols);
end
%%%%%% SAVE MIN-MAX FOR CLIP %%%%%%%%%%%
if obj.applyclipping
sym_min = min(symbols.signal);
sym_max = max(symbols.signal);
end
%%%%% Pulse-forming %%%%%%
if obj.applypulseform
%%% MY CODE
digi_sig = obj.pulseformer.process(symbols);
if 0
digi_sig = obj.pulseformer.process(symbols);
%%% MOVEIT WRAPPER BETA
% symbols.spectrum("fignum",111,"displayname","1) RAW SIGNAL");
%
% pulsf = Moveit_wrapper('pulsef');
% pulsf.para.alpharacos = obj.pulseformer.alpha;
% pulsf.para.f_sym = obj.fsym;
% pulsf.para.fs = obj.fsym;
% pulsf.para.pulse = 2;
%
% digi_sig = pulsf.process(symbols);
else
%%% MOVEIT WRAPPER BETA
% symbols.spectrum("fignum",111,"displayname","1) RAW SIGNAL");
pulsf = Moveit_wrapper('pulsef');
pulsf.para.alpharacos = obj.pulseformer.alpha;
pulsf.para.f_sym = obj.pulseformer.fsym;
pulsf.para.fs = obj.pulseformer.fdac;
pulsf.para.pulse = 1;
digi_sig = pulsf.process(symbols);
digi_sig.fs = obj.pulseformer.fdac;
end
% Design raised cosine filter with given order in symbols
% digi_sig = symbols;
% sps = 4;

View File

@@ -6,10 +6,8 @@ classdef Pulseformer
end
properties(Access=public)
fs
fdac
fsym
matched_sps
output_sps
pulse
pulselength
alpha
@@ -22,10 +20,8 @@ classdef Pulseformer
% Detailed explanation goes here
arguments
options.fs double
options.fdac double
options.fsym double
options.matched_sps double
options.output_sps double
options.pulse pulseform = pulseform.rc
options.pulselength double {mustBeInteger} = 32
options.alpha double = 0.05
@@ -54,11 +50,7 @@ classdef Pulseformer
signalclass_in = signalclass_in.logbookentry(lbdesc);
% write fs to signal
if obj.matched
signalclass_in.fs = obj.fsym .* obj.output_sps;%.* (obj.fdac./obj.fsym);
else
signalclass_in.fs = obj.fs;%.* (obj.fdac./obj.fsym);
end
signalclass_in.fs = obj.fdac;%.* (obj.fdac./obj.fsym);
% write to output
signalclass_out = signalclass_in;
@@ -85,19 +77,15 @@ classdef Pulseformer
data_out
end
if ~isempty(obj.output_sps)
obj.fsym = obj.fsym.*obj.output_sps;
end
if ~rem(obj.fs,obj.fsym)
if ~rem(obj.fdac,obj.fsym)
%ist ein Vielfaches
sps = obj.fs / obj.fsym;
sps = obj.fdac / obj.fsym;
p = sps;
q = 1;
else
%ist kein Vielfaches
p = obj.fsym / gcd(obj.fs, obj.fsym); %upsampling p->->->
q = obj.fs/ gcd(obj.fs, obj.fsym); %downsampling <-q
p = obj.fsym / gcd(obj.fdac, obj.fsym); %upsampling p->->->
q = obj.fdac/ gcd(obj.fdac, obj.fsym); %downsampling <-q
sps= q; %sps während dem pulse shaping
end
@@ -117,7 +105,6 @@ classdef Pulseformer
end
manual_cyclic_convolution = 0;
upsample_filter = 0;
upfirdn_convolution = 1;
if manual_cyclic_convolution
@@ -135,28 +122,16 @@ classdef Pulseformer
data_out=ifft( fft(symbolov.') .* repmat( H,size(data_in,1),1 ).' ).';
data_out = circshift(data_out,[0 -(obj.pulselength*sps)]);
if rem(obj.fs,obj.fsym)
if rem(obj.fdac,obj.fsym)
data_out = data_out(1:q:end);
end
end
if upsample_filter
data_out_ = upsample(data_in,p);
mfOutput = filter(h, 1, data_out_); % Matched filter output
figure()
hold on
stem(mfOutput(1:1000),'Marker','o','MarkerSize',1,'LineStyle','-','LineWidth',1);
stem(data_out_(1:1000),'Marker','o','MarkerSize',1,'LineStyle','-','LineWidth',1);
end
if upfirdn_convolution
%Apply Filter using Matlab build in fctn.
data_out_ = upfirdn(data_in,h,p,q);
%cut signal, which is longer due to fir filter
@@ -183,7 +158,7 @@ classdef Pulseformer
% scale = max(max([abs(real(data_out)) abs(imag(data_out))])); %find max value from real and imag part
% data_out = data_out./scale;
data_out = data_out';
% data_out = data_out';
%Check output integrity
if abs(round(p/q * length(data_in)) - length(data_out)) > 4