There is now a first proper release of HALS Post, including a Windows .exe installer. Please thanks to Tom for making the installer. Like the other one you will need to tell Windoze to "shut-up and install it".
This means it should no longer be necessary to install Python, dependencies, clone repository etc. Just download the installer from Releases and run HALS Post as a normal Windows application:
https://github.com/dfapinov/lah-scanner/releases
This is still quite experimental software, and documentation is also work in progress, but I think it is at a point where other people can realistically try processing their own measurements.
I would like to include some images but my computer was broken last week and I don't have access to the input data set.
View attachment 557957
Very basic workflow:
Input
HALS Post can point directly to the directory of IR files produced by the HALS capture/control application.
The processing is then divided into 5 stages.
Stage 1 – FDW and complex smoothing
This prepares the measured IR data for the later spherical harmonic processing and is already a first step in removing the effect of environmental reflections.
Frequency
Dependent
Windowing uses progressive time windows with frequency, allowing us to maximally exclude reflections from the impulse response while maintaining the frequency resolution we want.
Complex smoothing then operates on the complex data (not only magnitude). Apart from smoothing fine comb filtering that makes it easier for the solver to fit the model later, this has a useful property that reflected energy tends to have more rapidly changing phase, and this leads to stronger cancellation than for the phase-coherent direct field.
So Stage 1 is basically cleaning the measured data before asking the SHE solver to describe it.
Stage 2 – acoustic origin optimisation
This finds an optimum acoustic origin independently with frequency.
Important clarification because I think the name "acoustic origin" can cause some confusion: this is primarily a math trick to make the job easier for the solver.
This is NOT establishing a timing reference which you then use for crossover design etc.
HALS records these coordinate translations and reverses them again during Stage 5 extraction. The physical geometry, propagation delay and relative phase of the reconstructed loudspeaker are therefore fully retained.
Basic why: If a simple source is displaced from the coordinate origin, the math description of that geometry becomes vastly more complex. By temporarily moving the grid origin closer to where the sound appears to originate, the same field can be represented with less complexity.
It is an important step in the processing, but the effect is essentially transparent to the user.
Stage 3 – SHE pre-flight / optimisation
This runs much smaller test solves before committing to the full calculation.
One important job here is finding a sensible maximum harmonic degree, "Order N", supported by the measurement data. Not high enough and we lose detail; too high and we start 'hallucinating'.
The optimiser looks at how well the internal and external fields are separated and searches for the point where increasing N starts making the separation rapidly worse, rather than adding useful spatial information.
I would particularly welcome experiments here with different speakers, measurement radii and grid sizes. This method has worked well in my tests, but probably this is one area which can benefit most from more varied real-world data before deciding how automatic recommendations should eventually behave.
Stage 4 – full SHE solve
This is where the heavy calculation happens.
HALS fits the measured complex pressure field with spherical harmonics and, importantly, separates the solution into an
internal field originating inside the measurement surface (the loudspeaker) and an
external field originating outside it (room reflections etc.).
The result is therefore not simply interpolation between microphone positions. It is a continuous mathematical description of the measured 3D sound field, with the loudspeaker and room fields separated.
Stage 5 – extraction
Grab your prize! Once coefficients have been calculated, you can put virtual microphones wherever you want and reconstruct the pressure there.
There are currently modes for:
- CTA-2034 / Spinorama
- horizontal and vertical arc sweeps
- custom coordinates
Default is to export only the internal field to get the anechoic response, but external and full reconstructed fields are also available for the curious or for debugging the solve.
FRD can be exported for VituixCAD or other speaker CAD software.
There are several options for Time Of Flight subtraction depending on what reference is useful:
- manually specified reference/distance
- automatic IR peak detection
- best fit to minimum phase
One point I want to make very clear:
"best fit to minimum phase" does NOT convert the result to minimum phase.
Minimum phase is only used as a reference to estimate how much linear phase slope belongs to propagation delay. That estimated TOF is subtracted from the original complex response. The original phase information remains, including any real excess / non-minimum-phase behaviour of the loudspeaker.
There is now also a live preview showing
magnitude, phase and impulse response, so the effect of moving the microphone and the selected TOF reference can be inspected instantly.
Alternatively HALS can export reconstructed impulse responses as WAV. These retain the full propagation delay (or the IR can be cut before the start of the file) and can be used for signal processing, convolution, or CAD software which accepts IR input.
Documentation:
The documentation for each processing stage is in the repository and explains more of what is going on in the engine bay:
https://github.com/dfapinov/lah-scanner/tree/main/documentation
Some of this documentation needs updating to catch up with recent changes, so please consider it work in progress.
And I really want to add some more about how to actually use the software, not only how it works.
I am very interested now to see results from different loudspeakers and different measurement grids.
If you have some questions please feel free to ask them - It may help me to include more helpful documentation.
And of course bugs are quite possible.