diff --git a/projects/FSO_transmission/first_analysis.m b/projects/FSO_transmission/first_analysis.m index d8361bc..9a327ab 100644 --- a/projects/FSO_transmission/first_analysis.m +++ b/projects/FSO_transmission/first_analysis.m @@ -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 diff --git a/projects/ML_based_MLSE/analyze_filter_length.m b/projects/ML_based_MLSE/analyze_filter_length.m index 616b715..bcf2a91 100644 --- a/projects/ML_based_MLSE/analyze_filter_length.m +++ b/projects/ML_based_MLSE/analyze_filter_length.m @@ -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');