function cfg = adaptive_pid_config() %ADAPTIVE_PID_CONFIG Parameters for the adaptive PID margin study. % Change target_margin here when a different NCF margin floor is desired. cfg = struct(); cfg.target_margin = 0.50; cfg.event_time_s = 10; cfg.duration_s = 30; cfg.dt = 1/2048; cfg.fs = round(1/cfg.dt); cfg.command_scale = 1.0; cfg.disturbance_scale = 1.0; cfg.measurement_noise_fraction = 0.005; cfg.margin_band_hz = [1.5 120]; cfg.margin_grid_count = 5000; cfg.penalty_below = 120; cfg.penalty_peak_shortfall = 40; cfg.penalty_authority_motion = 3; cfg.c4_pid = struct('P', 0.15, 'I', 200, 'D', 0.0015, ... 'derivative_filter_N', 512); cfg.m91_override = struct( ... 'threshold', cfg.target_margin, ... 'band_hz', [2 100], ... 'df_hz', 1, ... 'window_s', 5, ... 'update_interval_s', 0.05, ... 'segment_s', 512/2048, ... 'segment_hop_s', 256/2048, ... 'input_power_range_db', 30, ... 'gamma_min', 0.47, ... 'min_bins', 3, ... 'warm_windows', 5, ... 'margin_filter_n', 3, ... 'detect_consecutive', 1, ... 'calibration_s', 7.5, ... 'cap', 0.70, ... 'residual_floor', 0.03, ... 'residual_prctile', 99, ... 'residual_early_all_bins', true, ... 'residual_early_match_hz', 4, ... 'residual_early_st_floor_frac', 0.80, ... 'residual_early_st_gate_frac', 0.80, ... 'st_prctile', 100, ... 'st_power', 1.15, ... 'freq_medfilt_n', 3, ... 'line_reject_hz', [58 62]); cfg.settled_eval_delay_s = cfg.m91_override.window_s + 3; cfg.authority_gain = struct('a_min', 0.08, 'a_max', 1.0, ... 'down_deadband', 0.005, ... 'down_rate', 0.15, ... 'down_immediate_margin', 0.38, ... 'down_confirm_n', 2, ... 'up_deadband', 0.035, ... 'power', 1.25, ... 'smooth_down', 0.85, ... 'up_rate', 0.0015, ... 'up_hold_s', 1.0, ... 'margin_guard_up_rate', 0.025, ... 'margin_guard_down_rate', 0.025, ... 'margin_filter_alpha', 0.08); end