Jaja. Blitt en del ML optimalisering som ikke har gitt ønsket resultat. Så da er det bare å utvide med bedre verktøy, så hentet inn NumPy og SciPy. Forholdsvis kjedelige ting men egner seg godt når en skal få beregnet ting fort i gpu og ta kontroll over utregninger. Datakraften tåler uansett ufattelig mye mer å gjøre for at man skal kunne se at den jobber i oppgavebehandlerem. Det ville være enklere å tvinge frem en forhåndsdefinert xo og tvinge frem delinger med de ulemper som dette gir men dersom dette var målet måtte jeg også akseptere at det er den raskeste måten å oppnå resultat på men neppe den mest optimale.
Mye tekst, men om noen skulle gidde å lese hvordan beslutninger tas pr nå, selv om jeg vet det helt sikkert kommer revisjoner, så er der bare å lese videre. Anser det som et metodedokument som er tungt og kjedelig lesestoff dog og helt uten bilder eller grafer med fjonge fossefall eller annet som bryter med en eviglang tekst.
En deterministisk ML/DSP-motor for høyttaleroptimalisering basert på råmålinger fra REW og beregninger i NumPy/SciPy. Motoren skal finne og verifisere optimalt delepunkt, XO-slope, delay, gain, polaritet/fase, EQ, venstre/høyre-symmetri, romhåndtering, stereosenter og origojustering. ML kan foreslå søkeområder, vekting og strategier, men alle beslutninger skal verifiseres matematisk fra måledata. Motoren skal ikke være en “smart kurveutjevner”; den skal være en etterprøvbar akustisk beregningsmotor.
Grunnregel: Ingen endring skal godkjennes bare fordi frekvenskurven ser penere ut. En kandidat må forbedre eller bevare kompleks summering, fase, invertert null, group delay, headroom, driverstress, forvrengning, powerrespons, L/R-symmetri, stereosenter og origo-konsistens.
- Obligatorisk målegrunnlag
Start alltid med råmålinger uten EQ, uten delay og uten delefilter dersom mulig. Hver driver må måles separat i REW med samme mikrofonposisjon, samme sample rate, samme timing reference og samme gainstruktur. Rådata skal aldri overskrives.
For hver måling skal følgende metadata lagres:
measurement_id, session_id, timestamp, sample_rate, bit_depth, REW_export_type, mic_id, mic_calibration_file, mic_position_id, mic_x, mic_y, mic_z, speaker_side, driver_id, physical_channel, DSP_channel, amp_channel, polarity_state, gain_state_db, delay_state_ms, filter_state, EQ_state, sweep_level_db, estimated_SPL, timing_reference_type, timing_reference_channel, gate_start_ms, gate_end_ms, window_type, smoothing_state, valid_from_hz, valid_to_hz, noise_floor_db, SNR_by_band, clipping_detected, routing_verified, polarity_verified og confidence_score.
Dersom nødvendig metadata mangler, skal motoren redusere confidence eller stoppe automatisk optimalisering.
- Kompleks respons som kjerneformat
Alle beregninger skal baseres på kompleks frekvensrespons:
magnitude_linear(f) = 10^(magnitude_db(f) / 20)
phase_rad(f) = unwrap(deg2rad(phase_deg(f)))
H(f) = magnitude_linear(f) * exp(j * phase_rad(f))
Dersom impulsrespons brukes:
H(f) = FFT{h(t)}
Alle drivere skal interpoleres til felles frekvensakse. Interpolasjon skal gjøres på kompleks respons eller separat på log-magnitude og unwrapped fase. Wrapped fase skal aldri brukes direkte til delay, group delay eller summering.
- Parametre som alltid skal beregnes
For hver driver, hver side og hver fullrange-sum skal motoren beregne:
magnitude_db(f), unwrapped phase, excess phase hvis mulig, group delay, minimum-phase-estimat, excess group delay, impulse peak time, band-limited arrival time, energy time curve, step response, RMS level by band, peak level by band, crest factor, SNR by band, noise floor by band, valid frequency range, direct sound confidence, room dominance confidence, headroom margin, driver stress index og measurement quality score.
Motoren skal ikke anta at impulspeak alene er korrekt akustisk ankomsttid. For hver driver skal det beregnes band-limited arrival time i driverens faktiske arbeidsområde.
- Målekvalitet og forkastingsregler
Før optimalisering skal motoren kontrollere:
routing, kanal-ID, polaritet, sample rate, timing reference, SNR, clipping, impulsstart, fasekontinuitet, gyldig frekvensområde, støy, målevindu/gating og om målingen dekker nødvendig overlapp.
Målingen skal forkastes eller gis lav confidence dersom:
SNR er for lav i overlappet, fase hopper unaturlig, impulsresponsen er trunkert, routing er ukjent, polaritet er ukjent, REW-export er ufullstendig, målingen har clipping, eller frekvensresponsen har hull som ikke kan forklares akustisk.
- Gyldig overlapp og kandidatfelt
For driverpar A/B skal motoren finne gyldig overlapp basert på:
målt respons, SNR, driverens trygge arbeidsområde, forvrengning, direktivitet, powerrespons, membranoppbrytning, horn/waveguide-loading, termisk/mekanisk margin, romdominans og ønsket systemmål.
Kandidatområdet skal ikke bare være der kurvene krysser hverandre. For hver mulig delefrekvens skal motoren analysere et vindu rundt delefrekvensen, typisk ±0.5 til ±1 oktav.
- XO-kandidater
Motoren skal teste:
delefrekvens, filtertype, slope, delay, gain og polaritet.
Minimum filterkandidater:
LR2, LR4, LR8, Butterworth 2/4/8 og asymmetrisk slope der det er akustisk begrunnet.
LR4 er standard startkandidat, men motoren skal velge ut fra målt akustisk resultat, ikke forhåndsvalg.
Filterrespons beregnes som kompleks respons:
H_driver_filtered(f) = H_driver_measured(f) * H_filter(f)
Normal sum:
H_sum(f) = H_A(f) + H_B(f)
Invertert test:
H_null(f) = H_A(f) - H_B(f)
- Delay-beregning
Delay skal beregnes med flere metoder:
impulsbasert ankomst, bandbegrenset impuls, fasehelling, group delay, cross-correlation og sum-/null-optimalisering.
Delay i frekvensdomenet implementeres som:
H_delayed(f) = H(f) * exp(-j * 2π * f * delay_seconds)
Søket skal først være grovt og deretter fint. Typisk:
sub/mid: bredt søk, for eksempel ±20 ms
mid/horn/diskant: smalere søk, for eksempel ±5 ms
grov oppløsning: 0.05–0.1 ms
fin oppløsning: 0.005–0.02 ms
Ingen enkeltmetode er fasit. Motoren skal beregne delay_confidence fra samsvar mellom impuls, fase, group delay, normal sum og invertert null.
Praktisk DSP-delay kan ikke være negativ. Etter relativ delayoptimalisering skal alle kanaler normaliseres slik at tidligste akustiske kanal får 0 ms praktisk delay, og andre kanaler får positiv delay. Den relative origo-modellen skal likevel beholdes.
- Fasekrav i deleområdet
Relativ fase beregnes som:
phase_diff(f) = unwrap(angle(H_A(f))) - unwrap(angle(H_B(f)))
Fase skal vurderes over et bånd rundt delefrekvensen, ikke bare i ett punkt.
Veiledende akseptgrenser:
ideelt: nær 0° relativ fasefeil ved Linkwitz-Riley akustisk mål
meget godt: innen ±15° rundt delefrekvens
akseptabelt: innen ±30° dersom normal sum, invertert null og robusthet er gode
betinget: ±30–45° bare dersom sum og null fortsatt er gode
ikke godkjent: over ±45° dersom dette gir dip, lobing, dårlig null eller ustabil sum
Motoren skal beregne:
phase_error_at_fx, mean_phase_error_around_fx, max_phase_error_around_fx, phase_slope_error, group_delay_difference og phase_robustness_score.
Fase kan aldri godkjennes alene. Den må stemme med normal sum og invertert null.
- Invertert null
Invertert null brukes som verifikasjon, ikke som eneste mål.
Motoren skal beregne:
null_depth_at_fx, mean_null_depth_around_fx, null_width_octaves, null_center_frequency, null_symmetry og null_robustness.
En god null skal være dyp nok, bred nok, sentrert nok og samsvare med god normal sum. En smal tilfeldig null skal ikke overbelønnes.
- Gain-styring
Driver-gain justeres før EQ. Gain er grov energibalanse, ikke et verktøy for å skjule lokale feil.
For driver D:
level_D = weighted_mean_db(|H_D(f)|, valid_band_D)
gain_needed_db = target_level_db - level_D
Gain skal beregnes over gyldig arbeidsområde, ikke fra én frekvens. Vekt lavere nær delefilterflanker, romdipper, lav SNR og utenfor trygt arbeidsområde.
Etter gainendring skal motoren alltid re-sjekke:
normal sum, invertert null, fase, headroom, driverstress, L/R-balanse og origo-tid.
Hvis gainendringen er stor, skal delay re-sjekkes lokalt rundt eksisterende verdi.
- EQ-strategi
EQ skal bare brukes etter at gain, delefilter, delay, polaritet og origo er stabile.
Målet er kontrollert respons etter target-kurve, ikke matematisk flathet. Target kan være brukerdefinert eller Harman-inspirert med romtilpasset bass og lett fallende energi mot toppen.
EQ-feil beregnes som:
error_db(f) = target_db(f) - measured_db(f)
Før EQ skal avvik klassifiseres som:
bred tonal ubalanse, minimum-phase peak, minimum-phase resonans, rommode, romnull, refleksjonskamfilter, driveroppbrytning, direktivitetsproblem, målefeil, L/R-asymmetri eller XO/fasefeil.
Kun egnede avvik skal EQ-korrigeres. Dype romnuller, ikke-minimum-phase dipper, kamfilter og direktivitetsfall skal ikke boostes.
- EQ-filtertyper og filtermodell
EQ-modulen skal støtte Pro-Q-lignende parametriske metoder:
bell, low shelf, high shelf, tilt shelf, notch, bandpass, highpass, lowpass, allpass, per-driver EQ, per-side EQ, global voicing EQ og senere eventuell dynamisk EQ.
Hvert filterobjekt skal inneholde:
filter_id, filter_type, frequency_hz, gain_db, Q, slope hvis relevant, channel_scope, driver_scope, phase_mode, enabled, reason, confidence, pre_score, post_score, headroom_cost, phase_cost, group_delay_cost, distortion_cost, power_response_cost, room_likelihood og minimum_phase_likelihood.
Total EQ:
H_EQ_total(f) = Π H_EQ_i(f)
Simulert respons etter EQ:
H_after(f) = H_before(f) * H_EQ_total(f)
- Q-håndtering
Q skal velges etter årsak, ikke for å pynte kurven.
Veiledende:
bred tonal justering: Q 0.3–1.0
vanlig bred PEQ: Q 0.7–2.0
lokal peak/resonans: Q 2–6
smal notch: Q 6–12 bare ved stabil resonans
Q over 12 krever høy confidence og validering
høy-Q boost skal normalt forbys
smal boost i dip skal forbys uten minimum-phase-bevis og flerposisjonsstabilitet
Q kan beregnes fra båndbredde:
Q = f_center / bandwidth_hz
Hvert filter skal vurderes for ringing, group delay impact, time-domain smearing og phase rotation.
- Minimum-phase-test
Før presis EQ eller boost skal motoren vurdere om avviket er minimum-phase.
Sammenlign:
målt fase, minimum-phase-estimat fra magnitude og excess phase.
Hvis avviket ikke er minimum-phase, skal EQ begrenses til kutt eller bred voicing, ikke full korreksjon.
- Powerrespons og direktivitet
Motoren skal ikke optimalisere on-axis alene dersom det gir feil total energirespons.
Hvis off-axis-data finnes, beregn:
on-axis response, off-axis response, listening window, early reflection estimate, sound power estimate og directivity index.
Hvis full polar-data ikke finnes, bruk proxyer:
driverdiameter, hornspredning, delefrekvens, bølgelengde, driveravstand, on/off-axis-data hvis tilgjengelig og romrespons.
Bølgelengde:
wavelength_m = speed_of_sound_m_s / frequency_hz
Driveravstand relativt til bølgelengde:
spacing_ratio = acoustic_center_distance_m / wavelength_m
Høy spacing_ratio i deleområdet skal øke lobing_risk_score.
DSP skal ikke kreve mer akustisk energi fra en driver enn driveren naturlig kan levere kontrollert. Ikke boost for å kompensere for direktivitetstap, powerrespons, oppbrytning, romnull eller naturlig avrulling utenfor trygt arbeidsområde.
- Forvrengning
Hvis REW-data inneholder harmonisk forvrengning, skal motoren bruke:
THD(f), H2(f), H3(f), H4(f), H5(f), IMD hvis tilgjengelig, noise floor og distortion_vs_SPL hvis flere nivåmålinger finnes.
H3 og høyere skal normalt straffes mer enn H2. Økende forvrengning nær delefrekvens kan flytte delepunktet.
Regler:
Hvis forvrengning stiger under en frekvens, skal driveren ikke deles for lavt.
Hvis diskant/horn viser økende H3/H5 nær nedre område, flytt delepunkt opp eller bruk brattere slope.
Hvis bass/mellombass viser økt forvrengning i øvre område, flytt delepunkt ned eller bratt filter.
EQ-boost som øker forventet forvrengning i risikobånd skal forkastes.
Kutt som reduserer energi i forvrengningsområde uten å skade sum/fase kan belønnes.
Motoren skal rapportere:
distortion_safe_band, distortion_warning_band og distortion_reject_band.
- Headroom og driverstress
For hver kanal skal motoren beregne:
digital_peak_margin_db, RMS_margin_db, cumulative_boost_db(f), max_boost_db, expected_excursion_risk, thermal_risk, low_frequency_risk, horn_low_cutoff_risk, tweeter_low_cutoff_risk og breakup_region_risk.
Boost under tuning, i romnuller, nær diskantens nedre grense eller under hornets trygge område skal forbys som standard eller gis svært høy straff.
- Romanalyse
Under ca. 200–300 Hz skal motoren anta at rommet dominerer mer. Bruk flere måleposisjoner, L/R separat og L+R. Finn rommoder, brede topper og posisjonsavhengige nuller. Kutt brede/modale topper forsiktig. Ikke boost smale nuller. Foreslå plassering, subintegrasjon eller delay før EQ.
Over ca. 300 Hz skal gated/direct sound brukes til driverrespons, mens rominkludert måling brukes til tonal balanse. Ikke korriger smale kamfilterdipper aggressivt. Bruk bred EQ bare ved stabile avvik.
For hvert avvik skal motoren beregne room_likelihood_score. Høy room_likelihood_score skal redusere EQ-aggressivitet.
- Venstre/høyre og stereosenter
Motoren skal beregne:
L_mag(f), R_mag(f), LR_error_db(f), L_phase(f), R_phase(f), LR_phase_diff(f), L_arrival_time, R_arrival_time, LR_delay_offset_ms, cross_correlation_offset_ms, center_band_level_difference_db, center_band_phase_difference og stereo_symmetry_score.
Sentrert lydbilde skal vurderes fra:
L/R delay match, L/R gain match, L/R phase match i stemmeområdet, L/R tonal match, mono sum stability, fravær av sterke asymmetriske refleksjoner og origo consistency.
Senter skal korrigeres i denne rekkefølgen:
routing/polaritet, L/R delay, L/R bred gain, bred tonal EQ, romtiltak/plassering.
Smal EQ skal ikke brukes som første løsning for å fikse senter.
- Origojustering
Systemet skal ha eksplisitt origo-modell:
SystemOrigin {
x
y
z
t_ms
reference_measurement_id
confidence
}
DriverNode {
side
driver_id
x
y
z
acoustic_t_ms
DSP_delay_ms
gain_db
polarity
valid_band
confidence
}
Alle delayverdier skal rapporteres som:
relativ akustisk tid mot origo
praktisk DSP-delay
fysisk ekvivalent avstand
distance_cm = delay_ms * 34.3
Origojustering er godkjent bare dersom:
driveroverganger summerer riktig, invertert null er god, L/R ankomst er symmetrisk, senterbildet er stabilt, subintegrasjon ikke trekker tidsreferansen feil, ingen kanal krever ufysisk delay og valideringsmåling stemmer med simulering.
- Robusthet
Hver kandidat skal testes med perturbasjoner:
delay ±0.05 ms, ±0.10 ms og ±0.20 ms
gain ±0.25 dB og ±0.50 dB
delefrekvens ±5 % og ±10 %
mikrofonposisjon hvis flere målinger finnes
En kandidat skal bare score høyt dersom den ikke kollapser ved små realistiske avvik.
- Scoremodell
Hver kandidat skal ha delscore:
measurement_quality_score, normal_sum_score, invert_null_score, phase_alignment_score, group_delay_score, magnitude_target_score, robustness_score, driver_stress_score, distortion_score, headroom_score, power_response_score, room_handling_score, LR_symmetry_score, center_image_score, origo_consistency_score og physical_plausibility_score.
Total score kan brukes til rangering, men må aldri skjule kritiske feil. Hvis én kritisk delscore feiler, skal kandidaten forkastes selv om total score er høy.
Kritiske fail-kriterier:
lav målekvalitet, ukjent routing, ukjent polaritet, dårlig normal sum rundt delepunkt, manglende invertert null der den forventes, stor L/R-delayfeil, stor headroom-reduksjon, boost i romnull, boost under trygg drivergrense, tydelig powerrespons-degradering, økt forvrengningsrisiko, origo-inkonsistens eller simulering som ikke stemmer med valideringsmåling.
- Non-degradation gate
Etter hver endring i XO, delay, gain, polaritet, EQ eller target skal motoren sammenligne mot forrige godkjente baseline.
Endringen godkjennes bare hvis:
target error forbedres, normal sum ikke degraderes, invertert null ikke degraderes vesentlig, fase ikke degraderes, group delay ikke får nye store avvik, headroom holder seg innen krav, driverstress ikke øker uakseptabelt, forvrengningsrisiko ikke øker uakseptabelt, powerrespons ikke blir åpenbart dårligere, L/R-symmetri ikke forverres, senter ikke flytter seg, origo fortsatt er konsistent og simulert effekt er realistisk.
Hvis testen feiler, skal motoren rollback’e og logge årsak.
- Validering med REW
Etter valgt kandidat skal motoren produsere testplan:
mål hver driver med ny gain/EQ/filter alene
mål parvise summer normal
mål parvise summer invertert
mål venstre fullrange
mål høyre fullrange
mål L+R mono for bass og senterkontroll
mål flere posisjoner i bassområdet
sammenlign målt respons mot simulert respons
Avvik beregnes som:
simulation_error_db(f) = measured_after_db(f) - predicted_after_db(f)
Hvis simulering og måling ikke stemmer, sjekk først:
filterimplementasjon, delay-fortegn, gain, routing, polaritet, REW timing reference, sample rate, latency, kanalbytte, plugin latency og målevindu/gate.
- Når systemet kan kalles optimalisert
Motoren kan bare rapportere “optimalisert” når:
målinger er gyldige, routing er verifisert, polaritet er verifisert, alle driveroverganger har god normal sum, relevante overganger har god invertert null, fase er innen akseptabelt område, delay er konsistent mellom impuls/fase/sum/origo, gain er balansert uten ekstrem kompensasjon, EQ er konservativ og årsaksbasert, Q passer problemet, powerrespons ikke er åpenbart degradert, forvrengning og driverstress er innenfor krav, headroom er bevart, romrelaterte avvik er korrekt klassifisert, L/R er tilstrekkelig symmetrisk, senterbildet er stabilt, sluttmåling stemmer med simulering og ingen non-degradation gate feiler.
Hvis dette ikke kan bevises, skal motoren rapportere “ikke optimalisert ennå” og forklare hva som mangler.
- Sluttrapport
Motoren skal alltid skrive:
hva som ble målt, hvilke data som ble brukt, hvilke data som ble forkastet, målekvalitet, valgt origo, delay per driver relativt til origo, praktisk DSP-delay per kanal, fysisk avstandsekvivalent, gain per driver, XO per overgang, slope per overgang, polaritet, EQ per driver/side, Q-begrunnelse, hvilke avvik som ikke ble korrigert og hvorfor, romrelaterte funn, powerresponsvurdering, forvrengningsvurdering, L/R-symmetri før/etter, center_image_score før/etter, headroom før/etter, driverstress før/etter, simulert vs målt avvik, pass/fail for regresjonstester, beste alternative kandidater og hva som eventuelt må måles på nytt.
- Hovedregel
ML motoren skal ikke optimalisere én graf. Det skal optimalisere et fysisk høyttalersystem i et faktisk rom. Alle valg skal være små, målbare, reversible og begrunnet i kompleks respons, fase, tid, gain, powerrespons, forvrengning, romklassifisering, robusthet, headroom, driverstress, L/R-symmetri og origojustering.