function output = mpi_recipe_dev(Scpe_sig_raw, Symbols, Tx_bits, options) %mpi_recipe_dev Minimal example recipe for the DSP job framework. % This recipe intentionally performs only light preprocessing and records % summary values. It demonstrates the recipe interface without running a % full equalizer chain. arguments Scpe_sig_raw Symbols Tx_bits options.fsym options.M options.duob_mode options.dataTable table options.userParameters struct = struct() options.debug_plots (1,1) logical = false end Scpe_sig = preprocessSignal(Scpe_sig_raw, Symbols, options.fsym, ... "mode", "auto", ... "debug_plots", options.debug_plots); output = struct(); %% conventional FFE eq_core_settings = { ... "sps", 2, ... "order", 50, ... "decide", 0, ... "adaption_technique", "nlms"}; eq_training_settings = { ... "len_tr", 4096, ... "epochs_tr", 5, ... "mu_tr", 0.04}; eq_dd_settings = { ... "dd_mode", 1, ... "epochs_dd", 3, ... "mu_dd", 0.012}; eq_a1_settings = { ... "dc_smoothing_a1", 0, ... "dc_avg_bufferlength_a1", 0, ... "dc_avg_update_blocklength_a1", 1}; eq_a2_settings = { ... "dc_smoothing_a2", 0, ... "dc_level_avg_bufferlength_a2", 0, ... "dc_level_update_blocklength_a2", 0, ... "dc_level_weights_a2", [0.6 0.6 0.6 0.6]}; eq_dc_tracking_settings = { ... "dc_tracking_mu", 0, ... "dc_tracking_adaptive_enabled", 0, ... "dc_tracking_persistence_gain", 0, ... "dc_tracking_buffer_len", 1}; eq_ffe_update_settings = { ... "ffe_update_buffer_len", 0}; eq_optimizer_settings = { ... "optmize_mus", 0, ... "plot_mu_optimization", options.debug_plots, ... "optimize_dc_tracking_params", 0, ... "optimize_a2_level_weights", 0, ... "a2_level_weight_optimization_len", 2^15, ... "a2_level_weight_optimization_max_evals", 30, ... "a2_level_weight_max", 1}; eq_debug_settings = { ... "save_debug", false}; eq_settings = [ ... eq_core_settings, ... eq_training_settings, ... eq_dd_settings, ... eq_a1_settings, ... eq_a2_settings, ... eq_dc_tracking_settings, ... eq_ffe_update_settings, ... eq_optimizer_settings, ... eq_debug_settings]; eq_ffe = FFE(eq_settings{:}); % ffe_order_ffe = [50, 0, 0]; % mu_ffe = [0.0001, 0.0008, 0.001]; % mu_dfe = 0.0004; % mu_ffe = [0, 0,0]; % mu_dfe = 0.0004; % mu_dc = 0.005; % eq_ffe = EQ("Ne",ffe_order_ffe,"Nb",[0,0,0],"training_length",4096,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.00,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",0); if 1 [ffe_results,equalized_signal] = ffe(eq_ffe, options.M, Scpe_sig, Symbols, Tx_bits, ... "precode_mode", options.duob_mode, ... 'showAnalysis', options.debug_plots, ... "postFFE", [], ... "eth_style_symbol_mapping", 0); ffe_results.metrics.print("description",sprintf('Immediate A2; SIR %d dB',options.dataTable.sir)); output.conventional_ffe = ffe_results; end if 1 showLevelScatter(Scpe_sig_raw, Symbols, ... "fsym", options.fsym, ... "fignum", 400, ... "normalize", true, ... "debug_plots", false, ... "showPlot", true, ... "showStdAnnotations", true, ... "yLimits", [-2.5 2.5], ... "xLimits",[0 2.3],... "scatterAlpha", 0.25, ... "scatterSize", 1, ... "avgLineMaxPoints", 500, ... "avgLineSmoothWindow", 5); exportName = "before_eq"; exportDir = "C:/Users/Silas/Documents/6971e0b65b380ca6d71c837f/04_Experimental_Evaluation/tikz/mpi"; pngFile = fullfile(exportDir, exportName + "_img.png"); % absolute filesystem output tikzFile = fullfile(exportDir, exportName + ".tikz"); % absolute filesystem output pngTikzPath = "04_Experimental_Evaluation/tikz/mpi/" + exportName + "_img.png"; % path written into TikZ figure(400); exportLevelScatterTikz(gca, pngFile, tikzFile, pngTikzPath, ... "resolutionDpi", 150, ... "generatedBy", "mpi_recipe_dev.m"); showLevelScatter(equalized_signal.*-1, Symbols, ... "fsym", options.fsym, ... "fignum", 401, ... "normalize", true, ... "debug_plots", false, ... "showPlot", true, ... "showStdAnnotations", true, ... "yLimits", [-2.5 2.5], ... "xLimits",[0 2.3],... "scatterAlpha", 0.25, ... "scatterSize", 1, ... "avgLineMaxPoints", 500, ... "avgLineSmoothWindow", 5); exportName = "after_ffe_eq"; pngFile = fullfile(exportDir, exportName + "_img.png"); % absolute filesystem output tikzFile = fullfile(exportDir, exportName + ".tikz"); % absolute filesystem output pngTikzPath = "04_Experimental_Evaluation/tikz/mpi/" + exportName + "_img.png"; % path written into TikZ figure(401); exportLevelScatterTikz(gca, pngFile, tikzFile, pngTikzPath, ... "resolutionDpi", 150, ... "generatedBy", "mpi_recipe_dev.m"); end %% A2 eq_core_settings = { ... "sps", 2, ... "order", 50, ... "decide", 0, ... "adaption_technique", "nlms"}; eq_training_settings = { ... "len_tr", 4096, ... "epochs_tr", 5, ... "mu_tr", 0.04}; eq_dd_settings = { ... "dd_mode", 1, ... "epochs_dd", 3, ... "mu_dd", 0.012}; eq_a1_settings = { ... "dc_smoothing_a1", 0, ... "dc_avg_bufferlength_a1", 0, ... "dc_avg_update_blocklength_a1", 1}; eq_a2_settings = { ... "dc_smoothing_a2", 1, ... "dc_level_avg_bufferlength_a2", 256, ... "dc_level_update_blocklength_a2", options.userParameters.block_update, ... "dc_level_weights_a2", [0.6]}; eq_dc_tracking_settings = { ... "dc_tracking_mu", 0, ... "dc_tracking_adaptive_enabled", 0, ... "dc_tracking_persistence_gain", 0, ... "dc_tracking_buffer_len", 0}; eq_ffe_update_settings = { ... "ffe_update_buffer_len", 1}; eq_optimizer_settings = { ... "optmize_mus", 0, ... "plot_mu_optimization", options.debug_plots, ... "optimize_dc_tracking_params", 0, ... "optimize_a2_level_weights", 1, ... "a2_level_weight_optimization_len", 2^15, ... "a2_level_weight_optimization_max_evals", 30, ... "a2_level_weight_max", 1}; eq_debug_settings = { ... "save_debug", false}; eq_settings = [ ... eq_core_settings, ... eq_training_settings, ... eq_dd_settings, ... eq_a1_settings, ... eq_a2_settings, ... eq_dc_tracking_settings, ... eq_ffe_update_settings, ... eq_optimizer_settings, ... eq_debug_settings]; eq_ffe = FFE(eq_settings{:}); if 0 [ffe_results,equalized_signal] = ffe(eq_ffe, options.M, Scpe_sig, Symbols, Tx_bits, ... "precode_mode", options.duob_mode, ... 'showAnalysis', options.debug_plots, ... "postFFE", [], ... "eth_style_symbol_mapping", 0); ffe_results.metrics.print("description",sprintf('Immediate A2; SIR %d dB',options.dataTable.sir)); output.a2_immediate_updates = ffe_results; end if options.debug_plots showLevelScatter(Scpe_sig_raw, Symbols, ... "fsym", options.fsym, ... "fignum", 400, ... "normalize", true); [~, avg_for_lvl] = showLevelScatter(equalized_signal, Symbols, ... "fsym", options.fsym, ... "fignum", 401, ... "normalize", true); end %% A1 eq_a1_settings = { ... "dc_smoothing_a1", 1 ... "dc_avg_bufferlength_a1", 2048, ... "dc_avg_update_blocklength_a1", options.userParameters.block_update}; eq_a2_settings = { ... "dc_smoothing_a2", 0, ... "dc_level_avg_bufferlength_a2", 0, ... "dc_level_update_blocklength_a2", 0, ... "dc_level_weights_a2", [0.6 0.6 0.6 0.6]}; eq_optimizer_settings = { ... "optmize_mus", 0, ... "plot_mu_optimization", options.debug_plots, ... "optimize_dc_tracking_params", 0, ... "optimize_a2_level_weights", 0, ... "a2_level_weight_optimization_len", 2^15, ... "a2_level_weight_optimization_max_evals", 30, ... "a2_level_weight_max", 1}; eq_debug_settings = { ... "save_debug", false}; eq_settings = [ ... eq_core_settings, ... eq_training_settings, ... eq_dd_settings, ... eq_a1_settings, ... eq_a2_settings, ... eq_dc_tracking_settings, ... eq_ffe_update_settings, ... eq_optimizer_settings, ... eq_debug_settings]; eq_ffe = FFE(eq_settings{:}); if 0 [ffe_results,equalized_signal] = ffe(eq_ffe, options.M, Scpe_sig, Symbols, Tx_bits, ... "precode_mode", options.duob_mode, ... 'showAnalysis', options.debug_plots, ... "postFFE", [], ... "eth_style_symbol_mapping", 0); ffe_results.metrics.print("description",sprintf('Immediate A1; SIR %d dB',options.dataTable.sir)); output.a1_immediate_updates = ffe_results; showLevelScatter(Scpe_sig_raw, Symbols, ... "fsym", options.fsym, ... "fignum", 400, ... "normalize", true); [~, avg_for_lvl] = showLevelScatter(equalized_signal, Symbols, ... "fsym", options.fsym, ... "fignum", 401, ... "normalize", true); end %% Tracking fixed eq_core_settings = { ... "sps", 2, ... "order", 50, ... "decide", 0, ... "adaption_technique", "nlms"}; eq_training_settings = { ... "len_tr", 4096, ... "epochs_tr", 5, ... "mu_tr", 0.04}; eq_dd_settings = { ... "dd_mode", 1, ... "epochs_dd", 3, ... "mu_dd", 0.012}; eq_a1_settings = { ... "dc_smoothing_a1", 0, ... "dc_avg_bufferlength_a1", 0, ... "dc_avg_update_blocklength_a1", 1}; eq_a2_settings = { ... "dc_smoothing_a2", 0, ... "dc_level_avg_bufferlength_a2", 0, ... "dc_level_update_blocklength_a2", 0, ... "dc_level_weights_a2", [0.6 0.6 0.6 0.6]}; eq_dc_tracking_settings = { ... "dc_tracking_mu", 0.002, ... "dc_tracking_adaptive_enabled", 0, ... "dc_tracking_persistence_gain", 0, ... "dc_tracking_buffer_len", options.userParameters.block_update}; eq_ffe_update_settings = { ... "ffe_update_buffer_len", 1}; eq_optimizer_settings = { ... "optmize_mus", 0, ... "plot_mu_optimization", options.debug_plots, ... "optimize_dc_tracking_params", 1, ... "optimize_a2_level_weights", 0, ... "a2_level_weight_optimization_len", 2^15, ... "a2_level_weight_optimization_max_evals", 30, ... "a2_level_weight_max", 1}; eq_debug_settings = { ... "save_debug", false}; eq_settings = [ ... eq_core_settings, ... eq_training_settings, ... eq_dd_settings, ... eq_a1_settings, ... eq_a2_settings, ... eq_dc_tracking_settings, ... eq_ffe_update_settings, ... eq_optimizer_settings, ... eq_debug_settings]; eq_ffe = FFE(eq_settings{:}); if 1 [ffe_results,equalized_signal] = ffe(eq_ffe, options.M, Scpe_sig, Symbols, Tx_bits, ... "precode_mode", options.duob_mode, ... 'showAnalysis', options.debug_plots, ... "postFFE", [], ... "eth_style_symbol_mapping", 0); ffe_results.metrics.print("description",sprintf('Immediate A2; SIR %d dB',options.dataTable.sir)); output.tracking_fixmu_immediate_updates = ffe_results; end %% Tracking Adaptive eq_core_settings = { ... "sps", 2, ... "order", 50, ... "decide", 0, ... "adaption_technique", "nlms"}; eq_training_settings = { ... "len_tr", 4096, ... "epochs_tr", 5, ... "mu_tr", 0.04}; eq_dd_settings = { ... "dd_mode", 1, ... "epochs_dd", 3, ... "mu_dd", 0.012}; eq_a1_settings = { ... "dc_smoothing_a1", 0, ... "dc_avg_bufferlength_a1", 0, ... "dc_avg_update_blocklength_a1", 1}; eq_a2_settings = { ... "dc_smoothing_a2", 0, ... "dc_level_avg_bufferlength_a2", 0, ... "dc_level_update_blocklength_a2", 0, ... "dc_level_weights_a2", [0.6 0.6 0.6 0.6]}; eq_dc_tracking_settings = { ... "dc_tracking_mu", 0.002, ... "dc_tracking_adaptive_enabled", 1, ... "dc_tracking_persistence_gain", 0, ... "dc_tracking_buffer_len", options.userParameters.block_update}; eq_ffe_update_settings = { ... "ffe_update_buffer_len", 1}; eq_optimizer_settings = { ... "optmize_mus", 0, ... "plot_mu_optimization", options.debug_plots, ... "optimize_dc_tracking_params", 1, ... "optimize_a2_level_weights", 0, ... "a2_level_weight_optimization_len", 2^15, ... "a2_level_weight_optimization_max_evals", 30, ... "a2_level_weight_max", 1}; eq_debug_settings = { ... "save_debug", false}; eq_settings = [ ... eq_core_settings, ... eq_training_settings, ... eq_dd_settings, ... eq_a1_settings, ... eq_a2_settings, ... eq_dc_tracking_settings, ... eq_ffe_update_settings, ... eq_optimizer_settings, ... eq_debug_settings]; eq_ffe = FFE(eq_settings{:}); if 1 [ffe_results,equalized_signal] = ffe(eq_ffe, options.M, Scpe_sig, Symbols, Tx_bits, ... "precode_mode", options.duob_mode, ... 'showAnalysis', options.debug_plots, ... "postFFE", [], ... "eth_style_symbol_mapping", 0); ffe_results.metrics.print("description",sprintf('Immediate A2; SIR %d dB',options.dataTable.sir)); output.tracking_adaptive_immediate_updates = ffe_results; showLevelScatter(Scpe_sig_raw, Symbols, ... "fsym", options.fsym, ... "fignum", 400, ... "normalize", true); [~, avg_for_lvl] = showLevelScatter(equalized_signal, Symbols, ... "fsym", options.fsym, ... "fignum", 401, ... "normalize", true); end end