Release Notes
This page is generated automatically from the project's CHANGELOG.md and always reflects the latest released version.
[1.4.12] - 2026-10-11
Added
- Sweep spectrogram (license): a new window, View → Sweep Spectrogram, shows a driver's recorded sweep as a time-frequency map - the fundamental climbing through the band, and the harmonic distortion running above it at 2× to 5× its frequency - so you can see where in the sweep a rub, a buzz or a resonance shows up. Each frequency band is analysed with a resolution matched to the sweep, so the tracks stay thin and the harmonics apart up to H5. Pick the driver, the angle is the one selected in the main window; Harmonic guides draws the theoretical tracks of H1 to H5. LinFIR does not keep the recording itself: the sweep is rebuilt by convolving the raw impulse response, harmonics included, with the sweep regenerated from the parameters stored with the measurement - the band edges below the start frequency read at their recorded level, and the harmonics above a limited end frequency are kept. Available for measurements taken with LinFIR's sweep, or imported from a WAV or TXT exported by LinFIR with its distortion data.
- Near-field splicing: import a measurement file: next to Measure…, Import file… loads an element's near-field response from a file instead of measuring it - WAV, TXT, TMD, CLIO or FRD, read exactly like in the IR Management window (same formats, same checks). The file must be at the same sample rate as the other elements; it is then windowed like a capture.
- Linux: every distribution: LinFIR for Linux was a
.debfor Ubuntu 22.04 / Debian 12 and later only. It now runs on any 64-bit distribution released since 2020, and comes in three forms: the.deb(Ubuntu, Debian, Mint... from 20.04 / 11), an.rpm(Fedora, RHEL / Rocky / Alma 9, openSUSE), and an AppImage for Arch, Manjaro and any other distribution, which runs without being installed. The AppImage offers to add LinFIR to the applications menu and to open.lnfprojects on a double-click, and updates itself in place; the.rpmupdates from LinFIR like the.deb(dnf or zypper). LinFIR no longer depends on the system's OpenSSL, which older and newer distributions don't have in the same version. - Linux: rotation table controllers usable without setup: the packages also let the person using the computer open a GRBL controller (USB serial port), like the Pololu Tic, and apply the rule to controllers already plugged in. Joining the
dialoutgroup (uucpon Arch) and logging in again is not needed. With the AppImage, Settings → Rotation Table → Allow the controllers installs the same rule after asking for the administrator password, and a "permission denied" when connecting points to that button. - FIR crossovers: link a low-pass with a high-pass: a driver's FIR low-pass and the next driver's FIR high-pass can now be linked, from Linked to at the bottom of either filter window, so that they keep the same settings: a change made in one window applies to the other. A link can join more than two filters - in an MTM, the tweeter's high-pass with both mids' low-passes. The type and order, the frequency, the Kaiser β and the causality are shared, each behind a lock: open a setting's lock to set it for each filter apart (for example a different causality on each side). Links follow the drivers when they are reordered, are saved with the project, and are undone and redone like any other change; a lock after Low Pass / High Pass in the driver list shows which filters are linked.
- Auto-align delays and Auto-level can stay on: a click on either button still adjusts the drivers at once, and now also leaves it on, highlighted in the accent colour. The delays (or the gains) are then adjusted again after every change to the drivers - a filter, a measurement, a driver turned on or off - once the change is done (a slider released, typing paused), in the same undo step. A second click turns it off, and so does changing a delay (or a gain) by hand, which keeps the value you set. The setting is saved with the project; opening a project, undoing or redoing never adjusts anything by itself.
Changed
- Phase correction: Guard Tolerance 2 dB by default: new phase corrections (driver and global) start with a 2 dB Guard Tolerance instead of 0.5 dB. Now that the guard only checks where the system plays (see Fixed), 2 dB keeps the magnitude within about 1.5 dB there while correcting down to the low end; 0.5 dB pushed the correction band up for no audible gain. A project keeps the tolerance it was saved with.
- FIR correction filters: a typed frequency range applies when you leave the field: in the Frequency Range fields of the magnitude and phase corrections (driver and global), a typed value now applies when you leave the field - Enter, Tab, a click elsewhere (even in another window) or closing the window; Escape cancels it - instead of on every keystroke. Typing 20000 as the upper bound no longer goes through 2, 20 and 200 Hz first, each clamped to the lower bound and each redesigning the filters. Dragging the fields still applies as you drag.
- Auto-EQ much faster, and in the background: generating the IIR Auto EQ filters (Generate Filters, or Auto-generate after a parameter change) took from one to several seconds - over 15 s with many filters on a rough response - during which the whole interface froze, and with Auto-generate it ran again at every step of a slider drag or keystroke. The optimizer is now about 25× faster (typically 50-150 ms, half a second in the slowest cases tried) and finds exactly the same filters as before. It also runs in the background: the windows stay responsive, a spinner turns meanwhile and Generate Filters becomes Cancel, and the current filters stay in place until the new ones are ready. With Auto-generate, the filters are regenerated once a drag or typing ends, and the edit and its new filters are a single undo step. Editing with no IIR window open is lighter too: the IIR target curve shown on the graph is only computed while its window is open on the Auto tab.
- Documentation: new look, same style as demaudio.com: Help → Documentation now looks like the web site, with a light and a dark theme (System, Light or Dark, from the menu in the header). The bar that showed the current section above the text - and could hide headings - is gone: each page lists its sections in an "On this page" column that highlights the one being read (a fold-out list on narrower windows), and phones get a proper menu. The search now finds the section of a page, not just the page. Screenshots follow the theme and are about 6× lighter, so pages open faster and the app download is smaller. Formulas now display without an internet connection too. Printing still works: the printer button prints the whole documentation (release notes last), and a single page prints from the browser (Ctrl+P / Cmd+P), always in the light theme. Page addresses changed (
installation.html→installation/); old links and bookmarks are redirected.
Fixed
- Auto-align delays in Hypex FusionAmp mode: it could set a delay beyond the 19.2 ms the amplifier takes, which the HFD export then refused. The delays now stay within it.
- Projects saved without their
.lnfextension: on Windows, typing a new name over the suggested one in Save as saved the project without its extension, so File → Open did not list it - only the recent projects reached it. The save dialog now adds.lnfto a name typed without it (on Linux, where the dialog does not, LinFIR adds it, and the dialog opens again before replacing a project of that name). For projects already saved that way, File → Open has an All files choice on Windows and Linux; renaming the file to end in.lnfworks too. - Windows: measuring through Dante Virtual Soundcard and other 24-bit ASIO drivers:
- LinFIR refused to record from an ASIO driver working in 24-bit (Dante Virtual Soundcard's default). 24-bit drivers are now recorded and played like 16 and 32-bit ones.
- The ASIO driver is now opened by the main window, where Audio Settings lists the devices, and kept open for the whole capture, instead of being opened again from the capture thread: a driver listed in Audio Settings could then fail to open for the capture ("The ASIO driver could not be loaded… only one application at a time"). If the driver still won't open, the capture tries again a few times, and the message now says Windows could not open the driver, with the reason it gave, instead of blaming another program. The log records the driver's registration and how Windows answered, for support.
- When an audio stream does not start (WASAPI reports that only to a callback LinFIR used to ignore), the capture now says which device delivered nothing, with the driver's error, instead of rejecting the recording for "unstable Windows audio scheduling". When the streams started too far apart, the message says by how much.
- A capture rejected because the second harmonic overlaps the impulse response now gives the delay measured and the delay the sweep allows, and suggests a longer sweep or the Electric timing reference, which removes the latency of the audio chain (an audio network such as Dante adds several milliseconds).
- Linux and macOS: measurement failing on a device that also offers 64-bit float: LinFIR chose 64-bit float samples whenever both devices offered them - an ALSA
plugdevice does, such as the default device of a Linux system without PulseAudio or PipeWire - but cannot record in that format, so the capture stopped at once with "sample format LinFIR cannot record". It now chooses only among the formats it records (32-bit float first, then 32, 24 and 16-bit integers). - A capture without the sweep is now refused as such: when the recording held no sweep - a wrong output or input channel, a routing error in an audio network, a muted input - LinFIR still read a delay and harmonics out of the noise, and the capture was rejected with a misleading message (for example "h2 contaminates h1 … 4961 ms"). The level checks did not catch it: they look at the loudest sample, which a single click passes, and they only run with several averages or on a completed capture. LinFIR now checks the first sweep of the recording, before anything else is computed: deconvolved, it must peak where the sweep can arrive (from the start of the recording to the end of the post-silence) at least 20 dB above the noise. The deconvolution only gathers what follows the sweep: noise, clicks, hum or music stay at about 16 dB at most, while a recorded sweep - the whole band, a tweeter's or a subwoofer's, or a sweep stopped at 200 Hz to 2 kHz - still scores 26 dB or more 15 dB under the noise. Otherwise the capture is refused with "No measurement sweep was found in the recording, or it is too weak to measure", the ratio measured, and what to check.
- Phase correction guard: a warning that wouldn't go away, a failed filter applied anyway, and failures whatever the tolerance:
- The correction faded out towards the band's average phase wherever the response fell more than 20 dB below its peak. At the bottom of a subsonic filter that swung the phase by several radians within an octave - faster than a FIR of a few thousand taps can follow - and cut 10-40 dB dips at 20-30 Hz into the filter. The guard then had to push the start frequency up to about 2 kHz (no correction left), and with long filters even a 15 dB tolerance didn't help. The correction is now held there instead - it continues the corrected band smoothly - so a two-way system behind a steep 25 Hz subsonic filter is corrected from about 25 Hz up, within 2 dB.
- The guard now looks at the response with all the other filters: a driver's FIR crossovers and magnitude correction and its IIR filters (even in pre-IIR mode), the global IIR filters and magnitude correction for the global correction. It checks the phase filter's magnitude from 20 Hz to 20 kHz only where that response is within 40 dB of its peak, and holds the correction below -20 dB. It used to take the bare driver's response (a woofer with only a low-pass was checked up to 20 kHz), and the global guard checked all of 20 Hz-20 kHz.
- When the guard still can't meet the tolerance, the phase correction is not applied - the filter becomes a plain delay of the same length, so latency, alignment and exports don't move - instead of keeping its last attempt, which was off by more than the tolerance and corrected almost nothing. The guard also no longer raises the End Frequency: nothing is corrected outside the band you set.
- The warning now appears once when a correction starts failing, for 8 seconds (it can be closed), not again while it keeps failing, and not during a slider drag. It used to stay on screen and come back on every recompute, and the global one kept coming back after the global phase correction was turned off. The toast only says which correction failed, and nothing about the guard is shown in the correction windows: the hover text of the phase Frequency Range fields gives the smallest deviation reached, or the band the guard limited the correction to.
- Phase correction inverting a woofer measured through a short window: the filter is turned over by 180° whenever that keeps the driver from being inverted, and its gain at 0 Hz decided when. When the IR window cut a woofer off while its step response was negative, its response at 0 Hz came out negative and within 20 dB of its level, and keeping the filter's gain there positive turned the corrected woofer over - out of phase with the tweeter at the crossover, with no warning - above some Intensity, so dragging the slider could turn it over partway. The choice is now made on the band's mean phase as the driver plays it through its crossovers and other filters (kept near 180° if it sits nearer 180° than 0°), and the Intensity never changes it.
- Directivity sonogram flickering: any edit - even one that leaves the directivity unchanged - blanked both sonograms until they had been recomputed, so they vanished and reappeared on every change. The current images now stay on screen until the new ones replace them.
- Imported measurements re-exported without their distortion data: importing a WAV or TXT exported by LinFIR kept the measurement's previous split point between the harmonic part and the impulse response (0 for a new angle), so exporting it again wrote a wrong split: the next import lost the harmonics, or cut the impulse response at the wrong place. Exports now always write the real split, so projects saved with such a measurement export correctly too, and imports store it.
- Auto-level: no driver ended at 0 dB: the gain changes were shifted so that the largest one was 0 dB, then added to the drivers' current Gains - so unless a driver already sat at 0 dB, none did, and the overall level depended on where the Gains happened to start. One driver is now the reference: its Gain ends at exactly 0 dB, and the system plays at its measured level. It is the driver in the middle of the levels the drivers need, which keeps the total correction smallest: a driver whose sensitivity is well off the others' now gets the largest correction - turned down if it is too loud, raised if it is too quiet - instead of all the others being moved to it. In a 2-way, the louder driver is turned down to the other one, as before. The confirmation names the reference driver.
- A driver's measurements read at the wrong sample rate: several paths changed the rate a driver's impulse responses are stored at without the responses themselves, so they were then read - and resampled, windowed, exported - an octave or more off, and the project saved that way:
- pasting a driver's parameters copied the source driver's rate onto the target, whose measurements kept their own;
- an import that was refused (peak too late) or discarded at the low-level prompt still switched the driver to the file's rate - the measurement it was meant to replace stayed, now misread. The rate now only changes when a file is actually stored;
- the FRD converter's rate was only locked when it opened: a measurement added at another rate while it was open was then reinterpreted on Convert. It now follows the driver's measurements while open;
- deleting a driver while an FRD converter or the near-field splicing wizard was open for a later driver sent their result to the wrong driver. They now follow their driver, and close with it, or with an undo or redo that adds or removes a driver;
- a near-field element captured at a different rate than the other elements was accepted, then silently left out of the splice (an import at that rate was already refused), and elements at a different rate than the far-field measurements were blended bin by bin with them, putting the near-field part an octave off in every spliced angle. Both are now refused, the wizard says why, and a splice whose elements no longer match the driver's rate is removed instead of applied.
- Re-imported measurements hidden by an old splice: re-importing an angle (file or FRD) after the near-field splice had been applied left the old spliced response in place of the new data - and read it at the new rate if it differed. The stale splice is now dropped, and with a finalized recipe the new data is spliced again, as captures already were.
- Distortion IR window time axis: the harmonic impulse responses were converted to milliseconds with the project's sample rate instead of the rate they were captured at, so with a 48 kHz capture in a 96 kHz (or Hypex) project every curve was drawn twice too short.
- Features of the wrong project mode: in Room Calibration, the K shortcut showed the Harmonic Distortion graph, the Distortion IR window opened from the View menu or J, and importing a file whose name holds an angle stored it at a position the mode never shows (so the import seemed to do nothing). In Hypex FusionAmp mode, R did nothing and the Directivity Index overlay was never computed, although both are available there.
[1.4.11] - 2026-10-03
Added
Drag-and-drop reordering: drivers (and measurements in Room Calibration mode) can now be reordered by grabbing their header - the new ☰ grip or the name - and dropping it above or below another one. A line shows where it will land, and everything tied to the driver (its filter windows, IR management window, its position in the graphs, DI and exports) follows. Graphs can be reordered the same way: drag a graph's title above or below another graph in the main view, or drag the rows of Settings → Graphs → Graph Order; hidden graphs keep their place in the order. The ⬆⬇ buttons still work, and clicking a driver's name still folds and unfolds its section.
Auto-level: a new button next to Auto-align delays that sets every active driver's Gain so the summed response is as flat as possible across the whole system pass band, crossover regions included. The drivers are time-aligned internally for the calculation (without changing their delays), the natural roll-offs at both ends of the system are left out of the fit, and the fit uses a robust criterion so a driver's own ripple or the start of a roll-off can't skew it. No driver is ever made louder - only the relative levels change - so the headroom against clipping never shrinks. The confirmation shows the gain changes and how far the summed response is from flat before and after.
Rotation center correction for off-axis measurements: when the turntable axis wasn't at the front baffle - typically somewhere under the cabinet - the off-axis measurements were taken further from the speaker and at a wider angle than their nominal angle (with the axis 150 mm behind the baffle and the mic at 1 m, the 90° measurement is 0.47 ms late, 1.3 dB low and really 97° off axis), which skews the off-axis sums, the Listening Window and the directivity. Enter where the axis was (depth behind the baffle, sideways offset, mic distance - separately for the horizontal and vertical planes) and each driver's position on the baffle under the measurement lists of the IR Management window: LinFIR rebuilds every off-axis response as if the speaker had turned about its baffle, correcting the time of flight, the level (1/r) and the angle (interpolating between neighboring measurements). The on-axis measurement is never changed, the measurement files aren't modified, and the info icon shows a drawing of what to measure. Apply placement to all drivers copies the turntable placement to every driver, each keeping its own position on the baffle.
Changed
- A more modern look, in every window: the left column is now a set of cards - the target DSP settings in one, and each driver in its own card edged with its colour, with its filters, IIR filters and speaker settings grouped under small section titles - and every graph sits in its own card. Window, section and graph titles use the accent colour (red or blue, as set in Settings), tabs are segmented controls, buttons, toggles, status badges (such as "IR loaded") and help icons look the same everywhere, and form labels no longer end with a colon. All the other windows follow the same style: IR management, FRD converter, LP/HP/correction filters, IIR and Auto-EQ, target curves, Hypex export, Settings (including the License tab), About, bug report, directivity, spectrogram, distortion IR and the near-field splicing wizard, in light and dark themes.
- Much lighter slider drags with several drivers: LinFIR recomputes live on every frame while a parameter is being dragged, and used to redo the whole filter chain and response analysis of every driver each time, even the ones the drag didn't touch. Only the driver whose settings actually changed is recomputed now - the others are left exactly as they were - and the dashed raw (pre-filter) curves, which don't depend on the filters, are no longer recomputed on a crossover or EQ edit.
- Clipping detection no longer slows down editing: the clipping test - the pink-noise test signal run through every driver's filter chain and through the global filters - now runs in the background instead of on every recompute. With long filters it used to cost the interface tens of milliseconds on each frame of a slider drag; the graphs now follow the slider at full speed and the warnings update a moment later. Each filter chain is only re-tested when it actually changes (dragging one driver's slider re-tests that driver alone), and a warning always stays on the right driver, even after reordering. The warnings also come in a stable order now, global first then drivers in order.
- Spectrogram CQT and Burst Decay up to 13× faster: each frequency band of the Morlet filter bank is now computed on its own bandwidth only, instead of a full-length transform of the whole spectrum for each of the thousands of bands. On the default 4096×4096 grid a 0.6 s loudspeaker IR drops from about 0.8 s to 0.12 s, and a 2.5 s room IR from 6.4 s to 0.5 s. The result is the same to within 0.01 dB.
- Faster IR windowing with many off-axis measurements: changing a driver's time window used to re-window all its measurements one after another; they are now windowed in parallel, and the adaptive (frequency-dependent) window itself was streamlined - with the exact same result. Re-windowing 72 off-axis measurements is about 4× faster on a 4-core machine, more with more cores.
- Faster graph drawing, whatever the plot resolution: curves are now drawn at the graph's actual pixel resolution instead of their full 16k-64k point spectrum, keeping the exact peak and dip of every pixel column, so the graphs look the same and auto-scaling is unchanged while drawing them costs a fraction of before. Zooming in reveals the full detail, as before.
Fixed
- Phase correction inverting a driver, and its guard tolerance not held: the phase correction brought the band's mean phase to 0° whatever it was, so a driver - or the global sum - whose phase sat nearer 180° came out with its polarity inverted, flipping back and forth as the band, smoothing or guard settings changed. The correction filter now never inverts: its step response ends above where it starts and its main peak is positive (the whole filter is turned over when needed, which keeps the corrected impulse response symmetric). The magnitude guard also checked the filter on a grid too coarse to see the ripple between its points (over 1 dB at low frequency on a 4096-tap filter while 0.5 dB was asked): it now checks a finely sampled response, so the Guard Tolerance holds, on the drivers and on the global filter.
- Pololu Tic: Energize button out of step after a Go: sending the table to an angle from Settings energizes the motor, but the button kept offering Energize until clicked once; the move now energizes the motor explicitly and the button shows De-energize.
- Graphs overflowing the window, or an infinite graph height, with the HD graph: graph heights were computed by counting the HD graph and then subtracting it again, which went wrong whenever the two didn't match - with HD detached in its own window the other graphs got a share too many and ran past the bottom of the panel, and with HD the only graph toggled on in the FIR, IIR or FIR+IIR views the count reached zero. Only the graphs actually drawn are counted now.
- Global correction filter not re-checked for clipping after an off-axis refresh: when the global FIR correction is redesigned from fresh off-axis data (Listening Window or Predicted In-Room reference), its new version was never tested for clipping, so a warning could be missing or out of date until some other change. It is checked like any other change now.
- FRD converter: driver offset delay had the wrong sign on one side of the axis: the time-of-flight difference added for a driver's offset was always positive, so a woofer below the tweeter arrived later both above and below the axis - while below the axis, on its side, it is closer and must arrive earlier. Lobing predicted from FRD imports was therefore mirrored on one side. The delay is now signed (earlier on the driver's side, later on the other side); X is counted toward positive horizontal angles and Y up. A ⚠ warns when the converter's Delay is too short to leave room for the earliest angles.
- Saving and quitting could lose work: "Save" in the Unsaved Changes prompt now saves right away and only then quits, loads or creates a project (it used to queue a background save and go on, so a quit could kill the save mid-write, and a failed save was reported after the project was already gone). Quitting from that prompt now really closes LinFIR (it used to close only the prompt and leave the app half-quit), a second close request while the prompt is up no longer quits without saving, and queued background saves always finish before LinFIR exits. A failed auto-save is retried instead of being forgotten, and the final block of a project file is now checked and flushed to disk before it replaces the previous file. "Restart Now" after an update asks first when auto-save is off and there are unsaved changes. "Reset Application Settings" keeps the licence activation and closes the app as announced.
- Crashes: a driver, measurement, calibration or audio-device name with an accent or another non-ASCII character in the wrong place; two target-curve points at the same frequency (e.g. while typing 200 Hz); an Undo from an IR window that removes a driver; a Hypex project whose 15-biquad budget is full; a project file whose driver count does not match its drivers (it crashed at every launch); an impulse response or WAV file containing NaN or infinite samples (now refused with a message, instead of crashing or making the driver vanish from the graphs).
- Measurements and imports going to the wrong place: the angle and axis controls are locked while a capture, an auto-scan or the low-signal prompt is pending, so a measurement is stored where it was started; a single file with no angle in its name goes to the selected angle instead of replacing the on-axis measurement; closing the axis dialog cancels the import instead of importing every file at 0°; a TXT file without a sample rate is stored at the angle in its name once its rate is entered (it went to the angle selected in the window, usually replacing the on-axis measurement), and skipped in a multi-file batch as its message says (the last one was imported anyway); a file whose name gives an oblique angle (H and V both non-zero, e.g.
_v30h50) is skipped with a message instead of replacing the on-axis measurement; reordering drivers keeps every open IR window on its driver; in Room Calibration a stale off-axis angle no longer applies. A file, FRD conversion or capture at a sample rate different from the driver's other measurements is refused instead of silently reinterpreting all of them (the TXT dialog no longer defaults to 8000 Hz after a restart). - Measurement capture: clipping is detected on the real converter level, before the input gain compensation (no more false rejections with a positive compensation, or missed clipping with a negative one), and no longer on the start-up glitch the live check ignores; the last half-second of each capture is recorded again; the low-level check of the first sweep is no longer fooled by the loopback chirp; a timing reference that cannot be detected is reported as such instead of a misleading "h2 contaminates h1"; the sweep and timing-reference outputs on the same channel are refused; a negative manual offset no longer overflows; output-stream errors are reported as such. Closing the IR window - or deleting its driver, or opening or creating a project while it captures or scans - stops its capture and auto-scan (the table still returns to 0° and is de-energized), an auto-scan stops when a capture cannot start, Measure is disabled during a capture or scan, Scan while the low-signal prompt is pending (a scan capture took the place of the one waiting for the answer), and starting a scan cancels the previous scan's pending de-energize. In the near-field splice wizard, a second capture can no longer be started and saved into the wrong element, and auto-splicing new captures works again after reopening a project.
- Directivity, AutoEQ and exports: the Directivity Index is computed from the acoustic sum of the drivers, like the other directivity curves (it ignored phase and could drop a driver entirely); the AutoEQ optimizer actually optimizes now (it stopped after the first step and returned its initial guess); near-field splice levels follow the piston radius, not its area (vents and passive radiators came out several dB too quiet - re-run Match level to far-field); the global FIR correction in post-IIR mode follows the Auto-EQ tab when it is the active one; MiniDSP biquad exports have the sign miniDSP expects for a1/a2; the HFD export refuses filters it cannot carry instead of dropping them, and follows the device model set from the menu.
- Rotation table and audio devices: with GRBL 1.1, the angle now accounts for "Set 0°", so the auto-scan no longer times out; plugging in an audio interface updates the device list again; waking an ASIO computer from sleep keeps the selected interface; choosing "None" as timing reference is remembered.
- Linux: the default audio device (PipeWire or PulseAudio) is now found - captures failed with "Input device not available" - and a capture whose input stream starts a few milliseconds late is no longer rejected with the timing reference. The .deb package installs on current Ubuntu and Debian, and registers the .lnf project file type: double-clicking a project in the file manager opens it in LinFIR (it used to be taken for a compressed archive), and project files get their own icon. Only one LinFIR runs at a time, as on Windows: opening a project while LinFIR is running opens it in the running window, and launching LinFIR again brings that window to the front. Updates are offered in the app, as on macOS: Install downloads the new package and the system asks for the administrator password to install it. The package also installs the udev rule the Pololu Tic needs, and the window is matched to its launcher icon under Wayland. When the Tic or the GRBL controller cannot be opened for lack of permission, the message says which udev rule or group is needed (see Rotation table → Linux: device access).
- Smaller fixes: the "What's new" note no longer covers the update notification; dialogs open centred on the LinFIR window, also on a second screen; the update check no longer hides the download progress or "Restart Now"; the N shortcut recomputes like the toolbar toggle; "HD", "(horizontal)/(vertical)" and "Plot" are translated; the bug-report window closes on Cancel; graph legends list the drivers in their order, top to bottom (they were sorted by name, and upside down in the bottom corners); the spectrogram explains when it cannot be computed instead of showing "Computing" forever; FIR export padding and the reports follow the per-driver taps setting.
- Performance: a connected turntable no longer redraws the whole interface every frame; renaming a driver no longer recomputes every IR; DI, Sound Power and Predicted In-Room integrate the sphere far faster; no per-frame copy of every driver in the driver list and the distortion IR window; faster phase alignment; the spectrogram runs one computation at a time instead of piling up workers during a drag; the directivity sonogram no longer recomputes forever with horizontal-only measurements; timing-reference detection only analyses the start of a long multi-average capture; stale off-axis results are dropped and the global FIR correction is only redesigned after an off-axis update when it depends on it; the Listening Window and Predicted In-Room curves (and Early Reflections, Sound Power, ER DI) are only computed while shown with a valid license, instead of after every edit (turning one on computes it); a spectrogram computation abandoned for a new setting stops at once instead of finishing its transform.
[1.4.10] - 2026-09-30
Fixed
- Sweep confirmation buttons cut off in French: the "Start sweep measurement?" window was too short for the French text, which wraps onto more lines, so its Start Measurement / Cancel buttons ran past the bottom of the window. The window is now tall enough.
- "+ Add Point" slightly cut off in the target curve window: in every language, the button below the control point list ran a few pixels past the bottom of the window. The list now leaves room for it, whatever the window size and the number of points.
[1.4.9] - 2026-09-26
Added
- LinFIR in French: the whole interface - menus, windows, settings, tooltips, graph titles and legends, notifications and error messages - is now available in French, using the usual French terms of signal processing and acoustics (réponse impulsionnelle, retard de groupe, passe-haut, fenêtrage, directivité...). Pick it in Settings → General → Appearance → Language: Automatic (the default) follows the language of your operating system, or force English or Français. The switch is immediate, no restart needed. The documentation, exported files and bug reports stay in English.
Changed
- Graph toolbar wraps when it needs to: the toolbar above the graphs moves its second half to a new row based on the actual width of its controls instead of a fixed window width, so it never runs off the edge - whatever the language - and stays on one row whenever it fits.
- Save as... moved to the File menu, right below Save: File → Export → LinFIR Project is gone, replaced by File → Save as... where you'd expect to find it. It works as before: you choose a new name and location, and LinFIR then keeps working on that new file (Save and Auto-save go to it from then on), leaving the original file as it was.
- Cmd/Ctrl+E now does Save as...: this shortcut used to write a copy of the project while you kept working on the original file - not the same thing as the menu entry it was paired with. It now does exactly what File → Save as... does, so saving under a new name always behaves the same way and you always know which file you are editing.
Fixed
- License deactivated on some networks: some networks (a home router, a hotel or office Wi-Fi) give the computer another name - a Mac called "MacBook-Air-de-..." becomes "mac.home" - and LinFIR took that for another machine and cleared the license. The license is now tied to the machine's hardware identifier and its own name, whatever the network calls it. Existing activations keep working, including ones made while the network had renamed the computer, and nothing needs to be reactivated.
- Tooltips could run past the edge of narrow windows: long hover texts were wrapped at a fixed width, wider than some small windows (filter settings, IR management, export dialogs), so part of the text was cut off. Tooltips now wrap to fit the window they appear in.
[1.4.8] - 2026-09-24
Changed
- Raw pre-filter curves follow the focused filter window: the dashed raw (pre-filter) curves on the frequency, phase and group delay graphs are now drawn only for the driver whose filter window (LP, HP, FIR correction or IIR) is in the foreground - or for the sum when a global filter window is. With several filter windows open, you only see the curves of the one you are working in, and nothing when they are all in the background, the same way the IIR Auto EQ target overlay already behaved.
- FIR correction target overlay follows focus too: the green correction target overlay (per driver and global) is now shown only while its FIR correction window is in the foreground, like the IIR Auto EQ target.
- Bug Report now requires your email address: Help → Report a Bug has a new, required email field so we can follow up on your report. It's remembered between sessions and used as the report email's Reply-To, so a reply from support reaches you directly.
- Extended project backward compatibility to LinFIR 1.2.0: projects created with version 1.2.0 or later can now be opened directly without requiring a pre-conversion re-save.
Fixed
- Bug reports always claimed LinFIR v0.9.9: the emailed report's "Application Version" line was a hardcoded placeholder instead of the actual running version - fixed to report the real version.
- "Save As..." and "Export Project" could produce a corrupted project file: unlike the regular Save path, these wrote a plain, uncompressed
.lnfdirectly to the target path - an interruption partway through (crash, force-quit, power loss) could leave a truncated or empty file that fails to reopen ("Invalid JSON: expected value at line 1 column 1"). Both now use the same compressed, atomic (temp file + rename) write as every other save path, so an interruption leaves either the previous file intact or the fully-written new one.
[1.4.7] - 2026-09-23
Changed
- Target Curve Configuration window colored by filter type: the window opened via a filter's Configure button now plots its curve in green for a FIR magnitude correction filter, matching that filter's own target overlay on the frequency graph - Auto EQ keeps the existing blue.
Fixed
- Correction target overlay didn't refresh on a Gain change: the FIR magnitude correction target overlay (new in 1.4.6) stayed at its last position after changing a driver's Gain - it only caught up once some other correction parameter was touched, forcing a recompute. The overlay's cache-invalidation check now also watches Gain.
[1.4.6] - 2026-09-23
Added
- Early Reflections, Sound Power and Early Reflections DI curves: the remaining pieces of the CTA-2034-A ("CEA-2034") spinorama suite are now available as their own curves on the sum's frequency graph, not just as internal ingredients of Predicted In-Room Response - Early Reflections (purple, dashed), Sound Power (teal, dashed) and Early Reflections DI (dark orange, the on-axis-minus-Early-Reflections ratio, offset alongside DI). Each has its own toggle in the Graphs dropdown's Overlays section (Settings → Graphs → Default Overlays sets what a new project starts with) - all three are hidden by default, unlike the existing overlays.
- Listening Window / Predicted In-Room as a per-driver reference: the driver-level FIR correction filter and driver Auto EQ each gain the same Reference selector as their global counterparts - On-axis, Listening Window or Predicted In-Room - now computed from that driver's own polar measurements alone instead of the summed system. Useful for voicing a driver's own off-axis trends (tweeter beaming, baffle diffraction); a crossover region's interference with a neighboring driver is still only visible to the global filters' own Reference, which sees the summed system. Same license requirement and On-axis fallback behavior as the global version.
- Magnitude correction FIR filter: target curve overlay: same idea as the existing Auto EQ target overlay - while a driver or global correction filter window is open, a green overlay on the frequency response graph shows what the response converges to at 100% Strength (target curve shape, level-matched to the response's own average - including the driver's own Gain, for a driver correction filter - plus Correction Gain). Not shown with Use legacy FIR correction tuning enabled, since that algorithm has no equivalent fixed curve to converge to.
Changed
- Listening Window and Predicted In-Room no longer need a second driver or a global filter: they used to only appear once at least two drivers had measurement data, or a global IIR/FIR correction filter was active - even though DI already showed for a single, unfiltered driver. All three overlays now follow the same rule: available as soon as there's enough off-axis angle coverage, regardless of driver count or filters. The Show Listening Window / Show Predicted In-Room Response toggles in the Graphs dropdown still let you hide them, unchanged.
- Magnitude correction FIR filter (driver and global): Max. Attenuation + Correction Gain replaced by a single Strength slider: instead of tuning "how much attenuation" and "how much compensating gain" as two separate, manually-balanced fields, a single Strength slider (0-100%, styled like the Phase section's Intensity) now controls how far the correction goes, from untouched (0%) to fully matching the target within the configured frequency range (100%). The new algorithm references response and target to their own average level within that range (not their peak), so correction is symmetric - bumps get tamed, dips get filled in - instead of only ever boosting, and it's no longer thrown off by a peak or dip outside the configured range: Strength now always has an immediate, visible effect the moment you move it. Correction Gain is kept, now as a plain, independent broadband offset on top of the Strength correction (default changed from 4 dB to 0 dB, since it's no longer compensating for anything) rather than the sole gain control. A new Use legacy FIR correction tuning toggle (Settings → General → Filter Processing, off by default) brings back the exact original two-field algorithm, project-wide, when needed.
Breaking Changes
- Magnitude correction filters may sound different after this update: the algorithm change above is not backward-compatible at the numeric level - a project's existing
Max. Attenuation/Correction Gainvalues are reinterpreted under the new Strength model rather than converted, since the two algorithms don't correspond via a simple formula. Check any correction filter you're relying on after upgrading (the FIR display mode, press F, shows the actual result) and re-tune Strength/Correction Gain as needed, or enable Use legacy FIR correction tuning (Settings → General → Filter Processing) to recover the exact previous behavior.
[1.4.5] - 2026-09-20
Added
- Predicted In-Room Response (PIR) curve: a new PIR curve (cherry red, dashed) on the sum's frequency graph, computed per the ANSI/CTA-2034-A ("CEA-2034") spinorama standard -
0.12·Listening Window + 0.44·Early Reflections + 0.44·Sound Power. Early Reflections and Sound Power are new too: Early Reflections averages the standard Floor/Ceiling/Front Wall/Side Wall/Rear Wall bounce angle sets. Together with the existing DI and Listening Window curves, LinFIR now produces a complete, standard-compliant spinorama directly comparable to third-party ones built to the same standard. Gated the same way as DI/Listening Window: valid license, off-axis data, and a new Show Predicted In-Room Response curve toggle (default on) - see below, it now lives in the Graphs dropdown. - Predicted In-Room as a correction/Auto-EQ reference: the global magnitude correction filter and global Auto EQ's Reference selector gain a third option, Predicted In-Room, alongside the existing On-axis and Listening Window. Falls back to On-axis when there isn't enough Early Reflections angle coverage, same as Listening Window falling back when there aren't enough polar angles.
- Directivity Index visibility toggle: DI previously had no way to be hidden - it now has its own toggle alongside the other magnitude overlays (see below).
- Directivity Sonogram: configurable frequency/angle range: the Sonogram tab gains Frequency (min/max Hz) and Angle (± degrees, symmetric around 0°) drag-values with a Reset button, on the same row as the existing Colormap range/Normalization controls - shared by both the Horizontal and Vertical heatmaps, same idea as the Spectrogram window's own frequency-range control. The Overlay Plot tab gains its own Frequency controls and Reset button too, kept independent per axis (Horizontal/Vertical), next to each plot's existing Angle range controls.
Changed
- Listening Window curve color: the LW curve is now a fixed royal blue, dashed line (was sharing the Sum curve's white/black), so it's distinguishable from Sum, DI, PIR and the per-driver curves at a glance.
- Sum curve always drawn on top: the Sum/Average curve now paints over any driver, DI, LW or PIR curve it overlaps, instead of whichever was drawn last winning by coincidence.
- LW/PIR/DI hover tooltip spells out the full name: hovering the curve on the frequency graph now shows "Listening Window" / "Predicted In-Room Response" / "Directivity Index" instead of the abbreviation - the legend itself stays compact ("LW"/"PIR"/"DI").
- Overlay toggles moved into the Graphs dropdown, and now save per project: Sum / Average, Listening Window, Predicted In-Room Response and Directivity Index visibility are no longer app-wide Settings toggles - they're now in the graph toolbar's Graphs dropdown, under a new Overlays section (separated from the existing graph-type toggles, now labelled Main plots, by a divider). Each project remembers its own choice, the same way it already does for which graph panels are shown. Sum/Average applies in both project modes (label follows the mode); Listening Window/PIR/DI stay Loudspeaker-Design-only and license-gated, as before. Settings → Graphs keeps a Default Overlays section (mirroring the existing Default Visibility one) to set what a new project starts with.
- Large projects load much faster: opening a project with a lot of measurement data (many drivers, many off-axis angles, distortion/harmonic data) is now several times quicker - the bigger the project, the bigger the difference. Project files created by this version are also somewhat smaller on disk.
- Dropped support for projects created before LinFIR 1.3.0: opening one now shows a clear "unsupported version" message instead of attempting a conversion. Open it with an older LinFIR version first and re-save to bring it forward.
- Saving is faster too: compressing a large project file on save now uses multiple CPU cores instead of one, on top of the smaller file size above. Quitting (or the auto-restart after an update) no longer re-saves a project that hasn't changed since it was last auto-saved.
Fixed
- Auto-save before switching projects wrote an uncompressed file: opening a different project (New Project / Load Project / Open Recent) with Auto-save enabled and unsaved changes silently saved the current one first, but as plain, uncompressed JSON instead of the normal compressed format - multiple times the size on disk, and not crash-safe (an interruption mid-write could leave a corrupted file) unlike every other save path. It now goes through the same compressed, crash-safe save as everything else.
[1.4.4] - 2026-09-14
Added
- Low signal-to-noise ratio: keep anyway instead of automatic rejection: a sweep measurement or an imported impulse response with a peak level below −25 dB used to be discarded automatically. It's now a confirmation dialog instead - an always-on-top popup that warns about the poor signal-to-noise ratio and offers Keep Anyway or Discard, so a marginal capture or import is no longer lost outright. Clipping still rejects immediately, unconditionally - that data is corrupted, not just noisy. An unattended auto-scan still aborts automatically on a low level rather than popping up a dialog nobody is there to answer. Settings → General → Measurement & Import Quality gains an Always keep low-SNR measurements toggle that skips the dialog and keeps low-level data silently from then on; its hover text is explicit that correction filter quality depends on measurement quality.
- One-click restart after an update: once an update finishes installing, the notification window (bottom-right corner) switches from Install to 🔄 Restart Now, which relaunches LinFIR with the update already applied and closes the current instance. No need to quit and reopen manually anymore.
- Soundcard calibration (Kirkeby correction): measurements can now be corrected for the audio interface's own response, not only the microphone's. Measure the interface once through an output-to-input loopback cable in Settings → Measurement Calibration → Soundcard, then select that calibration in a driver's IR window: every measurement angle of the driver - near-field / far-field spliced responses included - is corrected in magnitude and phase by a regularized Kirkeby inverse filter, removing the interface's phase rotation in the low bass and its roll-off near Nyquist. A calibration only corrects measurements captured at its own sample rate: calibrations measured at another rate are greyed out, and a warning is shown when the selected one doesn't match. Soundcard calibrations are embedded in project files like microphone calibrations, and a default can be set for new drivers.
Changed
- Settings: Measurement Calibration tab: Mic Calibration becomes Measurement Calibration, grouping the microphone and soundcard calibrations in one tab. A driver's IR window likewise selects both in a single Measurement Calibration section.
Fixed
- Harmonic distortion with a microphone calibration: the fundamental was calibration-corrected but its harmonics were not, skewing THD and the individual harmonic curves wherever the calibration isn't flat - and changing the calibration didn't update them. Each harmonic now gets the calibration at its own frequency, and the curves update when the calibration changes.
- Time-centered phase at another sample rate: the phase's time centering has been reworked so the small fractional delay left over no longer changes how the phase looks when the project sample rate changes - the same measurement now shows the same phase curve at 44.1, 48, 96 or 192 kHz, instead of a slope appearing above about 1 kHz.
- Distortion IR window: driver dropdown ignored custom names: it always showed "Driver N", never the name typed into the Driver IR window, unlike every other driver selector in the app. It now reads the same underlying name field, falling back to "Driver N" only when none is set.
- Distortion IR window: auto-fit didn't reactivate on a new project: opening a different project (or restarting the app, which reloads the last one) could leave the graph zoomed to the previous project's scale instead of re-fitting to the new data, matching what the Directivity Sonogram and Spectrogram windows already did.
[1.4.3] - 2026-09-11
Added
- Configurable frequency axis range: Settings → Graphs gains a Frequency Axis section with Min / Max frequency (Hz) fields (default 10 Hz – 24 kHz, with a Reset button) that now drive every frequency-axis graph - Magnitude, Phase, Group Delay, HD, the Directivity Sonogram (both the heatmap and its on-axis overlay plot), and the Spectrogram - instead of each hardcoding its own range. The existing Sync X-axis cross-graph linking, per-graph saved zoom, and double-click-to-reset all keep working unchanged; only the range they reset to is now configurable. Also fixes a pre-existing inconsistency where the Spectrogram privately floored at 5 Hz while every other graph floored at 10 Hz - they now all agree.
- Spectrogram: independent frequency range: the Spectrogram window gains its own Frequency drag-values (Min/Max Hz) with a Reset button that pulls in the current Settings → Graphs → Frequency Axis values. Unlike every other frequency-axis graph, once set it no longer tracks later Settings changes automatically - only that Reset button does.
- Spectrogram: manual time/period crop: the auto time crop (CQT/STFT/CSD, in ms) and Burst Decay's Periods control (which used to fight the auto crop instead of matching it) are now one mechanism: a new Crop control (ms), independent for each of CQT/STFT/CSD, and Periods for Burst Decay - all four auto-detected from where the decay clears Min dB until dragged, then pinned exactly where left (through any other change, including switching modes) until that mode's own Reset button brings it back to auto. Burst Decay now computes a generous ceiling internally while auto and reports back only the periods that actually carry signal, instead of showing a fixed 30-period window that could cut the decay short or leave most of the plot empty. The 3D waterfall now always shows the exact same crop as the 2D image - it used to run its own, independent (and occasionally wildly different) detection. The Crop/Periods controls now sit on their own row together with Frequency, separate from the transform/preset/processing-parameters row above them, and the crop's Reset button is its own - decoupled from that row's processing-parameters Reset, which no longer touches the crop at all, and only ever resets the mode currently on screen.
- Directivity Sonogram: view saved with the project: colormap range, normalization mode, active tab, and the Overlay Plot's angle ranges/normalize/auto-Y are now stored in the
.lnfand restored on reload, matching what the Spectrogram already did. Projects saved by an older LinFIR open at the app defaults. - Settings → Graphs: Reset buttons: every section now has its own Reset button, restoring just that section's settings to their app defaults - the same idea as the Frequency Axis section's existing one.
- Auto EQ: take a locked filter into account when generating new ones: a locked filter (driver or global Auto EQ) now has a second button next to the padlock - when turned on, that filter is applied to the response before Auto EQ designs new filters, so the new ones correctly build around it instead of overlapping or ignoring it. Off by default, per filter, so nothing changes until you turn it on.
- Update download progress: installing an available update now shows a progress bar instead of freezing the app until the download finishes - handy on a slower connection. The app stays fully responsive while it downloads.
Changed
- Resampling: the sample-rate conversion used when changing the project's working Fs (and when exporting IRs at a different Fs) has been rewritten as a self-contained, optimized implementation.
- FIR LP/HP: higher Kaiser β ceiling: the Kaiser β slider on the FIR Low-Pass and High-Pass filters now goes up to 500 (was 50), for users who need much gentler stopband attenuation than the old ceiling allowed.
Fixed
- IR Windowing: fade-in preview could fail to appear: with a Delay Compensation active, the transient window-envelope preview's fade-in could land at a negative on-graph time and silently not draw at all instead of showing the ramp at its correct (negative) position.
- Undo/Redo could reset a graph's zoom: undoing or redoing an unrelated change could silently snap a Magnitude/Phase/Group Delay/THD/Impulse/Step graph back to auto-fit, discarding a manual zoom or pan. Graph view state is no longer part of the undo history, matching how the Spectrogram's view already behaved.
- Undo/Redo: one step per keystroke when typing a value: typing a number into a field (rather than dragging it) created a separate undo step for every digit, so undoing one edit meant pressing Undo repeatedly. Typing now debounces into a single undo step per edit, the same way dragging already did.
- Magnitude/Phase/Group Delay: raw pre-filter preview could distort the auto-fit range: opening a driver's filter window shows its raw, pre-filter response as a dashed reference overlay - but that overlay's own range was being folded into the graph's auto-fit, which could shrink or shift the visible range away from the curves actually being worked on. The raw overlay no longer affects auto-fit.
[1.4.2] - 2026-09-09
Added
Spectrogram: detail setting — Settings → Graphs → Spectrogram detail picks the compute-grid size (Standard / High / Ultra). High (4096²) is the new default; the transform now runs on a finer grid than before.
Spectrogram: group-delay toggle — the grey group-delay comparison line can now be turned off.
Spectrogram: default lower bound setting — Settings → Graphs → Spectrogram now has its own lower-bound (Min dB) default, −30 dB, matching the sonogram's. It's what the window opens with and what its Reset button restores.
Spectrogram: CSD mode — Cumulative Spectral Decay: for a sweep of gate positions the impulse response from the gate to its end is FFT'd, showing the spectrum decaying over time in milliseconds. A Rise control sets the gate's leading-edge taper.
Spectrogram: Burst Decay mode — Morlet-wavelet burst decay on a period-based time axis: each frequency's decay is read in cycles rather than milliseconds, so equal-Q resonances look identical everywhere. Period 0 is auto-locked to the arrival peak. Controls: Bandwidth (1/3 – 1/24 octave), Freq res (12–96 points/octave), Periods, Pts/period.
Spectrogram: Reset button — a Reset at the end of the control bar returns every mode's processing parameters (Q, Rise, Periods…) to their defaults.
Spectrogram: 3D waterfall view — a 2D / 3D button renders the time–frequency grid as a shaded coloured perspective surface (same colormap and Min/Max dB as the 2D image), for all four transform modes. Left-drag rotates, right-drag pans, scroll zooms, double-click resets; the time, frequency and dB axes are labelled. Hovering the surface draws the time and frequency slices through the cursor with a value readout. A Show control switches between surface, surface + slice lines, and a slices-only line waterfall (slice count adjustable). The surface keeps narrow resonances and fast high-frequency detail that a plain average would have smoothed away.
Spectrogram: frequency smoothing — a Smooth dropdown averages the spectrogram across frequency in fractions of an octave (None to 1/3 octave, or ERB), independently of the main graph's smoothing. Applies to every transform and to both the 2D and 3D views; a free re-render.
Spectrogram: analysis parameters are undoable — Undo / Redo now covers the spectrogram's analysis controls (transform mode and its preset / window, CSD Rise, Burst-decay parameters, frequency smoothing). Pure view settings (colour range, Normalize, axis layout, 2D/3D, view angle) stay outside the history.
Room Calibration: export a measurement — the Impulse Response Management window now has an ⬇ Export button (next to Import / Measure) that saves the selected measurement as WAV or TXT, matching what Loudspeaker Design mode already offered per angle.
Changed
- Spectrogram: automatic time crop — the time axis is now cropped to the part that carries signal: leading and trailing time slices where every frequency is at or below the Min dB level are dropped. It reads the rendered spectrogram directly, so the plot edges sit exactly where the colour reaches the floor, and it follows Min dB and Normalize instantly. Raise Min dB (or use STFT) for a tighter view; the CQT's low-frequency smear keeps it wider.
- Spectrogram: view stays auto-fitted — after a double-click the plot keeps auto-fitting to the cropped image, so it re-frames itself when you change Min dB, the transform, or the axis layout, until you pan or zoom again.
- Spectrogram: view saved with the project — transform mode, resolution preset, normalization, group-delay toggle, axis layout and colormap range are stored in the
.lnfand restored on reload. Projects saved by an older LinFIR open at the app defaults. - Settings → Graphs — the Directivity Sonogram and Spectrogram options are now in separate sections.
Fixed
- Spectrogram: group-delay overlay drifted with smoothing — with smoothing active the grey group-delay line crept toward low frequencies as the smoothing widened. It is now smoothed symmetrically per octave and stays on the true frequency.
- Splicing wizard: mouse-wheel scroll panned the graphs instead of the page: scrolling while the cursor happened to be over one of the wizard's graphs panned that graph instead of scrolling the wizard's steps. The graphs no longer capture wheel/trackpad scroll; dragging still translates them as before.
- Off-axis harmonic distortion went blank, and off-axis recompute was slow: with the distortion graph visible, the background job that refreshes the off-axis responses (for the sonogram, directivity index and listening window) also re-ran the full harmonic-distortion analysis on every cycle - on data it couldn't process - and then overwrote the good distortion data with the empty result. That job now leaves distortion alone entirely: it is captured data the main view already computes once. Off-axis refreshes are also noticeably quicker. Separately, the windowed impulse response is no longer stored in the project file (it is rebuilt from the raw capture on load), so a project saved with an incomplete one can't carry that state back in, and project files are a little smaller.
[1.4.1] - 2026-09-06
Added
- Auto-align driver delays: a button below ➕ Add Driver sets every active driver's Time Delay so their post-filter phase curves cross at the middle of each crossover overlap (the band where both drivers are within −20 dB of their own maximum). A driver that shares no band with the rest is left alone.
- Reorder drivers / measurements: each driver's action bar gains ⬆ / ⬇ buttons (between paste and the remove button, which is now set slightly apart to avoid mis-clicks) that move it up or down. The new order applies everywhere — parameter list, graphs and legends, directivity index, and exports. The same buttons reorder measurement positions in Room Calibration mode.
- Directivity sonogram: clipping highlight: levels that rise above the colormap maximum (which per-band normalization can produce) now show in off-white instead of saturating to the same red as the loudest in-range energy, so it is obvious where the response goes over the reference level. It can be turned off in Settings → Graphs.
- Directivity sonogram: default normalization: Settings → Graphs now has a Sonogram normalization setting that picks which normalization mode the sonogram opens with. It can still be changed per-session from the sonogram's own toolbar.
- Spectrogram: default axis orientation: Settings → Graphs now has a Spectrogram axes setting choosing whether the spectrogram opens with time on X (default) or frequency on X. The toolbar button still swaps it per-session.
- Splicing wizard: automatic level match: the Far-field window & predicted level step gains a Match level to far-field button next to the manual level offset. It shifts the predicted near-field curve onto the windowed far-field measurement across the valid blend range, using the median of the per-bin level difference so a diffraction ripple or a narrow notch near a band edge does not throw it off.
- Splicing wizard: automatic phase match: the Transition & blend step gains a Match phase button next to the near-field time offset. It smooths the predicted and far-field phase curves, then sets the offset to the delay that makes them cross at the middle of the transition band (where the blend is 50/50), leaving only a residual slope or a whole-turn wrap to sort out by hand.
Changed
- Settings → Graphs: the directivity-sonogram and spectrogram options moved out of "Magnitude Plot Bounds" into their own "Directivity Sonogram & Spectrogram" section. The General and Graphs settings documentation has been rewritten to match the actual tab layout and default values.
- Spectrogram: delay compensation: the spectrogram time axis and its grey group-delay overlay are now shifted by Delay Compensation, the same as the Phase and Group Delay graphs, so the acoustic arrival sits at t ≈ 0 and the views agree.
Fixed
- Aberrant driver phase / group delay with very long FIR filters: a driver whose filter chain included a very long FIR could show a rising phase and a negative group delay, even though the system sum stayed correct. The driver response is now computed the same way as the sum.
- Subtle phase rotation from delay compensation: enabling mic-distance delay compensation tilted the displayed phase slightly more than it should. Part of the cause was shared with the long-FIR fix above; the remainder, visible in time-centred and unwrapped phase views, was the compensation being rounded to a whole sample on the display side while applied exactly everywhere else. It is now applied consistently.
[1.4.0] - 2026-09-05
Added
- Near-field / far-field splicing wizard (license required): a new seven-step wizard that builds a full-range anechoic response for a driver by combining near-field captures of each radiating element (driver, vent, passive radiator) with its existing far-field polar measurements — the Don Keele method. The near-field captures cover the bass, where an indoor gated measurement can't reach; the far-field measurements keep their real directivity and diffraction above the transition. The wizard models the enclosure (box or sphere, baffle edge treatment, per-element positions on any face), predicts each element's directivity and edge diffraction per angle with a Distributed Edge Dipole model, level-matches the elements from their Sd and mic distance, guards against room reflections with the image-source method, and blends the two responses in a physics-bounded transition band with a magnitude and phase preview. Once applied, the spliced impulse response replaces the raw capture for every measured angle throughout the app (response, DI, sonogram, export), and newly captured angles are spliced automatically. Reached from IR Management → Near-field measurements (splicing); see the documentation for a step-by-step guide.
- Unsaved-work protection: closing LinFIR with unsaved changes now asks whether to save first. If a brand-new project that was never saved to disk is closed, it is offered back for recovery the next time you open the app.
- Configurable sweep End Frequency: the sweep's upper limit can now be set in the IR Management window and the splicing wizard (defaults in Audio Settings, with a Reset button), instead of always being fixed just below Nyquist. The sweep stays flat at full amplitude up to the End Frequency then fades out over at most an octave. Lower it to stop the sweep below a loud cone-breakup resonance: previously such a resonance forced you to drop the sweep level to avoid clipping, sacrificing the signal-to-noise ratio of the band that matters. Harmonic distortion is still captured at full bandwidth — the deconvolution filter keeps its full range, so a harmonic landing above the End Frequency is not truncated. "Auto" keeps the previous behaviour exactly.
- Spectrogram: dB in the hover tooltip and a group delay overlay: hovering the spectrogram now shows the exact level in dB at the cursor alongside time and frequency, using the same reference as the colour map (global or per-band). A thin grey line also traces the group delay across frequency directly on top of the colour map — the same curve as the main Group Delay graph (same Smoothing setting), just not shifted by Delay Compensation — making it easy to check whether a resonance or smear in the spectrogram corresponds to a group-delay bump at the same frequency. The tooltip labels this reading explicitly ("Group Delay: … ms") and only shows it when the cursor is actually hooking the grey line.
- Spectrogram: selectable STFT window shape: in STFT mode a new Shape control chooses the analysis window — Rectangular, Hann, Hamming, Blackman-Harris, Tukey, or Gaussian — to trade time localisation against spectral leakage. Gaussian (the previous fixed behaviour) stays the default. The transform is also now picked from a dropdown instead of separate buttons.
Fixed
- Interface freezing on projects with many off-axis measurements: editing any parameter (gain, delay, filters, target curve...) no longer freezes the interface on every change. The off-axis and directivity calculations now run in the background without copying the measurement data each time.
- Directivity sonogram not keeping up with edits: the sonogram now updates in place as you change parameters. It no longer updated only the on-axis response, and it no longer closed and reopened itself - jumping back to the center of the screen - on every change.
- Saved session could fail to reload: on large projects the file holding the application state could grow very large and then fail to load on startup, silently opening LinFIR with an empty project and forgetting the last-opened project. That state is now kept small and the previous project reloads reliably.
- Crash during impulse response capture: the distortion-zone calculation used during IR capture could underflow and crash the app when the main (H1) peak was close to the start of the recorded buffer (e.g. a short sweep or a small manual offset).
- "Missing measurement" warning on every angle change: selecting an off-axis angle where a driver has no measurement no longer raises a persistent warning toast. Browsing angles a driver was only measured on fewer axes is normal — its curve simply doesn't appear.
- IR window Start / Stop crossing: setting the window start and stop within a taper of each other (e.g. 4.0 ms and 4.2 ms) used to make the fade-in and fade-out overlap and produce a malformed window. The window is now the product of the fade-in and fade-out envelopes, so overlapping edges compose into a smooth sub-unity bump — in both the applied window and the on-graph preview, simple and adaptive alike. Start and Stop are fully independent again: editing one no longer moves the other, which also fixes the value jumping while you typed a number into either field (including in the splicing wizard).
- Raw phase overlay misaligned from the filtered curve: with "Remove time of flight rotations" on, the dashed raw (pre-filter) phase curve shown while a driver's filter window is open could sit a large linear trend or a full 360° turn away from the filtered curve it is meant to overlay. Two causes: (1) for a driver with only IIR filtering (no LP/HP/correction FIR) the raw curve was compensated for an FIR-chain delay its filtered response never carries; (2) the raw curve was given its own independently-rounded N×360° offset instead of the shared one. The raw phase now gets exactly the same time-of-flight removal and DC alignment as the filtered phase.
- Global phase correction ignored the global magnitude correction: unlike the per-driver FIR correction, the global FIR's phase correction was designed from the summed response before the global magnitude correction FIR, so it did not linearise the excess phase a minimum-phase (Causality > 0) global magnitude correction introduces. The global phase correction now runs on the magnitude-corrected response, mirroring the per-driver behaviour; the fusion padding is also sized for the real magnitude-FIR causality.
- IR window fade-in applied even at Start = 0: Start = 0 means "keep the measurement from its very first sample" — nothing is being truncated there, so there is nothing to smooth. The window nonetheless faded the first 0.5 ms in from silence. The window (and its on-graph preview, simple and adaptive alike) now opens at full amplitude immediately when Start = 0. The Stop side needed no equivalent fix: it is already a no-op once Stop reaches the measurement's own duration.
Improved
- IR window preview: the transient overlay shown while editing a driver's time window now also draws that measurement's raw, un-windowed impulse response on the Impulse Response graph, as a dashed line in the same colour as the driver's curve. Placed with the same time shift as the processed curve underneath and fading out with the red envelope, it lets you see directly what the window keeps and what it removes. A new Show window button in the IR Windowing section brings the whole overlay up at any time without changing a setting. The documentation now also explains why the overlay's start/stop do not sit at the entered values once the driver has filters or a time delay (the window times are relative to the raw IR; the graph shows the processed, delayed signal).
- Why the window preview doesn't line up with Start/Stop: hovering Start or Stop in the IR Windowing section now shows exactly where that value shows up on the Impulse/Step Response graphs and why, broken down by FIR delay / Time Delay / Delay Compensation. Whenever the two positions actually differ, a new On Graph row appears right under Window Duration with both shifted values at a glance (e.g.
2.00 ➡ 12.00 ms). Start/Stop themselves are untouched — they stay defined on the raw measurement, this only translates where they currently land. - Auto-save: no longer causes a brief periodic hitch while you are only viewing a project without editing it.
- Undo / Redo: the undo history now keeps the last 50 steps (was 10). Each step is stored as parameters plus shared references to the measurement data rather than a full copy, so the deeper history still uses only a few MB even on a large project.
[1.3.14] - 2026-08-28
Added
- Rotation table position dial during auto-scan: the driver IR window now shows the same angular position dial as Settings -> Rotation Table (graphical only, no controls) above the measurement buttons, visible while an auto-scan is running.
- Auto-scan end-of-scan behavior: whenever an auto-scan ends - whether it completes, is stopped, or is aborted due to a rejected capture - the rotation table is now sent back to 0°. For Pololu Tic controllers, the motor is also energized automatically at the start of the scan if it wasn't already. A new De-energize motor after auto-scan toggle (Settings -> Rotation Table, off by default) de-energizes the motor once it's confirmed to have settled back at 0°.
Improved
- Adaptive IR windowing: the adaptive window's stop-side fade-out now scales its taper duration with each frequency band's own wavelength, instead of using a fixed duration for every band. This avoids artifacts from cutting off low-frequency content mid-cycle.
- This changes the exact shape of the adaptive window's fade-out compared to earlier versions, so results computed with it (especially the low-frequency end of the response) may shift slightly for projects created with older versions of LinFIR. Re-check the bass estimation on existing projects using adaptive windowing if this matters for your work.
- Driver IR window layout: the growing list of already-captured off-axis measurements ("Measurements") is now shown below the measurement controls ("Measurement Controls": axis selector, angle field, position dial, Import/Measure/Scan/Stop buttons, capture progress) instead of above them, so those controls no longer get pushed further down - and out of view - as more angles are captured.
Fixed
- Undo/auto-save snapshots while dragging: dragging a value in an IIR (global or per-driver), target curve, or FIR correction window no longer triggers extra undo-history/auto-save snapshots mid-drag when another such window happens to be open at the same time.
- Directivity Analysis overlay plot: the overlay plot's curves no longer get truncated at the bottom by the sonogram colorbar's lower bound setting. They now use the "Drivers range" setting (Settings -> Graphs) instead, which isn't clamped to a heatmap-friendly dynamic range.
- Auto-scan not stopping on a rejected capture: if a measurement was rejected during an auto-scan (clipping, signal too low, or h1/h2 harmonic contamination), the scan no longer silently continued as if it had succeeded - it now properly aborts with an error, since the underlying problem would likely affect every remaining angle the same way.
[1.3.13] - 2026-08-27
Added
- Native file opening on macOS: double-clicking a
.lnfproject file in Finder (or using "Open With") now opens it directly in LinFIR - including reusing an already-running instance of the app. - Release notes in the documentation: the full changelog is now available as a "Release Notes" page in the documentation (Help -> Release notes), always in sync with the latest version.
Improved
- UI library: updated to the latest version for overall stability and appearance improvements.
- Update notification: after updating, LinFIR now shows a small, dismissible "See what's new" prompt instead of automatically opening a large release notes window.
[1.3.12] - 2026-08-25
Fixed
- Audio crackling on Windows (ASIO): boosted the priority of ASIO audio threads to reduce crackling that could occasionally occur during measurements.
Improved
- Audio library: updated to the latest version for overall stability improvements.
[1.3.11] - 2026-08-23
Added
- IR window envelope preview: adjusting IR windowing (start/stop time, drag, Auto Set Window, Reset Window, or toggling Adaptive Window) now briefly overlays the window's shape in red on the Impulse Response and Step Response graphs, scaled to the curve's own peak. The overlay stays visible for 3 seconds after the last change, then fades out over 2 seconds. With Adaptive Window enabled, it shows a gradient of fade-out curves - one per frequency band, darkest (and drawn on top) for the highest frequencies.
- Verbose logging setting: a new toggle in Settings -> General -> Diagnostics raises the application log to
debugdetail on demand, without restarting or a command line. Enable it when asked to, reproduce the issue, then use Help -> Report a Bug to send the log.
Improved
- Maximum number of drivers: increased from 10 to 50 per project.
- Documentation: clarified what the magnitude correction filter's Correction Gain does - a single, uniform gain applied within the configured frequency range to compensate for the level loss introduced by the from-the-top equalization - and how to inspect the filter's final response (gain included) in the graph bar's FIR tab to avoid excessive gain on a given band.
- Log verbosity: routine tracing that used to fire continuously while dragging any parameter (LinFIR recomputes filters live), and audio ring-buffer overflow warnings that could log on every callback during an overrun, are now much quieter by default - the log file stays focused on events that matter. Full detail remains available via the new Verbose logging setting.
Fixed
- ASIO capture failures (
loadDriverreturned false): the automatic device hotplug detection added in 1.3.8 could race against a capture that was starting at the same time - both tried to load the ASIO driver concurrently, and ASIO only allows one loaded driver at a time. The hotplug check now defers to an in-progress capture instead of racing it. - Undo/redo debounce with multiple driver/measurement windows open: dragging a value no longer records one undo step per intermediate value when a second driver or measurement window is open at the same time.
[1.3.10] - 2026-07-28
Improved
- Airplay / wireless device support: automatic detection of Airplay, HomePod, Sonos, and similar streaming devices; adjusts timing constants (extended pre-silence, post-silence, and chirp detection delay) to compensate for network latency
- Deconvolution noise reduction: minor improvements to limit deconvolution noise and artifacts via smooth tapering at the beginning and end of the averaged recording.
Added
- h2/h1 contamination guards: measurements are now rejected when the second harmonic (h2) falls inside the h1 zone (reduce Manual offset) or when h1 arrives before the truncation point (increase Manual offset or check acoustic distances). A permanent toast notifies the user with guidance for each case.
[1.3.9] - 2026-07-22
Improved
- Spectrogram image quality and performance: the spectrogram now uses bilinear interpolation for smoother, higher-quality rendering, and has been optimised with parallel processing for faster display updates.
- Directivity sonogram normalization: added a new "Normalize to ±10° avg (per freq)" mode that normalises each frequency column to the average magnitude between −10° and +10°, providing a more robust reference than the single 0° point when narrow on-axis peaks or dips are present. A 20 kHz cap on normalization references now applies to the Global max. and Normalize to 0° modes, preventing tweeter ultrasonic resonances from skewing the colour scale.
[1.3.8] - 2026-07-21
Added
- Audio device hotplug detection: the audio settings page now automatically detects when speakers or microphones are connected or disconnected, and refreshes the device list without requiring a manual click.
- Directivity Sonogram (-6 dB curves): thin grey reference lines now appear on the sonogram plots, marking the -6 dB beamwidth curves. A matching grey mark also appears on the colour bar for quick level reference.
- Sonogram Normalization dropdown: three normalization modes control how sonogram magnitudes are mapped to dB — Global max. (single reference from the strongest data point), Normalize to 0° (single reference from the strongest on-axis measurement across all frequencies), and Normalize to 0° (per freq) (each frequency column normalised to its own 0° value, revealing per-band directivity patterns).
Improved
- Plot axes: grid spacers and tick formatters replaced with dynamic frequency formatting — axes now show meaningful labels at every zoom level
- Documentation: faster fallback when online documentation is not available
- Audio library: updated to the latest version for overall stability improvements
- Harmonic distortion windowing: replaced fixed 5% tapers with an adaptive windowing algorithm for individual harmonic slices. The analysis now dynamically strips background noise before and after each impulse peak while automatically preserving long distortion tails, ensuring cleaner measurements without cutting off legitimate decay.
[1.3.7] - 2026-07-13
Added
- Rotation Table (Pololu Tic): new Go to 0°, Energize, and De-energize buttons in Settings -> Rotation Table
Improved
- Harmonic distortion: recomputing THD after a windowing or delay-compensation change is now much faster — the expensive per-harmonic spectra (H2-Hn) are cached and only recomputed after a new capture or a sample-rate change, instead of on every window adjustment
Fixed
- Rotation Table auto-scan: fixed a hang after the table's first move when the Settings window was closed — the table position is now refreshed every frame regardless of which window is open
[1.3.6] - 2026-07-09
Fixed
- macOS/Windows crash at launch:
libusbis now compiled statically into the binary (rusbvendored feature); the app no longer depends on an externallibusb-1.0.0.dylibfrom Homebrew and will launch correctly on machines where Homebrew is not installed
[1.3.5] - 2026-07-08
Added
- Rotation Table support: connect and control a motorized turntable directly from LinFIR — supported controllers are Pololu Tic (T500, T834, T825, T249, 36v4, detected automatically via USB) and GRBL-based boards (Arduino, e.g. Audiomatica Medusa, connected via serial); the new Settings -> Rotation Table tab provides a live position dial, manual jog controls, and a zero-point reset button
- Auto-scan (requires a valid license): in the IR Management window, a ▶ Scan button drives the rotation table through a configurable angle range (min, max, step) and captures an impulse response at each position automatically — already-measured angles are skipped; a 30-second per-angle timeout guards against mechanical failures
- New C array export format options (f32 and f64) for FIR filters
Improved
- Documentation: the documentation printing experience is now fully supported — text is black on white, images use the light theme variant, and all UI chrome is hidden for a clean printout
- UI library updated to the latest version, bringing general bug fixes and stability improvements; note: a multi-monitor window positioning issue may still occur on Windows
[1.3.4] - 2026-06-08
Improved
- Harmonic distortion extraction: the HD slices are now cut at the minimum of the smoothed Hilbert envelope between each pair of adjacent theoretical peaks, maximising separation between harmonics
- Harmonic distortion windowing: replaced the h1-synchronised window with an independent automatic windowing; this is more robust for harmonics whose impulse response spreads significantly further in time than h1
[1.3.3] - 2026-06-07
Added
- Distortion IR window (shortcut J, View menu, requires a valid license): visualises the time-domain harmonic impulse responses H2..H5 extracted by the Farina ESS method; each curve is the same windowed slice used to compute the THD spectrum so the display is fully consistent with the distortion graphs; per-harmonic visibility toggles, independent per-harmonic normalisation, zoom/pan with double-click reset; the displayed angle follows the global angle selector
Improved
- Spectrogram: the window now follows the global angle selector — when a non-zero angle is selected the spectrogram shows the predicted sum IR for that angle (same data as the impulse graph in Drivers mode); the window title and in-window header update accordingly; on-axis behaviour is unchanged
Fixed
- THD formula corrected: harmonic distortion (total and individual) is now normalised by the fundamental level (H1) in accordance with the standard THD definition —
THD = √(H2² + H3² + H4² + …) / H1; previously the denominator was the total RMS signal (fundamental + harmonics), which capped the displayed value at 100% and caused the curves to underestimate distortion at high harmonic levels (below resonance or at high SPL); values above 100% (0 dB in relative mode) are now correctly displayed - Harmonic distortion windowing: H2–H5 are now windowed using the start and stop boundaries configured for H1 in Time Windowing, improving SNR and eliminating room echoes from the harmonic distortion estimates
[1.3.2] - 2026-04-29
Added
- Spectrogram window (shortcut W, requires a valid license): time-frequency colour map of the predicted on-axis sum IR (Loudspeaker) or averaged IR (Room Calibration); choose between CQT (Morlet filter bank, constant-Q) and STFT (Hann window); adjustable resolution preset, colormap dB range, and axis swap (time ↔ frequency)
- Directivity Analysis: new Overlay Plot tab showing all off-axis frequency response curves superimposed, one rainbow-coloured line per angle, with angle/frequency/magnitude tooltip on hover
- Directivity Analysis — Overlay Plot: angle range filter (All / ≥ 0° / ≤ 0° presets + drag-value min/max), defaults to 0°–180°
- Directivity Analysis — Overlay Plot: Normalize to 0° toggle — divides each curve by the on-axis response to display relative deviation
- Directivity Analysis — Sonogram: Colormap dB range controls — drag min/max dB values to saturate the colour scale and reveal low-amplitude detail; a Reset button restores the defaults
Improved
- Directivity Analysis: renamed from "Directivity Sonogram" to "Directivity Analysis"
[1.3.1] - 2026-04-19
Added
- Frequency graph (Drivers mode): the IIR Auto EQ target curve is now displayed as an overlay on the frequency response graph when the IIR window is in the foreground and the Auto EQ tab is selected; the overlay is automatically hidden when the window is sent to the background
Improved
- Auto EQ: improved filter initialization: filters are now placed using a score that trades off residual magnitude against proximity to already-placed filters, preventing wide low-Q filters from masking the residual error they leave behind and causing subsequent filters to be initialized in the wrong place
- Auto EQ (driver and global): Q Min and Q Max now use adaptive bounds: increasing Q Min automatically pushes Q Max up if needed (up to 20), and decreasing Q Max pulls Q Min down if needed (down to 0.1), so the two values can no longer cross; both parameters now share the full 0.1–20 range
Fixed
- HFD example in the documentation: the Tweeter was mapped to channel 1 which is inconsistent with Hypex plate amplifiers
[1.3.0] - 2026-04-15
Improved
- Auto EQ: improved algorithm to better respect the configured gain limits and boost cap
- Adaptive Window: upgraded internal wavelet transform from CDF 5/3 — the biorthogonal wavelet now used is CDF 9/7, which provides ~40 dB of stopband attenuation versus ~18 dB for CDF 5/3; this significantly reduces spectral leakage between frequency bands before temporal masking is applied, eliminating the frequency ripples that could let high-frequency echoes bleed through the window boundary
- UI framework updated to the latest version
- Documentation: microphone calibration phase column clarified — files with a third phase column are accepted but ignored; phase is reconstructed from magnitude via Hilbert transform, which is more robust given measurement microphones' predominantly minimum-phase behavior
- Documentation: buffer size guidance corrected — buffer latency is compensated internally; the only criterion is avoiding underruns
- HFD export: the patch/create mode is now a dropdown (Create from template / Patch existing Config.xml) instead of a toggle button, making the choice more explicit
- HFD export: the channel mapping panel now uses the term "Channel" instead of "Group"; the description clarifies that each channel receives the FIR filters, IIR filters, gain, delay, and polarity of the assigned LinFIR driver; by default, drivers are assigned to channels sequentially (driver 1 -> channel 1, driver 2 -> channel 2, …); if there are more channels than drivers, the last driver is repeated for the remaining channels
- HFD export: the output directory field is removed; clicking Apply mapping and export in Create from template mode now opens a Save As dialog (pre-filled with
Config.xml); in Patch mode the selected file is overwritten directly, with no extra dialog - HFD export: a confirmation message is displayed after a successful export, showing the path of the written file
- Documentation: HFD section updated to clarify that the exported file is Config.xml, the native project format opened by Hypex Filter Design software
- Settings: Adaptive Crossover Smoothing moved from Settings -> General -> Default Values to Settings -> Graphs -> Display — it controls graph rendering for the current project and is not a new-project default value; documentation updated accordingly
- Graphs: "Adaptive Crossover Smoothing" renamed to "Steep Crossover Smoothing" — smoothing reduction is now proportional to the filter slope; no effect below 12 dB/oct (LR2), full reduction at 36 dB/oct (LR6+), proportional in between
- UI: boolean options have been replaced by an iOS-style toggle switch throughout the application for improved readability
Added
- Two new IIR filter types: Asym Low Shelf and Asym High Shelf, available in per-driver IIR filters and global IIR filters; both expose F1/Q1 (zeros) and F2/Q2 (poles) parameters; the High Shelf variant is normalised so that the DC gain is always 0 dB
- HFD export: driver alignment delays are now validated against the 19.2 ms hardware limit; an error is shown if any driver exceeds this value, preventing a silent export with incorrect timing
- HFD export: first-order high-pass and low-pass filters (Butterworth order 1) are now exported as
ftHighPass1/ftLowPass1instead of the second-order variant; odd-order filters (e.g. Butterworth order 3) correctly export the first-order section asftHighPass1/ftLowPass1and the remaining second-order sections asftHighPass2/ftLowPass2 - Auto EQ: new Auto-generate toggle in the IIR Auto EQ tab (per-driver and global) — when enabled, filters are automatically re-generated whenever any parameter in the Auto EQ tab changes; requires a valid license
- Sync X-axis: the button is now active by default for all new projects
- Settings -> General -> Default Values for New Projects: new "Sync X-axis" option to configure whether X-axis synchronisation is enabled or disabled by default for new projects
- IR Management window: each measurement in the angle list now shows an ℹ icon; hovering it displays the measurement source (measured with LinFIR or imported), sweep parameters (frequency range, duration, level, averages), and IR length
- Frequency, phase, and group delay graphs (Drivers mode): a dashed pre-filter overlay is now available for each driver and for the sum (requires a valid license); the overlay shows the unfiltered speaker response and group delay/phase when the corresponding filter window (LP, HP, correction FIR, IIR, or global filters) is open; toggled in Settings -> Graphs -> Response Overlays
Fixed
- HFD export: Bessel filters of order 1 are not supported by the HFD hardware; the export now raises an error if such a filter is detected on any driver; in FusionAmp mode the per-driver IIR filter UI enforces a minimum order of 2 for Bessel filters, preventing the configuration of an unsupported filter
- Frequency graphs (IIR Filters, FIR Filters, FIR+IIR Filters modes): the Y-axis lower bound no longer drops to the configured limit (~−100 dB) when only EQ-type filters are active (PEQ, shelves, all-pass, Asym Low/High Shelf); the deep lower bound is now applied only when at least one true high-pass or low-pass filter is present in the relevant filter set
- Frequency graph (Drivers mode): Listening Window curve is no longer displayed when only a single driver is active and no global filters are applied — it now follows the same visibility rules as the Sum curve (requires multiple drivers with IR data, or at least one driver with active global filters)
- About window (Windows): clicking "Read terms in browser" or "Open in browser" no longer causes a black console window to flash
- Directivity Sonogram: the sonogram no longer remains visible after measurements have been cleared — the cached images are now properly discarded when the async computation returns no data
- IR Management window (Hypex FusionAmp mode): the off-axis section (axis selector, angle list, measurement angle input, Export All) was missing — it now appears identically to Loudspeaker Design mode
- Phase graph (Drivers mode, off-axis angles): in time-centered phase and unwrapped mode, the linear phase reference was incorrectly taken from the on-axis sum instead of the sum at the selected angle; individual driver curves and the sum could appear misaligned when viewing off-axis measurements
- Phase graph (Drivers mode, unwrapped): individual driver curves could be offset by a multiple of 360° relative to the sum when steep high-pass crossover filters were active; the DC alignment now only uses in-band frequencies (within each driver's passband) to avoid corruption by the out-of-band phase ramp introduced by the crossover
- IIR filters: setting a Bessel filter order to 0 via keyboard arrows caused a crash; the filter design now returns a pass-through (no filtering) for order 0
[1.2.21] - 2026-03-25
Fixed
- License activation: fixed a crash with "Invalid response: Failed to parse validation response: expected value at line 1 column 1" — the HTTP status was not checked before parsing the API response body; any non-success response (Cloudflare challenge, rate limiting, transient server error) now returns a clear error message instead of a JSON parse failure
- macOS full-screen: secondary windows (filters, IR management, etc.) no longer open as a tab inside the full-screen space — they now float above the main window as expected; this also fixes the black empty space that appeared when a resizable window was opened in full-screen mode
Added
- Several windows whose content is variable in length are now resizable
Added
- Frequency graph (Speakers mode): Listening Window curve (requires valid license)
- Displayed alongside the Directivity Index when off-axis measurements are available
- Defined as the spatial average of all measurement angles within ±30° horizontal and ±10° vertical (inclusive)
- Shown only when at least 2 qualifying angles are available to average
- Global FIR magnitude correction and global Auto EQ: new "Reference" option (requires valid license)
- Choose between On-axis (default) and Listening Window as the magnitude reference for correction
- When set to Listening Window, the correction targets the spatial average of ±30°H / ±10°V angles instead of the on-axis response
- Falls back to on-axis automatically if fewer than 2 qualifying angles are available
[1.2.20] - 2026-03-18
Fixed
- ASIO (Windows): measurements no longer abort with a spurious "timing reference signal too weak" warning despite the signal being correctly configured — note that ASIO stream startup can take significantly longer than on other platforms; this delay is now properly accounted for before any signal level check is performed
- Hypex mode: several features that were incorrectly restricted to Loudspeaker Design mode now work as expected — affected areas include phase display options, per-driver filter curve views, and the detailed report export
- Phase graph: auto-bounds vertical axis now enforces a minimum range of ±1° around the data centre, preventing near-flat phase curves (e.g. a Dirac) from zooming into numerical noise
- Phase / group delay graphs: toggling visibility via keyboard shortcuts (G / P) no longer leaves the graphs empty
[1.2.19] - 2026-03-12
Fixed
- Hypex mode: the directivity sonogram window is now accessible
- Hypex mode: exporting FIR coefficients now works correctly
[1.2.18] - 2026-03-10
Added
- Phase correction FIR: auto-correction guard for magnitude artifacts
- LinFIR automatically iterates f_min and f_max in 1/3-octave steps (up to 100 iterations, f_min ceiling 15 kHz, f_max ceiling 18 kHz) until the FIR magnitude deviation falls within the per-filter tolerance
- Guard Tolerance parameter added to each phase correction filter (driver and global): 0.1–15 dB, default 0.5 dB
- A warning toast is shown only when the guard fails (exhausts all iterations without converging); warnings can be disabled in General Settings -> "Warn when phase FIR guard fails"
Improved
- Phase and group delay graphs: auto-bounds for the vertical axis now ignore data above 20 kHz, preventing ultrasonic content from distorting the scale
- Phase graph: auto-bounds no longer force the 0° value to be visible; the axis now fits tightly to the actual data range (± 10% margin)
- Graph toolbar: graph type toggles, time domain options, and phase options are now grouped into three dropdowns ("Graphs", "Time Domain", "Phase Options"), reducing clutter in the toolbar; dropdowns stay open when toggling checkboxes inside them
- Software update notification moved from the toolbar to a persistent floating card anchored to the bottom-right corner, with a dismiss button and an Install button; after a successful update a permanent closable toast confirms the installation
[1.2.17] - 2026-03-06
Added
- Hypex FusionAmp project modes with hardware-specific constraints (requires valid license)
- Sample rate locked at 93.75 kHz for all FusionAmp modes
- Fixed driver count matching hardware specifications (cannot add/remove drivers)
- Two FIR processing modes:
- FIR IN: Global FIR correction at DSP input (4500 taps maximum including padding)
- FIR OUT: Per-driver or global FIR at DSP output (1500 taps maximum per driver including padding)
- IIR filter constraints: 15 biquads maximum per channel
- Real-time biquad counter with color-coded warnings in IIR filter UI
- Filter types and orders dynamically limited to prevent exceeding biquad capacity
- Phase correction FIR magnitude artifact detection (per-driver and global)
- After computing the phase correction FIR, LinFIR evaluates its magnitude response and warns if any bin deviates by more than 0.5 dB from 0 dBFS
- A phase-only filter should leave magnitude unchanged; deviations indicate a filter design problem
- Warning toast is shown with actionable advice: reduce Kaiser beta, increase tap count, or raise the minimum correction frequency
- Disableable in General Settings
- Target curve import/export (all target curve windows: per-driver FIR, per-driver Auto EQ, global FIR, global Auto EQ)
- Import: loads control points from a plain-text file (two columns: frequency Hz, gain dB; separator: tab, space or comma; comment lines starting with # are ignored; minimum 2 valid points required; points are sorted by frequency on import)
- Export: saves current control points to a plain-text file with a two-column tab-separated format and commented header
- Microphone calibration plot preview: each calibration file in Settings -> Mic Calibration now has a Plot button that opens a dedicated window showing its frequency response on a log-frequency axis
Improved
- All secondary windows (filter windows, IR windows, export dialogs, HFD window, FRD converters, detached graphs…) are now automatically closed when loading or creating a project, preventing stale windows from a previous session from cluttering the workspace; the Settings window is additionally closed on application startup
- Clipping detection test signal replaced by a deterministic periodic pink-noise buffer
- New signal: frequency-domain pink noise (−3 dB/octave ASD), generated once per sample rate at startup and cached in memory
- Schroeder initial phases + Newman/CFR iterative crest-factor reduction
- Band-shaped: 12 dB/oct high-pass at 20 Hz, 24 dB/oct low-pass at 20 kHz
- RMS = −18 dBFS, peak ≤ 0 dBFS (crest factor ≈ 12 dB — representative of real programme material)
- Documentation: added warning against using phase correction with non-anechoic measurements in both driver-processing and system-processing sections
Fixed
- Multi-average capture: input gain compensation is now applied in the audio callback instead of post-capture, so level validation (signal-too-weak check on timing reference) correctly sees the compensated signal
- Multi-average capture: sweep segments are now aligned with GCC-PHAT before averaging, using their individual deconvolutions as alignment references; removes the naive arithmetic average that could blur transients in the presence of inter-sweep timing jitter
- Audio Settings: switching to an input device that doesn't support the current sample rate now automatically selects the closest supported rate and shows an info toast; previously the sweep was generated at the old rate while the device ran at its own rate
- Documentation: breadcrumb bar hiding the search panel
- macOS: project files (.lnf) hidden in Finder after save
[1.2.16] - 2026-02-19
Added
- Driver copy/paste parameters
- Copy button on each driver copies all its parameters to a clipboard (IRs and driver name are excluded)
- Paste button applies the copied parameters to any other driver, preserving the target driver's IRs and name
- Paste button is grayed out when the clipboard is empty
- Useful for quickly duplicating filter settings, crossover configuration, or DSP parameters across drivers
- Default crossover frequencies applied when adding a new driver
- Driver 1: HP=1 Hz, LP=110 Hz (subwoofer)
- Driver 2: HP=110 Hz, LP=600 Hz (bass/low-mid)
- Driver 3: HP=600 Hz, LP=3000 Hz (midrange)
- Driver 4+: HP=3000 Hz, LP=21000 Hz (tweeter)
- Automatic measurement cancellation on signal problems
- Clipping on main channel: measurement stops immediately when any input sample hits digital full scale, without waiting for sweep completion
- Clipping on timing reference channel (Electric and Acoustic): measurement stops if the chirp clips on the reference input channel
- Timing reference too weak: if the peak on the timing reference channel never exceeded −25 dBFS during the chirp window, the sweep is cancelled before it begins (Electric and Acoustic modes, regardless of number of averages); toast reports the measured level
- Low signal on first sweep (multi-average only, ≥ 2 averages): if the peak input level never exceeded −25 dBFS on the first sweep, the measurement is cancelled before the second average begins
- Real-time input level (dBFS) displayed during capture with color coding: green (good), orange (near saturation), red (clipping)
- Timing reference chirp now has short Hann fade-in and fade-out (1% of chirp duration each)
- Eliminates clicks caused by the abrupt onset and end of the chirp signal
- CLIO time-domain IR import (.txt files exported from CLIO in time domain)
- 3-column format: Time[s], Real[Pa], Imag[Pa] — the Imag column is ignored
- Sample rate is inferred from timestamps and snapped to the nearest standard rate (same algorithm as TMD)
- Auto-detected by the presence of the Time[s] header line, requiring no manual configuration
Improved
- Channel selectors (mic input, timing reference output/input) replaced with dropdowns
- TMD file import now snaps the inferred sample rate to the nearest standard rate (44.1, 48, 88.2, 96, 176.4, 192, 384 kHz…) when within 1% tolerance
- Corrects systematic sample rate errors caused by limited timestamp precision in TMD files
- Prevents subtle pitch/speed deviations that would otherwise affect the imported impulse response
Fixed
- Phase curve alignment in Loudspeaker Design mode (time-centered phase and unwrap)
- Unwrap + time-centered: DC offset (absolute phase reference) for all curves — drivers and the filtered Sum — now anchored to the pre-filter sum phase; previously the filtered Sum had a different DC origin, making it appear shifted vertically relative to the drivers
- Unwrap without time-centered: all curves (drivers + Sum) are now consistently aligned to the filtered Sum as reference; previously activating the pre-filter reference unconditionally caused a vertical offset on the Sum curve in this mode
- Adaptive wavelet windowing now covers the same physical frequency bands regardless of sample rate
- Number of levels is now derived from target minimum frequency (5 Hz) relative to Nyquist, ensuring coverage down to ~5 Hz at all sample rates (48, 96, 192 kHz…)
- Previously, at higher sample rates (e.g. 96 kHz), the cap prevented the lowest frequency bands from being reached, resulting in inconsistent temporal extensions for bass frequencies
- Keyboard shortcuts now work correctly when Settings window is open in background
- Main window shortcuts were incorrectly blocked whenever Settings window was open regardless of focus
- Settings window now only handles shortcuts when it has focus
- License tab disables shortcuts when Settings has focus to allow typing in text fields without triggering application shortcuts
[1.2.15] - 2026-02-17
Added
- Microphone calibration settings page
- Dedicated settings tab for managing microphone calibration files
- Scrollable list displaying all imported calibrations with sensitivity factor and frequency point count
- Default calibration selector for automatic application to newly created drivers
- Import/delete controls for each calibration file
- Spacebar keyboard shortcut to interrupt sweep measurements at any time
- Provides instant emergency stop during capture
- Works alongside Stop Capture button for multiple interruption methods
Improved
- Microphone calibration workflow enhancements
- Default calibration automatically applied to new drivers and new projects
- Deleting a calibration file automatically resets affected drivers to None
- Per-driver calibration selection moved to IR Management window for better context
- Adaptive windowing now uses wavelet transform for frequency-dependent IR windowing
- Replaced 10-band FIR filter bank approach with CDF 5/3 biorthogonal wavelet decomposition
- ~10× performance improvement
- Start windowing applied uniformly in time domain, stop windowing applied adaptively in wavelet domain
- Delay compensation with sync toggle for consistent measurement delay compensation
- New Sync toggle (enabled by default) automatically applies delay adjustments to all drivers
- Stop Capture button visual design during measurements
- Red button with white text matching Reset button styling
- Increased size for better visibility and accessibility
- Appears only during active capture for unambiguous emergency stop
- IR Management window behavior during measurements
- Window remains on top of all other windows during capture
- Window maintains keyboard focus throughout measurement for reliable spacebar interruption
- Prevents accidental loss of control if user clicks elsewhere during sweep
- Automatically returns to normal window level when measurement completes or is stopped
- Documentation navigation enhancement with sticky breadcrumb indicator
- Added breadcrumb banner below menu that tracks current position during scroll
- Helps users orient themselves in long documentation pages
- Improves navigation experience for complex multi-section pages
[1.2.14] - 2026-02-13
Added
- Individual harmonic distortion curves (H2, H3, H4) displayed on HD graph
- HD graph now shows detailed breakdown of harmonic components in addition to total harmonic distortion
- Individual harmonic curves require a valid license (total harmonic distortion remains available to all users)
- Provides deeper insight into distortion characteristics and system non-linearity
- HD display mode selector with three visualization options
- Percent (%) mode: Traditional percentage representation relative to total RMS
- dB (relative) mode: Harmonic distortion relative to total RMS in decibels
- dB (absolute) mode: Absolute level of harmonics without normalization
- Dropdown control added to graph toolbar before smoothing selector
- Mode applies to both total HD curve and individual harmonics (H2, H3, H4)
- Useful for comparing distortion levels across different SPL measurements and evaluating signal-to-distortion ratio
- Driver offset parameters in FRD file import window
- New X (horizontal) and Y (vertical) offset fields allow specifying driver position relative to baffle plane
- Enables reconstruction of relative time-of-arrival delays that may have been removed during FRD file creation
- Critical for accurate off-axis interference simulation around crossover frequencies
- Automatically calculates geometric delays based on listening angles and driver positions
- Improves accuracy of multi-driver system simulation from imported frequency response data
- TMD file format support for impulse response import
Improved
- Exponential sine sweep measurement system completely redesigned
- Single-pass averaging: Timing reference eliminates need for multi-pass alignment, enabling more efficient averaging workflow
- Reduced deconvolution artifacts: Improved signal processing prevents artifacts during impulse response extraction
- Automatic sweep end frequency: f_end now automatically calculated to optimize harmonic distortion SNR (1/96 octave before Nyquist)
- Simplified measurement workflow: End frequency parameter removed from UI, managed automatically based on sample rate
- Measurement capture stop behavior improved for graceful interruption
- Stop button now immediately interrupts sweep in progress instead of waiting for completion
- Sweep signal automatically attenuated with fade-out to prevent audio clicks and pops
- Enables quick measurement cancellation without disruptive audio artifacts
- HD graph replaces THD nomenclature
- Graph renamed from "THD" to "HD" (Harmonic Distortion) for clarity
- Keyboard shortcut (K) remains unchanged
- Updated throughout UI and documentation
- Documentation dark theme (coal) with darker background and lighter text for improved readability
[1.2.13] - 2026-01-29
Added
- Batch import for multiple measurement files with automatic angle parsing
- Import multiple IR files simultaneously with multi-file selection
- FRD converter parameters (sample rate, delay, extrapolation modes) automatically applied to all files in batch
- Manual FIR delay compensation visibility control (advanced setting)
- New "Show manual FIR delay compensation" option in Settings -> General -> Filter Processing
- Hidden by default to prevent accidental filter misalignment
- When disabled, all FIR compensation delays are automatically forced to 0
- Marked as advanced setting (⚙) with warnings about signal processing knowledge requirements
- Affects both per-driver "FIR Offset Delay" and global "FIR compensation delay" fields
Improved
- Driver control interface clarity with organized section headers
- Added colored section labels: "FIR Filters", "IIR Filters", and "Driver Adjustments"
- Replaced ambiguous "Visualization Controls" with clear "Driver Adjustments" label
- Improved visual hierarchy with consistent spacing and separators
- Better organization distinguishes signal processing filters from gain/delay/polarity adjustments
Fixed
- FIR correction frequency range controls now use proper undo debouncing
- Fixed issue where dragging frequency min/max sliders created separate undo history entries for each incremental value change
- Off-axis sum calculation now correctly handles missing measurements per driver
- Fixed bug where drivers without measurements at a specific angle would incorrectly use their on-axis (0°) measurement as fallback
- Fixes issues with directivity sonogram displaying incorrect data at extreme angles
- Directivity sonogram normalization now excludes Nyquist frequency artifacts
- Sonogram color scale normalization now limited to frequencies up to 24 kHz
- Prevents measurement artifacts near Nyquist frequency from affecting visualization scale
- Default frequency axis bounds now limited to 24 kHz for cleaner visualization
Breaking Changes
- Distortion measurement storage structure has been changed
- Internal data structure for storing distortion harmonics has been completely redesigned
- Backward compatibility is NOT maintained: Projects with distortion measurements from versions < 1.2.13 are not compatible
- Re-measurement is required: Importing old IRs will not restore distortion data - you must re-measure to capture distortion with the new structure
[1.2.12] - 2026-01-25
Fixed
- Off-axis measurements now correctly calculated after FRD file import
- Fixed issue where importing FRD files (frequency response data) would not trigger off-axis response calculations
- Reduced log verbosity for Directivity Sonogram window
- Sum curve now displayed when some enabled drivers have no measurements
- Previously, sum curve was hidden if any enabled driver lacked a measurement
- Now, sum is calculated and displayed from all enabled drivers that have measurements
- Drivers without measurements are treated as if they were disabled
Improved
- Impulse response level validation now uses frequency domain analysis
- Previously checked instantaneous peak level in time domain
- Now computes FFT and checks maximum magnitude across all frequencies
- More accurate detection of low signal-to-noise ratio issues
- Warning triggered if no frequency has magnitude above -25 dB
[1.2.11] - 2026-01-24
Added
- Custom file icon for
.lnfproject files- LinFIR project files (.lnf) now display a custom icon in file explorer
- Works on Mac OS and Windows
- Improves visual identification of project files
[1.2.10] - 2026-01-23
Added
- Adaptive crossover smoothing option for magnitude curves near crossover frequencies
- Preserves crossover slope visibility by reducing smoothing within ±0.5 octave of cutoff frequencies
- Controlled via Settings -> General -> Adaptive Crossover Smoothing (enabled by default)
- Phase smoothing
- Phase curves can now be smoothed while preserving driver alignment
- Magnitude-based filtering applied before smoothing to eliminate out-of-band artifacts
- Provides cleaner phase visualization without compromising timing accuracy
- Butterworth 4th-order sweep tapering for reduced pre/post-ringing
- New sweep windowing mode with smooth frequency-domain tapering (24dB/octave rolloff)
- Significantly reduces pre-ringing and post-ringing artifacts in measured impulse responses
- Eliminates Gibbs oscillations at spectrum edges caused by abrupt frequency cutoffs
- Sweep extends to f_start/4 and f_end×4 with Butterworth filters centered at user frequencies
- Recommended for cleaner measurements (enabled by default)
- Available in Settings -> Audio -> Sweep Windowing: None (no tapering) or Butterworth 4th (24dB/oct)
- ERB (Equivalent Rectangular Bandwidth) smoothing mode
- Perceptually-motivated variable smoothing that follows the ear's frequency resolution
- Available in the Smoothing dropdown menu (Drivers mode only)
Improved
- Off-axis response calculation performance significantly optimized
- Unified threading architecture eliminates race conditions between off-axis and directivity index calculations
- Substantially faster computation time through improved parallelization
- Directivity Sonogram updates automatically without requiring mouse movement
- Automatic impulse response noise truncation now limits IR length to 2 seconds after peak
- IRs are first truncated to 2 seconds maximum after the main impulse peak (maximum absolute value)
- Then trailing noise below 0.1% of peak amplitude is removed
- Minimum duration of 1.5 seconds is always preserved
- Improves processing performance and reduces file sizes for long IRs with extended decay
- Plot data resampling optimization using continuous logarithmic function
- Replaced fixed frequency bands with smooth exponential downsampling function
- Eliminates hard frequency band transitions for visually smoother plots
- More efficient computation
- Maintains perceptually constant point density across logarithmic frequency axis
- ASIO device compatibility now includes 24-bit sample format (I24) support
- Added I24 format to preferred and fallback format detection
- Improves compatibility with professional audio interfaces like Dante Virtual Soundcard
- Resolves "no compatible sample format found" errors with 24-bit ASIO devices
- Enhanced measurement safety warnings in confirmation dialog
- Added explicit low frequency warning about high energy bass content
- Warns against measuring unprotected tweeters or midrange drivers
- Clarifies potential damage risks from high excursion at low frequencies
- Sweep measurement parameters are now remembered per-driver
- Duration, level, frequency range, and averages are automatically saved to each driver
- Settings persist when closing and reopening the IR window
- New projects start with application default values, customizations are preserved in existing projects
- Default sweep parameters relocated to Audio Settings
- Moved from Settings -> General to Settings -> Audio Settings -> Measurement Configuration
- Now grouped with other measurement-related settings (sweep channels, calibration, timing reference)
- More logical organization: all measurement parameters in one place
Fixed
- Directivity Index not updating with latest off-axis data
- Race condition eliminated where DI could be calculated from stale measurements
- DI now guaranteed to reflect current off-axis responses
[1.2.9] - 2025-12-30
Fixed
- FIR filter export filenames now display correct tap count
- Fixed inconsistency where exported FIR filter filenames showed incorrect number of taps
- Tap count in filename now always matches the actual length of the exported filter
- Affects all export formats (CSV, WAV, bin, txt, Armonia) and both individual and batch exports
- Correctly reflects "per driver tap length" setting when enabled
- Log file rotation now properly enforces 4 MB size limit
- Previous implementation allowed log files to grow indefinitely (up to 188 MB observed)
- Oversized logs are automatically rotated and renamed with timestamp
- Only the 2 most recent log files are retained to manage disk space
Improved
- Bug report notifications now use toast messages
- Success notifications display for 3 seconds before auto-dismissing
- Error notifications remain visible until manually dismissed
- Error messages include manual submission instructions and support email
[1.2.8] - 2025-12-30
Improved
- Filter Export behavior: disabled drivers are now skipped
- FIR and IIR filter export now only exports filters from enabled drivers
- Disabled drivers (checkbox toggled off in Drivers toolbar) are automatically skipped during export
- Applies to all export formats and methods (individual FIR files, IIR files, and HFD export)
- Improves workflow efficiency by preventing accidental export of inactive driver configurations
- FIR Magnitude Correction taper standardized to quarter-octave
- Changed from 5% bandwidth taper to quarter-octave (1/4 octave) transition zones
- Matches the taper behavior of Auto EQ for consistency
- Provides smoother frequency transitions at the edges of the correction range
- Applies to both per-driver and global FIR magnitude corrections
[1.2.7] - 2025-12-27
Added
- FIR Filter Export: Stereo WAV formats
- New stereo export options: WAV i16 (stereo), WAV i24 (stereo), WAV f32 (stereo)
- Mono formats renamed to clarify: WAV i16 (mono), WAV i24 (mono), WAV f32 (mono)
- Filter is duplicated identically in both left and right channels for stereo files
- IIR Filter Export: MiniDSP format
- New export format option for MiniDSP processors
- Exports biquad coefficients in compact text format: biquad1, b0=..., b1=..., b2=..., a1=..., a2=...
- Available alongside existing FQG, CamillaDSP, and Q-SYS export formats in File > Export > IIR Filters
Fixed
- Directivity Sonogram flickering during parameter changes
- When modifying crossover or filter parameters, the sonogram would briefly disappear before reloading
- Sonogram remains visible and smoothly updates to new parameters without flickering
[1.2.6] - 2025-12-22
Added
- IIR Filter Export: Q-SYS CSV format
- New export format option for Q-SYS IIR Custom Filter components
- Exports biquad coefficients in CSV format: b0, b1, b2, a0, a1, a2 (one biquad per line)
- Supports all IIR filter types: Butterworth, Linkwitz-Riley, Bessel, PEQ, Low-shelf, High-shelf, Allpass (1st and 2nd order)
- Coefficients exported with 16 decimal places precision for maximum accuracy
- Available alongside existing FQG and CamillaDSP export formats in File > Export > IIR Filters
- Documentation enhancements
- New "Design Philosophy" section in Overview explaining LinFIR's DSP-faithful, time-domain approach
- New "Impulse Response Timing Requirements" section in IR Management explaining 200ms peak delay limit and best practices
Fixed
- In same cases a deleted driver/measurement instance could lead to a crash
- Internal lists linked to drivers/measurements/ are now checked regularly to preserve coherence
- Long impulse responses with significant delays (>500ms) were being truncated during spectrum calculation
freqz()andfreqz_complex()now dynamically adjust FFT size to accommodate full IR length- Prevents artifacts and incorrect frequency response for IRs longer than the requested spectrum points
- Import rejection for excessively delayed impulse responses
- LinFIR now rejects impulse response imports where the main peak is located beyond 200ms
- 200ms corresponds to ~68 meters acoustic distance, indicating missing timing reference in measurement
- Prevents performance degradation from excessive zero-padding before useful signal
- Error message explains computational constraints and recommends proper timing reference methods
Improved
- Phase Correction Filter stability
- Improved algorithm robustness when correction band extends near Nyquist frequency
- Better noise handling in high-frequency regions
- Eliminates phase offsets and artifacts for cleaner, more stable impulse responses
- Auto Causal Alignment algorithm
- Now uses logarithmic energy distribution instead of simple first-significant-sample detection
- Positions FIR impulse peak based on energy ratio: if 30% of log-energy is before peak, places peak at 30% of FIR taps
- Prevents truncation of both pre-ringing and post-ringing artifacts in combined causal filters
- More robust with asymmetric impulse responses and complex filter combinations
- Clearer logging for debug
- Audio input channel defaults
- When selecting an input device with at least 2 channels available, LinFIR now automatically sets input channels to 2 instead of 1
- Applies both when manually changing devices and during initial device detection
- Electric loopback timing reference now defaults to channel 2 for both input and output (avoids collision with microphone on channel 1)
- Improves out-of-box experience for electric timing reference without manual channel configuration
- Documentation enhancements
- User Interface section has been moved to the beginning of the documentation (after Project Modes) for better pedagogical flow
- New comprehensive Graph Toolbar section in Graph Interaction page, now positioned at the top
- Added interactive zoom-on-hover for graph toolbar images (hover to zoom in on specific areas)
- Clarified Time-Centered Phase description (linear regression to remove linear phase component)
- Clarified Smoothing behavior (explicitly states which graphs are affected)
- Time-Centered Phase algorithm improvements
- Replaced phase regression method with IR peak position detection for more accurate bulk delay removal
- Provides more robust phase centering, especially for impulse responses with significant delays or complex phase behavior
- Applied to both graph display (time-centered phase toggle) and resampling algorithm (upsampling phase correction)
- Resampling algorithm optimizations
- Improved stability with long-delay impulse responses
- Reduced sinc filter length from 256 to 128 to minimize edge artifacts
- Upgraded interpolation from Linear to Cubic for better quality
- Reduced oversampling factor from 256 to 128 for improved numerical stability
- Spectrum calculation performance for long IRs
- Significantly reduces FFT size and computation time for IRs with long initial delays while maintaining accuracy
[1.2.5] - 2025-12-19
Added
- Documentation enhancements
- Added comprehensive "Performance Considerations" section in global-settings.md
- Explains LinFIR's real-time filter processing architecture
- Documents filter application methods (FIR: fast convolution, IIR: difference equations)
- Performance impact factors: filter length thresholds, off-axis measurement considerations
- Background processing architecture for UI responsiveness
- Optimization recommendations for slower systems and complex projects
- Enhanced clipping detection documentation
- Clarified that warnings are purely about filter processing, not measurement levels
- Explained why phase processing can cause clipping even with flat magnitude responses
- Added technical details: 32-tone test signal (20 Hz - 20 kHz), 1.1 detection threshold
- Documented common scenarios: phase correction, all-pass filters, multiple FIR filters
- Added comprehensive "Performance Considerations" section in global-settings.md
Fixed
- Clipping detection test signal
- Corrected multitone test signal from 31 to 32 frequencies
- Documentation accuracy improvements
- Corrected Tukey window formula in ir-management.md to match actual implementation (was using undefined "\text{prog}" variable)
- Undo/Redo bug causing empty driver graphs
- Fixed issue where undo/redo operations would sometimes cause driver graphs to become empty
- Root cause: Restored measurements weren't being resampled/recalculated due to cached state
- Solution: Invalidate resampling cache on snapshot restore to force complete recalculation
- Affects: Driver frequency response, phase, group delay, and impulse graphs after undo/redo
- Documentation refering to the View menu instead of Edit for the settings
- Buttons not showing in Sweep confirmation dialog
[1.2.4] - 2025-12-18
Added
- Documentation screenshots
- Documentation reorganization
- Added comprehensive "Target DSP Settings" section in driver-processing.md
- Consolidated sample rate, FIR length, per-driver tap lengths, and export padding documentation
- Added per-driver tap lengths screenshot showing UI changes when enabled
- Clarified that Filter length and Export padding controls relocate to individual driver sections when per-driver mode is active
- Removed redundant "Filter Length Configuration" section
Fixed
- Documentation accuracy improvements
- Removed Auto EQ workflow references from Manual Tab section in driver-processing.md
- Clarified locked filters usage in manual IIR filter design context
- Added comprehensive TXT file format documentation in Supported Formats section
- Documented TXT file metadata support (sample rate, distortion data, ESS parameters)
- Clarified that TXT files can contain either impulse samples or FRD format data
- Corrected sweep-measurements.md to reference 🎤 Measure button (was incorrectly called "Capture")
- Added documentation for measurement confirmation dialog and skip option in settings
- License validation offline behavior
- Fixed infinite validation loop when machine is offline
- IR import validation improvements
- Added file extension validation (only .wav, .txt, .frd supported)
- Added data validation to reject empty files, single-sample files, and files containing NaN values
- Improved error messages with reference to documentation for unsupported formats
[1.2.3] - 2025-12-17
Fixed
- Documentation theme customization
- Fixed theme selector to show only Auto, Light, and Coal themes
- Corrected inconsistent styling between auto mode and manual theme selection
- Ensured proper LinFIR branding colors across all themes
[1.2.2] - 2025-12-17
Improved
- Auto Detect Delay now applies minimum delay across all drivers
- Previous behavior: Applied delay compensation only to the current driver
- New behavior: Detects delay for all drivers and applies the minimum delay to all simultaneously
- Benefits:
- Preserves temporal alignment between drivers automatically
- Removes common propagation delay from all measurements
- Prevents manual alignment errors when setting up crossovers
- Detection method: Uses peak position of on-axis measurements for precise alignment at zero
- Manual adjustment still available for individual drivers if needed-
- Documentation access prioritizes online version
- When accessing documentation (Help > Documentation / H key), LinFIR now attempts to open the online documentation at https://demaudio.com/doc/linfir/ first
- If no internet connection is available or the online version is unreachable, automatically falls back to the embedded local documentation server
- Benefits:
- Users always access the latest documentation updates when online
- Seamless offline access with no additional configuration required
- FRD Converter: Configurable magnitude extrapolation modes
- Added separate extrapolation control for DC and high-frequency regions
- Two modes available:
- Constant: Flat extrapolation using endpoint value
- Roll-off: Applies smooth roll-off with adaptive curvature
- DC roll-off: 12 dB/octave high-pass characteristic for realistic low-frequency behavior
- HF roll-off: 12 dB/octave low-pass characteristic, compensates for upward slopes
- Default settings: Roll-off for DC, Constant for Nyquist
- Benefits:
- More realistic impulse responses from incomplete FRD data
- Prevents artifacts from abrupt extrapolation
- Maintains adequate signal level up to Nyquist frequency
[1.2.1] - 2025-12-13
Added
- Import validation warning for excessive delays
- When importing impulse responses from TXT or WAV files (excluding FRD files), LinFIR now detects the main peak position
- Displays a warning toast if the main peak is located beyond 20 ms
- Import validation warning for low signal levels
- When importing impulse responses from TXT or WAV files, LinFIR now checks peak signal level
- Displays a warning toast if peak level is below -25 dB
- Low levels often indicate poor signal-to-noise ratio, which can compromise correction filter quality and phase visualization accuracy
- Web-based documentation system
- Replaced in-app egui documentation with comprehensive mdBook-based documentation
- Embedded directly into the application binary for offline access
- Served locally via built-in HTTP server on port 3030+
- Features:
- 17 comprehensive documentation pages covering all LinFIR features
- Theme-aware screenshots with automatic dark/light mode switching
- Integrated search functionality
- Access via Help > Documentation (H key) or Menu > Documentation
Fixed
- HFD export driver naming bug
- Fixed issue where all drivers displayed as "Driver 1" in group-to-driver mapping dropdown
- Driver names now correctly show as "Driver 1", "Driver 2", etc. when not renamed
- Custom driver names are properly displayed when set by user
[1.2.0] - 2025-12-11
Added
- Room Calibration Mode
- New dual-mode project system: Loudspeaker Design (default) and Room Calibration
- Mode selection available in File menu
- Room Calibration features:
- Measurements are temporally aligned using GCC-PHAT (Generalized Cross-Correlation with Phase Transform) algorithm
- Subsample precision via parabolic interpolation of the correlation peak
- Measurements automatically averaged after alignment to create system impulse response
- UI adapted: "Drivers" renamed to "Measurements", directivity features disabled
- Sweep output channel selector in IR window (excludes timing reference channel)
- Graph display shows only global filters (FIR and IIR), individual measurement curves hidden
- Export restrictions: Only global filters exported (FIR/IIR), HFD config and reports disabled
- Designed for in-room acoustic measurements and correction filter generation
- Preserves all loudspeaker design capabilities in Loudspeaker Design mode
- FRD to IR Converter utility window
- Integrated advanced FRD-to-impulse response converter directly into LinFIR
- Opens automatically when importing .frd or FRD-formatted .txt files
- Features:
- PCHIP interpolation with adjustable sampling frequency and low/high-frequency extrapolation modes
- Real-time visualization: Original + Interpolated FRD, Impulse Response, Reconstructed Response
- Quality metrics: data coverage percentage, reconstruction error analysis
- Minimum phase transformation option to eliminate pre-ringing
- Configurable delay compensation
- Phase display options: wrap/unwrap, with/without linear phase removal
- Replaces previous basic FRD import with full-featured converter from standalone frd-to-ir tool
- Direct integration: converted impulses automatically update the target driver measurement
- Directivity analysis tools (requires license)
- Polar measurement capabilities on both vertical and horizontal axes
- Off-axis curve visualization with selector in toolbar
- Directivity Index (DI) prediction curve
- New window displaying predicted directivity sonograms (vertical and horizontal)
- DI and sonograms reflect filtering choices between drivers
- Requires IR measurements preserving time of flight to accurately represent interference patterns between drivers
- Note: Directivity tools require a purchased license; other features remain free
Changed
- IR naming behavior
- Removed automatic renaming of impulse responses during import and measurement
- IR name field now preserves user-entered names across operations
- Users must manually name their IRs via the text field in the Driver IR window
- Previous behavior: IRs were automatically renamed to filename/timestamp on import/capture
- New behavior: Manual naming only, preventing unwanted name changes
Improved
- File saving optimizations
- Implemented compression to reduce file sizes
- Faster save operations with smaller project files
- Memory optimizations
- Reduced RAM usage through internal memory management improvements
- More efficient memory allocation and deallocation
- Performance optimizations
- Optimized calculations for improved app responsiveness
- Faster UI updates and graph rendering
Fixed
- Phase correction in upsampling
- Fixed phase artifacts in interpolated spectrum (above original Nyquist frequency)
- Algorithm now: calculates phase slope before resampling, removes it, enforces constant phase above old Nyquist, then restores temporal coherence
- Applies only to upsampling operations (e.g., resampling from 48 kHz to 96 kHz)
- Time-centered phase plot
- Limited phase slope calculation to 20 kHz maximum
- Prevents phase noise at high frequencies from affecting the centering calculation
- Applies to both Speakers mode and FIR/IIR filter modes
[1.1.20] - 2025-11-23
Fixed
Graph interaction improvements
- Fixed axis drag zoom not disabling auto-bounds
- Dragging on X or Y axes to zoom now correctly disables auto-bounds for the affected axis
- THD graph now only displays in Speakers/Drivers mode
- Previously shown in all display modes, now correctly restricted to Speakers mode only
- Maintains proper display in detached windows
- Fixed axis drag zoom not disabling auto-bounds
Configuration report export (TXT/PDF) fixes
- Fixed AutoEQ filters not being exported when AutoEQ tab is selected
- Filter type counting now correctly uses the active tab's filters (Manual or AutoEQ)
- Correction Filters (PEQ) section now properly displays AutoEQ-generated filters
- Added missing Phase Correction FIR parameters to reports
- Now includes Phase Offset (degrees) and Kaiser β parameters
- Provides complete documentation of phase correction settings
- PDF report now includes biquad references for IIR filters
- Added "Biquads" column to IIR filter tables in PDF reports
- Displays biquad section numbers for each filter (e.g., "1" for single biquad, "1,2" for cascaded)
- Matches the biquad numbering shown in TXT reports and appendices
- Enables cross-referencing between filter definitions and biquad coefficient listings
- Fixed AutoEQ filters not being exported when AutoEQ tab is selected
[1.1.19] - 2025-11-20
Fixed
- Per-driver tap lengths toggle now correctly applies individual tap values to each driver
- Fixed bug where enabling "Enable per-driver tap lengths" would still use the global tap count
[1.1.18] - 2025-11-20
Improved
- Phase correction algorithm enhancement
- Upgraded from linear interpolation to PCHIP (Piecewise Cubic Hermite Interpolating Polynomial)
- Provides smoother, more accurate phase interpolation during correction process
- Graph state management refactoring
- Complete architectural cleanup of graph bounds and auto-bounds management
- Each graph now maintains its own saved bounds and auto-bounds flags independently
[1.1.17] - 2025-11-19
Added
- New direct phase correction algorithm
- Works directly with unwrapped phase instead of group delay integration
- Removes linear phase component before smoothing for stable, predictable corrections
- Better impulse symmetrization without arbitrary phase offsets
- More reproducible results across different correction parameters
- Band-limited correction with constant phase continuation outside the working band
- Preserves phase coherence and avoids group delay artifacts at band edges
- Phase offset control for phase correction
- Replaces binary polarity inversion with continuous phase offset slider
- Range: -180° to +180°
- Allows fine-tuning of phase alignment and acoustic polarity
- Controls impulse response symmetry to adjust pre-ringing introduced by phase correction FIR
- Applied after phase correction, before spectral synthesis
- Detached graph windows
- Right-click any plot -> "Open in separate window" to spawn a native window
- Multiple instances per plot type supported (e.g., several frequency plots)
- Windows are resizable and can be closed with Cmd/Ctrl+W
- Live rendering: detached plots update in real time and stay synchronized with the current project state
- Display-mode capture: each window renders using the mode captured at detachment (FIR/IIR/FIR+IIR/Speakers) without altering the main window's mode
- Automatic phase alignment in unwrapped mode
- Phase curves are now automatically aligned when displaying unwrapped phase
- Removes phse offset differences between drivers/filters for easier comparison
- Works with or without time-centered phase enabled
- Speakers mode: aligns all drivers to the Sum curve
- FIR/IIR modes: aligns all filters to the first active filter
- Uses robust median-based offset calculation on passband (middle 50% of data)
- Eliminates random offsets caused by out-of-band noise and measurement artifacts
- Makes crossover phase continuity immediately visible
Improved
- Smart directional truncation for group delay and phase plots
- Graph truncation now respects the type of active filters (high-pass, low-pass, or both)
- High-pass filters only: truncates low frequencies below threshold
- Low-pass filters only: truncates high frequencies below threshold
- Both filters active: truncates both sides as before
- No LP/HP filters active: no truncation (e.g., when only using PEQ, shelves, or all-pass filters)
- Applies to all contexts: FIR, IIR, FIR+IIR combined, speaker responses, and global filters
- Provides cleaner visualization by showing only relevant frequency ranges
Fixed
- Undo/Redo no longer affects visualization controls (graph toggles, display mode, phase unwrapping, smoothing, etc.)
- FRD file import crash
- Fixed panic when importing FRD files with excessive group delay
- Added proper bounds checking for impulse response rotation to prevent array index overflow
- Import now handles edge cases gracefully without crashing
- FRD phase extrapolation artifacts
- Improved phase extrapolation beyond measured frequency range
- Now uses average group delay to maintain constant GD in extrapolated regions
- Prevents phase from diverging and creating negative group delay
- Eliminates impulse response artifacts in high/low frequency extrapolation zones
[1.1.16] - 2025-11-15
Improved
- Interface optimization for small windows
- Graph toolbar now adapts to window width
- Below 1300px width, toolbar splits into two rows
- First row: Display mode selectors (FIR/IIR/Drivers), graph toggles (Mag./IR/Step/G. Delay/Phase), THD
- Second row: Normalize, Sum Focus, Sync X-axis, Unwrap Phase, Time-centered Phase, Smoothing
Fixed
- Phase control buttons behavior
- "Unwrap Phase" and "Time-centered Phase" buttons now disabled (greyed out) instead of hidden when phase graph is not displayed
- Improves UI consistency and predictability
[1.1.15] - 2025-11-14
Improved
- Interface optimization for small screens
- Shortened button labels in graph toolbar for more compact display
- Reduced driver parameter column width for better space utilization
- Improved overall layout efficiency for laptop and smaller displays
[1.1.14] - 2025-11-10
Added
- Theme selector in Settings
- Moved theme selection (Light/Dark/System) from "View" menu to Settings > General > Appearance
- Now grouped with other appearance settings (UI Color Scheme)
- More intuitive access to visual preferences in a single location
- Time-centered phase display mode
- New "Time-centered Phase" toggle button in phase display controls (next to "Unwrap Phase")
- Removes the linear phase component (constant group delay) from all driver phase responses
- Makes phase alignment between drivers easier to visualize and compare
- Keyboard shortcut: C key
- Available only in Speakers display mode
- Applies correction to all visible curves while preserving phase differences
- New default setting in Settings > General > Display: "Time-centered phase" dropdown (Enabled/Disabled)
- Controls whether time-centered phase is enabled by default for new projects
- Customizable magnitude plot bounds
- New "Magnitude Plot Bounds" section in Settings > General > Graphs
- "Drivers range (dB)": Controls Y-axis range for speaker magnitude plots
- Default: 60 dB (from max_response - 60 to max_response + 5)
- Adjustable from 20 dB to 200 dB
- Allows fine-tuning the vertical zoom level for better resolution or overview
- "Filters lower bound (dB)": Controls lower Y-axis bound for filter magnitude plots
- Default: -100 dB
- Adjustable from -20 dB to -200 dB
- Applies to FIR, IIR, and FIR+IIR filter magnitude plots
- Useful for examining filter attenuation characteristics
Improved
- Project data structure refactoring
- Consolidated all project-related data into a unified struct
- Backward compatibility maintained through legacy migration system
- Cleaner separation of concerns for future development
- Magnitude-threshold truncation replaces octave margins
- Group Delay and Phase truncation now use a magnitude threshold in dB below the maximum instead of octave-based margins
- New per-context settings: thresholds for Speakers, IIR, FIR, and FIR+IIR
- Default threshold set to -50 dB (configurable in Settings)
- UI updated: controls display values in dB below maximum
Removed
- "View" menu from menu bar
- Theme selection moved to Settings > General > Appearance
- Simplifies menu bar by consolidating appearance settings in one location
Fixed
- Phase display accuracy
- Removed fractional octave smoothing from phase curves
- Smoothing was introducing visual artifacts and local slope changes
- Could bias visual assessment of driver phase alignment
- Phase now displays raw calculated values without smoothing
- Group delay continues to be smoothed as before (not affected by this change)
- Results in more accurate phase representation for alignment analysis
- IIR and FIR+IIR phase/GD correctness
- Group delay is now computed from unwrapped phase for IIR and combined FIR+IIR, eliminating artifacts at phase wrap boundaries
- "Unwrap Phase" toggle now affects display only; underlying GD is always derived from unwrapped phase
[1.1.13] - 2025-11-07
Added
- Auto causal alignment setting
- New "Auto causal alignment" option in Settings > General > Filter Processing
- Automatically optimizes impulse response positioning when multiple filters with causality are active
- Detects first significant sample (>1/10000 of peak) and aligns it with crop window start
- Prevents pre-ringing truncation and maximizes useful signal capture
- Activates when: ≥2 FIR filters active AND at least one has non-zero causality
- Can be disabled for manual control over impulse positioning
- Enabled by default
Improved
- FIR filter convolution stability
- Improved impulse response alignment algorithm for causal filter combinations
- FIR correction gain application
- Gain adjustment for FIR correction now applied before frequency band limitation in signal processing
- Only corrects gain within the active correction band (f_min to f_max)
- Preserves magnitude outside correction range, avoiding unintended global gain changes
[1.1.12] - 2025-11-06
Added
- Independent calculation modes for magnitude and phase FIR correction
- Separate "Correction calculation" dropdowns for magnitude and phase correction
- Each can independently choose pre-IIR or post-IIR signal calculation
- Available for both per-driver and global FIR correction filters
- Pre-ringing analysis in impulse response plots
- Automatic weighted RMS calculation of pre-ringing using Hilbert envelope
- Perceptually-weighted metric using sigmoid function (masking near peak, penalty far from peak)
- Displayed in hover tooltip with level in dB and qualitative risk assessment
- Risk labels: "Likely masked" (≤-36 dB), "Low risk" (-36 to -24 dB), "Moderate risk" (-24 to -12 dB), "High risk" (>-12 dB)
- Non-intrusive: only shown when hovering over impulse curves
- UI color scheme selection
- New "UI Color Scheme" option in Settings > General > Appearance
- Choose between "Red" (custom red theme) or "Blue" (default egui theme)
- Red scheme: custom red accent colors for headers and active buttons
- Blue scheme: standard egui colors with blue accents
- Changes apply immediately without restart
Improved
- Correction filter UI reorganization
- Removed pre/post-LP and HP calculation modes as it could cause issues
- All FIR corrections are now computed without FIR LP or HP filters
[1.1.11] - 2025-11-05
Added
- X-axis synchronization for time-domain plots
- New "Sync X-axis" toggle now also synchronizes impulse and step response plots
- Double-click any synchronized plot to reset all time axes to full range
- Independent Y-axis control per plot for flexible visualization
- Auto-bounds system: plots automatically adjust to data range, disabled by user zoom/pan, re-enabled by double-click
- "All" button for driver management
- Quickly enable all drivers with a single click
- Complements existing "Solo" button for easy workflow: Solo -> test -> All -> compare
- Located next to "Solo" button in each driver panel
- Peak time information in IR Information section
- Displays temporal position of IR peak for manual window definition reference
- Maximum audio inputs and outputs increased to 256
- Enables use of professional audio interfaces with numerous channels
- Measurement notes field for each driver
- Add notes about hardware configuration, measurement setup, etc. (up to 1000 characters)
- Accessible in the IR management window under "Measurement Notes"
- Default sweep parameters in settings
- Configure default sweep duration, level, start/end frequency
- New windows automatically use these defaults
- Graph display configuration in settings
- New "Graphs" tab in Settings window
- Reorder graphs with up/down (\u{2B06}\u{2B07}) buttons to customize display order
- Configure which graphs are shown by default in new projects
Improved
- Y-axis alignment across all plots
- Fixed Y-axis width ensures vertical alignment of plot areas
- Better readability when comparing multiple graphs with different label lengths
- Clipping warnings now use a dedicated notification group
- More reliable notification system with less visual clutter
Fixed
- Audio settings preservation across all project operations
- All audio configuration (devices, sample rate, channels, calibration, measurement channels, timing reference, etc.) now persists when:
- Loading existing projects
- Creating new projects
- Resetting to new project with defaults
- AudioManager is properly reinitialized with user's saved settings instead of reverting to defaults
- Prevents accidental overwrite of carefully configured audio settings
- All audio configuration (devices, sample rate, channels, calibration, measurement channels, timing reference, etc.) now persists when:
[1.1.10] - 2025-11-02
Added
- THD truncation margin parameter for drivers in settings
- Adaptive impulse/step response display with configurable detection
- Automatically detects signal boundaries at 1/1000th of peak amplitude
- Configurable margins before (default: 5ms) and after (default: 10ms) signal
- Can be disabled to show full impulse response at all times
- "Focus on Summed IR" button for impulse and step response displays
- When enabled, all curves use the same time boundaries as the summed IR
Fixed
- Auto-save now forces save on application shutdown
- Ensures pending changes are saved before closing
- Resolves issue where rapid edits could be lost if closing within 1.5s of last change
- Project state now consistently preserved across sessions
- Phase compensation now correctly accounts for driver IR delay compensation
- Previously only affected group delay, now phase is also compensated
- Ensures phase and group delay remain consistent when using IR delay compensation
[1.1.9] - 2025-11-01
Added
- FIR compensation delay parameter for global FIR correction filters
- Fine-tune FIR alignment when filter ringing permits
- Rotates the impulse response in time domain (±100 ms range)
Fixed
- Phase delay compensation now correctly applied to total response (Sum)
- Affects display when "Compensate plot delay" is enabled in Global FIR settings
- "Open recent projects" menu now persists correctly across sessions
- IR delay compensation now resets to zero on every new measurement or import
[1.1.8] - 2025-10-31
Improved
- Phase and group delay calculations significantly improved when working with FRD files
- More accurate phase extraction from frequency response data
- Better group delay derivation from phase information
- Improved unwrapping and numerical stability
- IIR and FIR+IIR graph tabs simplified to reduce visual clutter
- Removed aggregated sum curves that were causing confusion
- Individual driver responses remain available and accurate
- Cleaner display focusing on relevant per-driver information
Added
- "Open recent projects" menu for quick access to previously used projects
- Tracks up to 20 most recent project files
- Provides faster workflow for switching between projects
- Measurement confirmation dialog before starting sweep
- Displays safety warnings and reminders (mic position, gain levels, audible sweep)
- Can be disabled in audio settings with toggle ("Skip confirmation")
- Helps prevent accidental measurements with improper setup
[1.1.7] - 2025-10-29
Added
- Added an input gain compensation setting in the audio preferences.
- This allows adjusting the recording level directly in software
- Useful for devices like the UMIK-1 on MacOS, where the system enforces a very low fixed gain and no hardware control is available.
- Added microphone calibration file import in audio preferences.
- Supports standard calibration file format (text files with "Sens Factor" header and frequency/error columns)
- Applies minimum-phase correction to impulse response measurements
- Correction is baked into the captured impulse response, not just applied visually to magnitude plots
[1.1.6] - 2025-10-28
Fixed
- Wrong total phase with some combination of parameters
Improved
- IIR magnitude plot auto-bounds now use -100 dB lower limit when high-pass or low-pass filters are active
- Matches FIR+IIR display behavior for better filter slope visualization
- Dynamically adapts based on active filter types (HP/LP vs. PEQ/shelving)
[1.1.5] - 2025-10-27
Added
- HFD Export for Hypex FA Series Amplifiers
- Direct export to Hypex FA amplifier configuration files (FA122, FA123, FA251, FA252, FA253, FA501, FA502, FA503)
- Support for both Input FIR and Output FIR positions
- Automatic FIR padding to required lengths (1500 taps for Output, 4500 taps for Input)
- Per-driver IIR filter export (up to 15 biquads per channel)
- Patch mode to update existing HFD configuration files
- Automatically detects FIR position from existing files
- Allows selective preset updates (Preset 1, 2, or 3)
- Comprehensive validation:
- Sample rate check (93.75 kHz required)
- FIR tap length validation per position
- Biquad count verification (max 15 per channel)
- Driver-to-group mapping interface for multi-channel systems
- Configurable Group Delay & Phase Truncation
- Optional truncation of GD and phase curves to active frequency range
- Per-filter-type margin settings (Speakers, IIR, FIR, FIR+IIR)
- Margin values configurable in octaves (0.0-5.0)
- Reduces visual clutter by hiding curves outside useful frequency range
Fixed
- Fixed FRD file import phase reconstruction
- Automatic compensation for negative group delay to prevent impulse wrapping
- Imported impulses may appear time-shifted based on the group delay characteristics of the FRD data
- Global FIR delay compensation on graphs inactive after restarting the app
[1.1.4] - 2025-10-23
Fixed
- Fixed keyboard shortcuts not working in driver IR management windows
- Undo/Redo (Cmd/Ctrl+Z, Shift+Cmd/Ctrl+Z) now work in all IR windows
- Save (Cmd/Ctrl+S) and Export (Cmd/Ctrl+E) shortcuts now available
- Settings shortcut (Cmd/Ctrl+,) now functional in IR windows
- Fixed impulse export dialog behavior
- "Include distortion" option now unchecked by default (previously checked)
- TXT export button now enabled by default (previously disabled)
- TXT export now available even when distortion metadata is not present
- Fixed impulse clipping during WAV export
- WAV export now automatically normalizes impulses with amplitude exceeding ±1.0
- Prevents clipping while preserving the impulse shape
- Particularly important for FRD-imported impulses which may have unnormalized amplitudes
- Fixed undo/redo creating multiple snapshots when dragging numeric values
- Drag operations (DragValue widgets) now create a single snapshot on release
- Works across all windows (main window and all viewport windows)
- Single Cmd+Z now correctly reverts an entire drag operation to its initial state
- Prevents undo history pollution from intermediate drag values
Improved
- Improved impulse response display layout in driver IR management window
- Long filenames are now truncated to 30 characters with ellipsis to prevent overflow
- Duration and sample rate information moved to a separate line for better readability
- Prevents UI elements from extending beyond window boundaries
- Improved IR Delay Compensation System
- IR delay compensation no longer truncates impulse responses
- Impulses are now preserved intact in memory with delay applied as display offset
- Delay compensation now affects:
- Time axis display (visual shift without data loss)
- Group delay calculations (compensated by subtracting delay)
- Prevents magnitude and phase artifacts from truncation
- Maintains full impulse information including pre-ringing
[1.1.3] - 2025-10-21
Added
- Option to disable clipping warnings in General Settings
- EQ Boost Cap parameter in AutoEQ (both driver and global IIR)
- Prevents AutoEQ from stacking multiple filters at the same frequency
- Configurable from 0 to 20 dB
- Set lower values (e.g., 10 dB) for more conservative corrections
- Helps achieve more natural-sounding frequency responses
- Gain Offset parameter in AutoEQ (both driver and global IIR)
- Adjusts the target level before EQ optimization
- Range: -20 to +20 dB (default: 0 dB)
- Useful for compensating overall system level shifts
- Applied to target curve before computing corrections
Fixed
- FIR+IIR impulse responses no longer truncated, ensuring accurate plots
- Clipping warnings now display correctly for global IIR filters
- FIR+IIR frequency response curves now render properly with active global IIR filters
- Keyboard shortcuts now work correctly in all native windows (Settings, Documentation, Filter windows, etc.)
Improved
- "Compensate FIR delay on graphs" option now preserves pre-ringing instead of truncating it, preventing magnitude and phase artifacts
- Magnitude response graph toggle changed from 'R' to 'M' key for better ergonomics
- AutoEQ parameter layout reorganized into 3 columns for better space efficiency
- All AutoEQ parameters now use consistent 6-column grid layout (3 visual parameter pairs)
- Parameter grouping: Target/Resolution/Gain Offset, Gain limits/EQ Boost Cap, Q limits/Max Filters, Frequency limits/Shelves
[1.1.2] - 2025-10-21
Added
- Added "Compensate FIR delay on graphs" toggle in Global FIR Correction window
- Optionally shifts impulse response left to remove visual delay introduced by the global FIR filter
- Does not affect exported filters, only improves plot alignment
- Useful for comparing time-aligned driver responses in the presence of global FIR correction
- Added Reset Application Settings feature in Settings
- Completely resets all application settings and preferences to factory defaults
- Clears application cache and UI state
- Accessible via Settings > General Settings > Reset section
- Useful for troubleshooting or starting fresh with default configuration
Fixed
- Fixed phase response not reflecting polarity inversion
- Phase now correctly shifts by 180° when driver polarity is inverted
- Phase correction filters now properly display 180° phase shift when their polarity is inverted
- Fixed global IIR and FIR+IIR graphs not clearing when using "Clear Filters" button
- IIR response curves now properly reset to flat when all filters are removed
- Combined FIR+IIR graphs now correctly update when IIR filters are cleared
- Fixed manually added filters in AutoEQ tab not being applied to driver response before running optimization
- AutoEQ filters are now automatically enabled when adding the first filter
- Locked filters (e.g., high-pass or low-pass) are now properly integrated into the AutoEQ target curve instead of being compensated by the optimizer
- Fixed AutoEQ tab requiring manual IIR toggle to be enabled (AutoEQ and Manual IIR tabs are now fully independent)
- Fixed IIR filter type changes not triggering UI updates
- Changing filter types (e.g., LR low-pass -> high-shelf) now properly invalidates the filter cache
- Filter response is immediately recalculated and displayed when switching types
Improved
- Reorganized documentation to enhance readability and better align with the app’s workflow
- All windows now use the native OS window system, improving multi-monitor usability
- Lockable filters now available in the manual tab
- Locked filters now stay in place when clearing the filter list
- AutoEQ now respects locked filters by incorporating their response into the optimization target
- Only high-pass and low-pass filters (Butterworth, Linkwitz-Riley, Bessel) are included in the target curve
- PEQ, shelf, and allpass locked filters are preserved but not integrated into the optimization target
- Example: Setting a high-pass or low-pass filter will preserve that behavior instead of trying to correct it
- Locked filters' frequency response is calculated and multiplied with the target curve for optimization
[1.1.1] - 2025-10-19
Added
- Preferences for default values.
- Configurable sweep frequency range: Users can now set custom lower and upper limits for measurement sweeps.
- Default: 0.1 Hz to Nyquist (full bandwidth).
- Manual controls: start frequency adjustable from 0.1 Hz to 20 kHz; end frequency up to Nyquist.
- “Reset Range” button to quickly return to full bandwidth.
- Automatic Nyquist limiting based on current sample rate.
- Typical use cases:
- Subwoofers: 20 Hz-200 Hz
- Tweeters: 2 kHz-20 kHz
- Full-range: 20 Hz-20 kHz
- Frequency values are automatically rounded to maintain optimal phase coherence whenever possible.
Improved
- FIR delay now shown directly in graph legends for a cleaner UI.
- Maximum of 10 speakers supported for complex setups.
- Improved layout of settings.
- Labels refined for a clearer interface.
[1.1.0] - 2025-10-18
Added
- Added "Save" menu item in File menu for easier project saving
- Added adaptive display window for impulse and step responses with long filters (>10000 taps)
- Added progress toast with progress bar during IR measurements showing estimated completion time
Fixed
- Fixed window positions jumping when renaming impulse responses
- Fixed filter configuration windows (LP, HP, Correction, IIR) disappearing when changing IR names
- Fixed collapsing headers closing unexpectedly when renaming drivers
- Fixed autosave not triggering when changing IR names
- Fixed crash when n_taps exceeds FFT size in impulse correction filter generation
Improved
- Simplified impulse response management window interface
- Impulse and step response plots now automatically extend display window for very long filters based on peak position
- Enhanced toast notifications with shadow effects for better visibility
[1.0.9] - 2025-10-16
Added
Added lockable IIR filters in AutoEQ mode
Added timing reference via loopback (Electric) or pre-chirp reference (Acoustic)
Added phase graph with wrapped/unwrapped display
Added adjustable delay compensation for raw impulse response (in IR Window management)
IIR filter export functionality in File -> Export menu- FQG format (Frequency, Q, Gain): Simple text format for filter parameters
- CamillaDSP format: YAML configuration for direct import into CamillaDSP
- Exports global IIR filters and per-speaker IIR filters separately
- Supports all filter types: Butterworth, Linkwitz-Riley, Bessel, PEQ, Shelving, Allpass
- Only active filters are exported
- Respects Manual/Auto-EQ tab selection
[1.0.8] - 2025-10-15
[1.0.7] - 2025-10-13
Added
- Added FRD and txt impulses support
Improved
- Improved latency compensation for sweep measurements
- Improved sweep error messages with notifications
- Improved audio support for Windows