FSO:
- try to analyze spectrum of FSO and use the coeffs in the ML analysis. simple channel coeff + awgn example
This commit is contained in:
@@ -83,8 +83,8 @@ Scope_sig = Electricalsignal(traceData.YData,"fs",fs);
|
||||
% 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.!!
|
||||
% -> output 2 sps to omit timing recovery!?
|
||||
apply_matched_filter = 0;
|
||||
k = 4;
|
||||
apply_matched_filter = 1;
|
||||
k = 1;
|
||||
if apply_matched_filter
|
||||
|
||||
Pform = Pulseformer("fsym",fsym,"fdac",k*fsym,"pulse","rrc","pulselength",16,"alpha",rolloff,"matched",1);
|
||||
@@ -96,6 +96,18 @@ else
|
||||
end
|
||||
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
|
||||
apply_timing_rec = 1;
|
||||
if apply_timing_rec
|
||||
|
||||
@@ -5,9 +5,9 @@ M = 4;
|
||||
randkey = 1;
|
||||
|
||||
% --- Parameter sweep
|
||||
order_range = 2:3:11; % FFE order
|
||||
delta_range = 0:2:4; % delta
|
||||
SNR_dB = 20;
|
||||
order_range = 5:5:50; % FFE order
|
||||
delta_range = 0:5:20; % delta
|
||||
SNR_dB = 30;
|
||||
|
||||
% --- Prepare bit sequence
|
||||
order_bits = 19;
|
||||
@@ -21,10 +21,14 @@ Symbols = PAMmapper(M,0).map(Bits);
|
||||
Symbols.fs = 200e9;
|
||||
|
||||
% --- Channel (minimal ISI + AWGN)
|
||||
h = [0.3 0.9 0.3]; h = h/norm(h);
|
||||
symbols_filt = Symbols.filter(h,1);
|
||||
h = abs([0.3 0.9 0.3]); h = h/norm(h);
|
||||
|
||||
% 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.signal = awgn(symbols_filt.signal,SNR_dB,'measured');
|
||||
symbols_noi.spectrum;
|
||||
|
||||
% --- Generate all parameter pairs
|
||||
[O,D] = ndgrid(order_range, delta_range);
|
||||
@@ -51,7 +55,7 @@ parfor k = 1:size(pairs,1)
|
||||
try
|
||||
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, ...
|
||||
"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);
|
||||
ref_bits = PAMmapper(M,0).demap(y_ref);
|
||||
@@ -89,7 +93,7 @@ end
|
||||
beautifyBERplot
|
||||
ylabel('BER'); xlabel('Filter Order [N]');
|
||||
title('BER vs. Filter order');
|
||||
ylim([1e-4, 0.1]);
|
||||
% ylim([1e-4, 0.1]);
|
||||
yline(3.8e-3,'HandleVisibility','off');
|
||||
yline(2.2e-4,'HandleVisibility','off');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user