- try to analyze spectrum of FSO and use the coeffs in the ML analysis. simple channel coeff + awgn example
This commit is contained in:
Silas Oettinghaus
2026-01-20 13:48:15 +01:00
parent 719e5508e7
commit 1bf17ec6be
2 changed files with 25 additions and 9 deletions

View File

@@ -83,8 +83,8 @@ Scope_sig = Electricalsignal(traceData.YData,"fs",fs);
% pulse is symmetric, hence we can use pulsef directly as matched filter. % pulse is symmetric, hence we can use pulsef directly as matched filter.
% It feels off (bit I think correct) that the fsym is now the output freq.!! % It feels off (bit I think correct) that the fsym is now the output freq.!!
% -> output 2 sps to omit timing recovery!? % -> output 2 sps to omit timing recovery!?
apply_matched_filter = 0; apply_matched_filter = 1;
k = 4; k = 1;
if apply_matched_filter if apply_matched_filter
Pform = Pulseformer("fsym",fsym,"fdac",k*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1); Pform = Pulseformer("fsym",fsym,"fdac",k*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);
@@ -96,6 +96,18 @@ else
end end
Rx_matched.spectrum(); Rx_matched.spectrum();
%%
coefficients = arburg(Rx_matched.signal,25);
figure()
[h,w] = freqz(1,coefficients,Rx_matched.length,"whole",Rx_matched.fs);
h = h/max(abs(h));
hold on
w_ = (w - Rx_matched.fs/2);
plot(w_.*1e-9,20*log10(fftshift(abs(h))),'DisplayName',['Burg Coeffs: ', num2str(round(coefficients,2)), ' '],'LineWidth',2);
%% Timing Rec %% Timing Rec
apply_timing_rec = 1; apply_timing_rec = 1;
if apply_timing_rec if apply_timing_rec

View File

@@ -5,9 +5,9 @@ M = 4;
randkey = 1; randkey = 1;
% --- Parameter sweep % --- Parameter sweep
order_range = 2:3:11; % FFE order order_range = 5:5:50; % FFE order
delta_range = 0:2:4; % delta delta_range = 0:5:20; % delta
SNR_dB = 20; SNR_dB = 30;
% --- Prepare bit sequence % --- Prepare bit sequence
order_bits = 19; order_bits = 19;
@@ -21,10 +21,14 @@ Symbols = PAMmapper(M,0).map(Bits);
Symbols.fs = 200e9; Symbols.fs = 200e9;
% --- Channel (minimal ISI + AWGN) % --- Channel (minimal ISI + AWGN)
h = [0.3 0.9 0.3]; h = h/norm(h); h = abs([0.3 0.9 0.3]); h = h/norm(h);
symbols_filt = Symbols.filter(h,1);
% h = [1 -1.67085330039878 1.17918163282514 -0.805210559745616 0.571564213123367 -0.296337147529674 0.00649773445209780 0.0854177610195952 -0.0576009020965258 0.0520994427061551 -0.0624586034913656 0.0553280962699552 -0.00705582559925755 -0.0336399056707792 0.0706903719452810 -0.0334124287931977 0.0131699455037966 0.0587431373842994 -0.0515902976066452 0.00647904355473619 0.0137506750904990 -0.0547974515885928 0.00994735499340592 -0.0135513582534086 -0.00463322575007739 0.0277311946101940];
% h = h/norm(h);
symbols_filt = Symbols.filter(1,h);
symbols_noi = symbols_filt; symbols_noi = symbols_filt;
symbols_noi.signal = awgn(symbols_filt.signal,SNR_dB,'measured'); symbols_noi.signal = awgn(symbols_filt.signal,SNR_dB,'measured');
symbols_noi.spectrum;
% --- Generate all parameter pairs % --- Generate all parameter pairs
[O,D] = ndgrid(order_range, delta_range); [O,D] = ndgrid(order_range, delta_range);
@@ -51,7 +55,7 @@ parfor k = 1:size(pairs,1)
try try
ml = ML_MLSE("epochs_tr",training_len,"epochs_dd",1,"len_tr",2^15, ... ml = ML_MLSE("epochs_tr",training_len,"epochs_dd",1,"len_tr",2^15, ...
"mu_dd",0.1,"mu_tr",0.1,"order",order_k,"sps",1, ... "mu_dd",0.1,"mu_tr",0.1,"order",order_k,"sps",1, ...
"traceback_depth",128,"L",3,"delta",delta_k,"adaptive_mu",0); "traceback_depth",128,"L",2,"delta",delta_k,"adaptive_mu",0);
[y_ml,y_ref] = ml.process(symbols_noi,Symbols); [y_ml,y_ref] = ml.process(symbols_noi,Symbols);
ref_bits = PAMmapper(M,0).demap(y_ref); ref_bits = PAMmapper(M,0).demap(y_ref);
@@ -89,7 +93,7 @@ end
beautifyBERplot beautifyBERplot
ylabel('BER'); xlabel('Filter Order [N]'); ylabel('BER'); xlabel('Filter Order [N]');
title('BER vs. Filter order'); title('BER vs. Filter order');
ylim([1e-4, 0.1]); % ylim([1e-4, 0.1]);
yline(3.8e-3,'HandleVisibility','off'); yline(3.8e-3,'HandleVisibility','off');
yline(2.2e-4,'HandleVisibility','off'); yline(2.2e-4,'HandleVisibility','off');