• Welcome to ASR. There are many reviews of audio hardware and expert members to help answer your questions. Click here to have your audio equipment measured for free!

LinFIR – DSP Software for FIR/IIR Filter Design and Speaker Correction

LinFIR v1.1.14 is now available.

This is a major UI/analysis update with several long-requested features and internal refactoring.

Added
  • Theme selector moved to Settings > General > Appearance for a cleaner and more consistent UI
  • New “Time-centered Phase” mode (toggle + shortcut C)
    • Removes the linear phase component to make driver alignment clearer
    • Applies in Speakers view to all visible curves
    • Optional default in Settings
  • Customizable magnitude plot bounds
    • Adjustable dB range for driver magnitude plots
    • Adjustable lower bound for FIR/IIR magnitude plots (down to -200 dB)
Improved
  • Internal project data fully refactored into a unified structure
    • Legacy migration ensures backward compatibility
    • Prepares the ground for future features
  • Phase and GD truncation now uses a magnitude threshold (in dB) instead of octave-based margins
    • Separate thresholds per context (Speakers, IIR, FIR, combined)
    • Default: -50 dB, configurable in Settings
Removed
  • “View” menu, now redundant — appearance controls are all in Settings
Fixed
  • Phase display no longer applies fractional octave smoothing
    • Fixes visual artifacts and slope irregularities
    • Phase is now shown raw and correct; GD smoothing unchanged
  • IIR and FIR+IIR GD now always derived from unwrapped phase
    • Eliminates wrap-induced artifacts
    • “Unwrap Phase” is now purely visual
This update greatly improves the clarity of phase-related plots, customizability of visual scaling, and overall project robustness.

Let me know if you run into any issues or have feature requests.
 
LinFIR v1.1.17 is now available.

This is a major update focused on phase correction, visualization flexibility, and robustness.

Added
  • New direct phase correction algorithm
    • Works directly with unwrapped phase (no GD integration)
    • Removes linear phase before smoothing for more stable correction
    • Better impulse symmetry without arbitrary offsets
    • Reproducible results across parameter sets
    • Band-limited correction with constant phase continuation outside the working band
    • Cleaner behavior at band edges
  • Phase offset control for correction
    • Continuous slider from –180° to +180°
    • Replaces binary polarity inversion
    • Allows fine control of acoustic polarity and pre-ringing symmetry
    • Applied after correction and before spectral synthesis
  • Detached graph windows
    • Right-click any plot → “Open in separate window”
    • Multiple independent windows supported
    • Live-updating, resizable, closeable (Cmd/Ctrl+W)
    • Each window preserves the display mode captured at detachment
  • Automatic phase alignment in unwrapped view
    • Removes relative offsets for clearer comparison
    • Works with or without time-centered phase
    • Speakers mode: aligns all drivers to the Sum curve
    • FIR/IIR modes: aligns filters to the first active one
    • Median-based passband alignment (robust to noise)
    • Makes crossover continuity immediately visible
Improved
  • Smart directional truncation for phase and group delay
    • Truncation now depends on active filter types
    • HP only → truncate low end
    • LP only → truncate high end
    • Both → truncate both sides
    • None → no truncation (e.g., PEQ-only)
    • Applies across all contexts (FIR, IIR, combined, speakers, global)
Fixed
  • Undo/Redo no longer affects visualization toggles or display settings
  • FRD import crash
    • Fixed overflow during impulse rotation with excessive GD
    • Proper bounds checking and safer handling of pathological files
  • FRD phase extrapolation artifacts
    • Now uses average GD for out-of-band extrapolation
    • Prevents divergence and negative GD
    • Eliminates impulse artifacts at extension edges
Let me know if you encounter any issues or have feature suggestions.
 
Work in progress! :D

Capture d’écran 2025-11-28 à 17.18.47.png
 
I’m hoping to release v1.2.0 soon, it’s a big update with plenty of new features.

The new Directivity module (sonograms, DI, off-axis measurements, etc.) will be available as a one-time license.

On the other hand, the new Room Calibration mode will remain free. It automatically time-aligns and averages multiple measurements to reduce the impact of room modes on EQ.

The target curves have also been improved, and there’s now a dedicated tool to easily shape your preferred target.

Capture d’écran 2025-12-11 à 15.25.36.png
 
I’m glad to announce LinFIR v1.2.0, a major update that introduces new analysis modes, new processing tools, and significant internal changes.

The two main additions in this release are the new Room Calibration mode and the Directivity Analysis tools.

Room Calibration mode complements the existing Loudspeaker Design mode and is intended for in-room measurements and correction work. Multiple measurements are automatically time-aligned using the GCC-PHATalgorithm with subsample accuracy, then averaged to reduce the impact of room modes before filter generation. Loudspeaker Design mode remains unchanged and continues to offer the full crossover, phase, and system design workflow.

The Directivity Analysis tools (available as an optional licensed module) add off-axis response visualization, predicted Directivity Index (DI) curves, and vertical and horizontal sonograms. Directivity predictions account for driver interaction and filtering choices and require impulse responses that preserve time of flight, making them suitable for crossover development and radiation control analysis. All other LinFIR features remain free.

This release also integrates a full-featured FRD-to-IR Converter directly into LinFIR. FRD import is no longer a black box: the converter provides PCHIP interpolation, reconstruction error analysis, phase handling options (wrapped, unwrapped, time-centered), and optional minimum-phase transformation. Converted impulses are injected directly into the project, replacing the previous simplified import path.

Beyond new features, v1.2.0 includes performance, memory, and file-size optimizations, as well as fixes related to phase correction during resampling and high-frequency phase centering.

Because this version introduces deep changes to the project structure, signal-processing pipeline, and UI logic, there may still be edge cases or regressions that haven’t been caught yet. LinFIR is developed and maintained by a single person, so real-world testing and feedback are extremely valuable. If something looks off or behaves unexpectedly, please report it. Your feedback directly helps improve the software.

Thanks to everyone who has tested LinFIR, shared measurements, and provided thoughtful feedback. It genuinely helps push the project forward.
 
I’ve just released LinFIR v1.2.1 (Windows version should be available in a few hours).

This update is primarily focused on a completely redesigned documentation system, along with a few safety and usability improvements based on recent feedback.

The main change is the move from the previous in-app help to a full web-based documentation system, built with mdBook and embedded directly into the application. The documentation is served locally (offline) via a built-in HTTP server and includes integrated search, theme-aware screenshots (light and dark modes), and a much more structured presentation of the workflow. It currently covers 17 detailed pages spanning measurement, FIR and IIR design, phase correction, room calibration, and export paths. You can access it via Help > Documentation or by pressing H.

In addition, LinFIR now performs import validation checks when loading impulse responses from WAV or TXT files. If the main impulse peak is located unusually far in time (beyond 20 ms), a warning is displayed, as this often indicates incorrect delay handling or unsuitable preprocessing. A second validation checks for low signal levels (below −25 dBFS), which typically point to poor signal-to-noise ratio and can compromise both correction quality and phase visualization.

Finally, a small but important fix addresses a driver naming issue in HFD export, where drivers were incorrectly labeled in the group mapping interface.

As always, feedback is very welcome. Documentation in particular is an ongoing effort, and I’m sure there are still areas that can be clarified or expanded further.

Thanks to everyone who continues to test, question, and challenge LinFIR.
 
I've been playing with your app recently just to get the feel for it and how the tools work. The added documentation will be helpful. I haven't tried it yet in speaker mode where XOs are worked out but looking forward to having some time to compare results with what I have already worked out. The room mode seems to generate decent filters.

Adjusting levels by moving the mouse sideways is funky and difficult with a trackpad, any chance that can be switched to a vertical orientation and results changed with scroll wheel like in REW or rePhase and many other audio apps?

What does the "causality" feature affect?
 
I've been playing with your app recently just to get the feel for it and how the tools work. The added documentation will be helpful. I haven't tried it yet in speaker mode where XOs are worked out but looking forward to having some time to compare results with what I have already worked out. The room mode seems to generate decent filters.

Adjusting levels by moving the mouse sideways is funky and difficult with a trackpad, any chance that can be switched to a vertical orientation and results changed with scroll wheel like in REW or rePhase and many other audio apps?

What does the "causality" feature affect?
I am unfortunately bounded to the library I'm using for field interactions. But you can also click on the field and use the up and down keys of your keyboard to change the values. I also find the sliding operation tedious.

The causality parameter lets you adjust the phase properties of the filter 0 -> linear phase, 1-> minimum phase. To be a bit technical, it allows to adjust the causal and anti-causal proportions of the filter in the cepstrum domain. It is called homomorphic filtering, and I find it useful in this case to balance phase linearity vs. FIR delay.

I would advise to let the FIR crossovers linear phase if some delay can be tolerated (it's much easier to design) and use minimum phase (causality = 1.0) FIR correction filters. Most of the time, minimum phase corrections help flattening the phase with well behaved drivers (minimum-phase behaviour). But this is only valid with anechoic measurements with a flat magnitude target.
 
The full documentation is now available online:

LinFIR 1.2.2 will open it if internet connectivity is available, otherwise it will be served locally.

Excellent Arnwald. I just read thru the full documentation.
The overall advice, best practices, how specific items work, and warnings are all excellent imo..
I've spent many years coming to the same realizations/conclusions...how nice it would have been to have encountered them clearly laid out like you've done, when I waded into FIR and multi-way DIY years ago.
Well done :)

(Ps. Sorry I've been unable to follow thru with testing and providing feedback. Hopefully that's about to change as a major non-audio project has concluded.)
 
I've been playing with this tool most of the day for multi driver speaker design and I gotta say it's pretty frustrating. Lots of app crashes especially when removing or adding a driver. I'm using a M2 Mac mini with 24GB RAM which usually chews through pretty much anything on my 3 way active XO +2 subs on 8 channels and hosting filters via Mitch's Hang Loose Convolver. Typically my low end uses up to 65k taps using rePhase but I've tried using your suggested 4096. Also frustrating to use acoustic timing reference when I have a spare channel on my Focusrite 2i2 that can do it electrically but for some reason your app only allows it on 4x4 devices?

I've read through the new documentation and it is excellent, well thought out and presented and the GUI is beautiful too if not a little slow on rendering at times.

So far I have not been able to create any filters usable in a .cfg file. I get warnings that "filters may introduce clipping!" even when I turn off the filters or disable the driver so I adjust mic levels (again) making sure to get good averages on 4 sweeps yet get different results with the same settings and the circle continues. It seems to only report potential clipping on the top filter or global filter. I'd be happy to send a .lnf file if you want to dig into it and tell me where I'm going wrong. I've done beta testing for quite a few of audio apps so if you'd like to take this off the forums to troubleshoot that's fine.
 
Thanks for the detailed feedback.

About the crashes:
This is the first report I've received of crashes during these operations, so I'd like to investigate. Could you:
  1. Reproduce the crash
  2. Use Help → Report Bug to generate a crash report
This will help me track down what's happening

You should absolutely be able to use electrical timing reference with your Focusrite 2i2. Nothing in the code restricts this to 4x4 devices. Could you send a screenshot of what you're seeing? There might be a UI issue I need to fix, or perhaps a misunderstanding of how to configure it.

About 65k taps and performance, a few things to clarify here:
  • 65k taps is extremely excessive for any practical speaker correction
  • In anechoic conditions, >4096-4500 taps provides no additional benefit
  • For low-end correction specifically, IIR filters are the better tool, they're more efficient
In-room measurements: I'd strongly advise against trying to correct low-end phase and magnitude with heavy FIR filters in room measurements. You'll be attempting to fix standing waves and reflections, which will cause more problems than it solves.

Performance considerations: LinFIR reproduces the entire signal chain in real-time, it convolves all filters for all drivers continuously to show you the actual result. This is very different from rePhase, where you click "generate" once. With reasonable filter sizes (e.g. 1500-4500 taps in a 4 way setup), LinFIR runs smoothly even on an M1 MacBook Pro with 16GB RAM. With 65k taps across multiple drivers, the computational load becomes extreme.

I'll add a performance considerations section to the documentation to clarify these limits.

The "filters may introduce clipping" warning can be disabled in settings, but it's there for an important reason: even filters with visually reasonable frequency responses can cause temporal peaks that exceed 0 dBFS. Phase distortion (or correction) can shift frequency components in time, causing them to align constructively at certain moments. Classic example: a square wave with magnitude 1.0 can exceed 1.0 after phase processing, even though the Fourier magnitude hasn't changed.

The warning is based on a 32-tone test signal and is independent of your sweep levels, it's purely analyzing the filter behavior.

Potential bug: If the warning persists even with filters disabled, that's likely a bug where disabled filters are still being checked. I'll investigate this.

I'd be very happy to look at your .lnf file to see what's happening. Feel free to send it (here or privately if you prefer).

Thanks again for your feedback!
 
Last edited:
I'm aware of low frequency phase corrections and haven't used any with my measurements except to experiment in the 350Hz+ range.

Here's a pic of what prevents electrical TR:
tm.jpg

I tried sending a bug report but not sure if it went through because the app hung for a long time so here's a copy of the log file from my end and my .lnf file. The file may be corrupted too, sometimes the app auto-saves too quickly when you're editing and saves a current state over the existing so when a crash occurs you get the last thing you were doing instead of a stable save.

The lnf file should contain some measurements from 2 subs at the LP along with some driver measurements taken 1m from baffle for woofer, mid and tweeter.

edit: looks like the .lnf file is too large for ASR, I'll contact you through your website with my info.
 

Attachments

Last edited:
Indeed.
By default the minimum number of channels is configured for inputs and outputs (to avoid overheads). You can set the number of input channels to 2 instead of 1 and it should work.

I will investigate the rest (I received the bug report).
 
LinFIR v1.2.6 is now available.

This release focuses primarily on performance, stability, and algorithmic robustness, especially when working with long or imperfect impulse responses, while also adding a new IIR export format.

A significant amount of work went into making LinFIR more resilient. Internal data structures were hardened to prevent rare crashes when adding or removing drivers or measurements. Impulse response handling was improved across the board, with dynamic FFT sizing and stricter validation to avoid performance degradation caused by excessively delayed or malformed IRs.

Several core DSP algorithms were refined for better numerical stability and reproducibility. Phase correction is now more robust near Nyquist and less sensitive to high-frequency noise. The auto causal alignment logic has been redesigned to use energy-based placement rather than simple peak detection, resulting in cleaner impulse symmetry and reduced truncation artifacts. Time-centered phase calculation and resampling were also reworked to improve accuracy and stability, particularly for long-delay responses.

Performance optimizations reduce computation time when dealing with long impulse responses by minimizing unnecessary zero-padding and oversized FFTs, while preserving frequency-domain accuracy.

On the usability side, audio input defaults were improved to provide a more reliable out-of-the-box experience for electric loopback timing references, and logging was clarified to make debugging easier.

In addition to these under-the-hood changes, v1.2.6 adds Q-SYS CSV export for IIR filters, enabling direct import into Q-SYS Custom Filter components, and includes further documentation refinements to better explain LinFIR’s design philosophy and timing requirements.

Overall, this update strengthens LinFIR’s foundations, making it faster, safer, and more predictable when working with complex projects.
 
Still no Linux version?
 
Back
Top Bottom