Configure FFmpeg acrossover Frequencies and Filter Orders
This article explains how to use the FFmpeg acrossover
audio filter to split an input audio signal into multiple frequency
bands. You will learn how to define custom crossover frequencies, select
the appropriate filter order to control the steepness of the division,
and map the resulting output streams in a practical command-line
example.
The acrossover Filter Syntax
The acrossover filter splits an audio stream into
several frequency bands using Linkwitz-Riley crossovers. The basic
syntax is:
acrossover=split='freq1 freq2 ...':order=valueThe filter creates \(N + 1\) output pads, where \(N\) is the number of split frequencies specified. For example, if you define two split frequencies, the filter will output three separate audio bands (low, mid, and high).
Configuring Split Frequencies
The split parameter accepts a space-separated list of
frequency values in Hertz. These values must be listed in strictly
ascending order.
Single Split (2 Bands): Splitting at 1000 Hz separates the audio into Low (< 1000 Hz) and High (> 1000 Hz).
split='1000'Multiple Splits (3 Bands): Splitting at 500 Hz and 3000 Hz separates the audio into Low (< 500 Hz), Mid (500 Hz to 3000 Hz), and High (> 3000 Hz).
split='500 3000'
Configuring Filter Orders
The order parameter determines the steepness of the
filter roll-off at the crossover frequency points. A higher order
results in a steeper attenuation curve, which reduces the frequency
overlap between the split bands.
You can specify the filter order using either its numeric value or its text alias:
| Numeric Value | Text Alias | Steepness / Roll-off |
|---|---|---|
0 |
4th |
24 dB/octave (Linkwitz-Riley 4th order) |
1 |
8th |
48 dB/octave (Linkwitz-Riley 8th order) |
2 |
12th |
72 dB/octave (Linkwitz-Riley 12th order) |
3 |
16th |
96 dB/octave (Linkwitz-Riley 16th order) |
If you do not specify an order, FFmpeg defaults to 4th
(24 dB/octave).
Practical Command Example
To split an audio file into three bands with crossover points at 200
Hz and 2500 Hz using an 8th-order (48 dB/octave) filter, use the
following filter_complex command:
ffmpeg -i input.wav -filter_complex "acrossover=split='200 2500':order=8th[low][mid][high]" \
-map "[low]" low.wav \
-map "[mid]" mid.wav \
-map "[high]" high.wavIn this command: * split='200 2500' creates two
crossover points, resulting in three output streams. *
order=8th applies a steep 48 dB/octave slope at both 200 Hz
and 2500 Hz. * [low], [mid], and
[high] label the output pads of the filter. * The
-map options route each frequency-band stream to its own
output file.