I am a speaker enthusiast in South Korea who enjoys DIY speaker projects and am primarily active on the DCInside speaker gallery (a Korean website) under the same username. I have been engaged in this topic for more than a year as a post-work hobby. Through this post, I would like to share some of the results of my work, and hope to offer ideas to others who would like to do DIY cardioid projects.
Terminology:
In this article, the terms “active” and “passive” do not refer to amplification or crossover network types but rather to two methods of achieving cardioid directivity in speakers. In active cardioid systems, two or more independently operating drivers are used to achieve cardioid directivity (as in the Kii Three). In contrast, passive cardioid systems recycle the rear wave of a driver by using resistive materials inside the enclosure and emitting it through precisely engineered slits (for example, in the D&D 8c). There also exists a method employing multiple drivers dependent on passive crossover networks (although I have not encountered any commercial examples), which I also classify as passive implementation.
1. Introduction
Due to physical constraints, speakers tend to be omnidirectional at low frequencies—and this effect can extend to higher frequencies as the speaker size decreases. Such behavior may lead to unwanted early reflections, which can degrade the listening experience, especially in smaller rooms.
One solution to overcome these physical limitations is the cardioid system. By reproducing a time-delayed, phase-inverted sound wave at a specific point behind the speaker driver, rearward sound waves can be effectively canceled. This creates a heart-shaped directivity pattern, known as a cardioid.
These days, this cardioid technology is widely adopted in the high-end speaker industry. However, while the theory is well-known, practical implementation methodologies remain scarce.
Furthermore, most DIY discussions around cardioid systems focus on passive implementations. Companies like Geithain, Dutch & Dutch, and Sigberg use this technology by making slits in the speaker enclosure, filling the interior with acoustically absorptive materials, and leveraging the rear wave of the driver escaping through the slits to achieve cardioid directivity. However, this method is highly dependent on factors such as driver size, enclosure design, slit dimensions and shape, and the uniformity and density of the absorptive materials, therefore requiring iterative testing with multiple enclosures. While simulators like AKABAK can help in this process, accurately simulating internal absorptive materials remains a challenge.
Active implementation, while less efficient and requiring multiple DSP channels and amplifiers, allows for greater flexibility in modifying driver frequency responses via DSP and reduces dependency on enclosure design, making it more suitable for DIY applications.
Among active cardioid speakers, one of the most popular models is the Kii Three. The Kii Three employs a 3-way (excluding the tweeter) cardioid technology with a midrange driver, two side woofers, and two rear woofers to achieve full-range cardioid directivity. The following is a video in which Bruto Putzey, the developer of the Kii Three, explains its operating principles.
Other active cardioid models, such as the Kii Seven, Mesanovic CDM65, and GGNTKT M1, typically employ only side or rear woofers (thereby 2-way) to achieve cardioid directivity. Since optimizing a 3-way cardioid inherently includes the optimization process for 2-way systems, this post focuses solely on implementing 3-way cardioid systems like the Kii Three. In my experience, optimizing a 2-way cardioid system is much simpler compared to a 3-way system and can easily be done manually.
Optimization of a 3-way cardioid system is quite challenging to approach initially. This post aims to demonstrate that the desired polar pattern can be achieved by adopting a simple optimization algorithm and using modern computational power.
2. Preliminaries
2.1 Speaker Build
I designed an enclosure by referencing the structure of the Kii Three. The crucial point here is that the acoustic center distance between the midrange driver and the side woofers has to be kept as short as possible. In active cardioid systems, the distance between these acoustic centers is one of the most critical factors.
The enclosure was divided into three chambers: one each for the tweeter and midrange, and one for the side and rear woofers. For simplicity, the system was constructed without internal amplifiers, using only a single 4-pin SpeakON connector. DAC, DSP, and amplifiers are located externally. Specifically, I used the following equipment, all of which can be replaced with alternatives:
2.2 Measurement
Accurate measurement is very crucial to minimize discrepancies between simulated and actual results. A good guide for quasi-anechoic measurements is available here:
https://www.audiosciencereview.com/...ents-spinoramas-with-rew-and-vituixcad.21860/
Ground plane measurements can also be used if sufficient accuracy is ensured. I was fortunate enough to use a full-anechoic chamber with a cutoff frequency of approximately 100 Hz. Measurements were conducted using an Earthworks M30 microphone and a custom motorized turntable controlled by Arduino. The image below is my first setup, when I didn't build the motorized turntable yet.
In the measurement, maintaining consistent time references across all drivers during measurements is critical, as active cardioid systems are highly sensitive to relative time delays. In my setup, REW’s loopback reference feature was used to ensure timing consistency. I obtained four measurements by individually measuring the tweeter, midrange, side woofers, and rear woofers. However, measuring the tweeter and midrange as a single driver by crossing them over is perfectly acceptable, and actually more efficient in terms of VRAM usage.
While Spinorama requires 10° measurement intervals, I advocate for 5° or even 3° intervals to enable more precise adjustments to the desired directivity pattern. For 3° interval measurements, a total of 960 measurements are required for 4 drivers, so it is highly recommended to build a motorized turntable and automate the measurement process.
2.3 Tweeter Crossover
Crossover the tweeter and midrange drivers. This process is explained in detail by purifi-audio on their blog, so refer to the following link:
https://purifi-audio.com/blog/tech-notes-1/time-phase-alignment-acoustic-center-lobing-etc-14
3. Optimization
3.1 Theoretical Background
Ideally, a perfect cardioid pattern can be achieved by placing two perfectly omnidirectional drivers at an appropriate distance, inverting the phase of the rear driver, and applying a delay corresponding to that distance.
In practical implementation, it is advisable for a specific bass driver to be low-passed. This can be easily implemented using a simple second-order crossover filter (alternatively, a more complex FIR filter could be employed).
In reality, the two drivers mounted in the enclosure exhibit directional mismatches. Since modifying a driver’s response in specific directions is impossible, the primary objective is to ensure the combined response achieves the desired directivity pattern, while the secondary objective is to maximize rear cancellation.
The primary objective can be easily achieved using simple IIR filters if the speaker is properly designed for active cardioid. However, the secondary objective is considerably more complex. Instead of mathematically deriving the ideal filters, I opted for a simpler approach: leveraging modern computing power. While VituixCAD offers a similar optimization feature called “Optimizer”, it has limitations in setting desired targets and, due to its reliance on CPU processing, exhibits significant constraints when exploring high-dimensional variables.
To find the desired solution, I applied Particle Swarm Optimization (PSO), a straightforward optimization algorithm based on swarm intelligence. In PSO, individual particles work together to explore the solution space efficiently. This approach allows each particle to be easily parallelized on GPUs using PyTorch. For a detailed description, refer to:
https://en.wikipedia.org/wiki/Particle_swarm_optimization
3.2 Parameter Setup
The optimization parameters were:
The PEQs spanned frequencies from 100 Hz to 1000 Hz on a logarithmic scale, with gains ranging from –6 to 6 dB and Q factors from 1 to 5. The optimization cost was defined as the normalized SPL average between 100 Hz–1000 Hz and 90°–180°. To prevent excessive convergence at specific positions, SPL values below –30 dB were clamped to –30 dB in simulation. A constraint was added to ensure that the –3 dB point between 200 Hz–1000 Hz fell within 57°–63°. I used the Nvidia A100 for the experiment, and to verify whether effective exploration is possible with common GPUs, RTX 3070 and Google Colab were also utilized.
For faster convergence, it is advisable to appropriately define the range of each parameter and select suitable initial values. It doesn't need extreme precision and can be easily be achieved using VituixCAD. Here is an example image showing my initial values.
3.3 Algorithm
4. Results
Since this is not an academic paper, detailed data on the convergence process is omitted. Only the directivity plot of the final result data is shared here.
The simulated result:
The measurement result:
Despite my efforts to reduce measurement errors, a noticeable degree of error still remained. This underscores the importance of precise measurement.
5. Observations
The following observations were made in this experiment:
6. Conclusion
I explored the process of optimizing a 3-way active cardioid system using a global optimization algorithm. These results demonstrate the following:
The optimization program was developed entirely from scratch using Python. Since it was developed specifically for this project and, as it is tailored to my experimental setup, it cannot be generalized for public release. Therefore, it is not shared here, but I have provided a detailed description of the algorithm used.
Working on several cardioid projects, I noticed that information on this topic is surprisingly scarce. I hope this article offers some inspiration to DIY enthusiasts.
Terminology:
In this article, the terms “active” and “passive” do not refer to amplification or crossover network types but rather to two methods of achieving cardioid directivity in speakers. In active cardioid systems, two or more independently operating drivers are used to achieve cardioid directivity (as in the Kii Three). In contrast, passive cardioid systems recycle the rear wave of a driver by using resistive materials inside the enclosure and emitting it through precisely engineered slits (for example, in the D&D 8c). There also exists a method employing multiple drivers dependent on passive crossover networks (although I have not encountered any commercial examples), which I also classify as passive implementation.
1. Introduction
Due to physical constraints, speakers tend to be omnidirectional at low frequencies—and this effect can extend to higher frequencies as the speaker size decreases. Such behavior may lead to unwanted early reflections, which can degrade the listening experience, especially in smaller rooms.
One solution to overcome these physical limitations is the cardioid system. By reproducing a time-delayed, phase-inverted sound wave at a specific point behind the speaker driver, rearward sound waves can be effectively canceled. This creates a heart-shaped directivity pattern, known as a cardioid.
These days, this cardioid technology is widely adopted in the high-end speaker industry. However, while the theory is well-known, practical implementation methodologies remain scarce.
Furthermore, most DIY discussions around cardioid systems focus on passive implementations. Companies like Geithain, Dutch & Dutch, and Sigberg use this technology by making slits in the speaker enclosure, filling the interior with acoustically absorptive materials, and leveraging the rear wave of the driver escaping through the slits to achieve cardioid directivity. However, this method is highly dependent on factors such as driver size, enclosure design, slit dimensions and shape, and the uniformity and density of the absorptive materials, therefore requiring iterative testing with multiple enclosures. While simulators like AKABAK can help in this process, accurately simulating internal absorptive materials remains a challenge.
Active implementation, while less efficient and requiring multiple DSP channels and amplifiers, allows for greater flexibility in modifying driver frequency responses via DSP and reduces dependency on enclosure design, making it more suitable for DIY applications.
Among active cardioid speakers, one of the most popular models is the Kii Three. The Kii Three employs a 3-way (excluding the tweeter) cardioid technology with a midrange driver, two side woofers, and two rear woofers to achieve full-range cardioid directivity. The following is a video in which Bruto Putzey, the developer of the Kii Three, explains its operating principles.
Other active cardioid models, such as the Kii Seven, Mesanovic CDM65, and GGNTKT M1, typically employ only side or rear woofers (thereby 2-way) to achieve cardioid directivity. Since optimizing a 3-way cardioid inherently includes the optimization process for 2-way systems, this post focuses solely on implementing 3-way cardioid systems like the Kii Three. In my experience, optimizing a 2-way cardioid system is much simpler compared to a 3-way system and can easily be done manually.
Optimization of a 3-way cardioid system is quite challenging to approach initially. This post aims to demonstrate that the desired polar pattern can be achieved by adopting a simple optimization algorithm and using modern computational power.
2. Preliminaries
2.1 Speaker Build
I designed an enclosure by referencing the structure of the Kii Three. The crucial point here is that the acoustic center distance between the midrange driver and the side woofers has to be kept as short as possible. In active cardioid systems, the distance between these acoustic centers is one of the most critical factors.
The enclosure was divided into three chambers: one each for the tweeter and midrange, and one for the side and rear woofers. For simplicity, the system was constructed without internal amplifiers, using only a single 4-pin SpeakON connector. DAC, DSP, and amplifiers are located externally. Specifically, I used the following equipment, all of which can be replaced with alternatives:
- Motu Ultralite mk5 audio interface with DAW
- 3e Audio 260-2-29A * 4
- SEAS H1499-06 27TBCD/GB-DXT * 1
- SB Acoustics SB15NBAC * 1
- Dayton DCS165-4 * 4
2.2 Measurement
Accurate measurement is very crucial to minimize discrepancies between simulated and actual results. A good guide for quasi-anechoic measurements is available here:
https://www.audiosciencereview.com/...ents-spinoramas-with-rew-and-vituixcad.21860/
Ground plane measurements can also be used if sufficient accuracy is ensured. I was fortunate enough to use a full-anechoic chamber with a cutoff frequency of approximately 100 Hz. Measurements were conducted using an Earthworks M30 microphone and a custom motorized turntable controlled by Arduino. The image below is my first setup, when I didn't build the motorized turntable yet.
In the measurement, maintaining consistent time references across all drivers during measurements is critical, as active cardioid systems are highly sensitive to relative time delays. In my setup, REW’s loopback reference feature was used to ensure timing consistency. I obtained four measurements by individually measuring the tweeter, midrange, side woofers, and rear woofers. However, measuring the tweeter and midrange as a single driver by crossing them over is perfectly acceptable, and actually more efficient in terms of VRAM usage.
While Spinorama requires 10° measurement intervals, I advocate for 5° or even 3° intervals to enable more precise adjustments to the desired directivity pattern. For 3° interval measurements, a total of 960 measurements are required for 4 drivers, so it is highly recommended to build a motorized turntable and automate the measurement process.
2.3 Tweeter Crossover
Crossover the tweeter and midrange drivers. This process is explained in detail by purifi-audio on their blog, so refer to the following link:
https://purifi-audio.com/blog/tech-notes-1/time-phase-alignment-acoustic-center-lobing-etc-14
3. Optimization
3.1 Theoretical Background
Ideally, a perfect cardioid pattern can be achieved by placing two perfectly omnidirectional drivers at an appropriate distance, inverting the phase of the rear driver, and applying a delay corresponding to that distance.
In practical implementation, it is advisable for a specific bass driver to be low-passed. This can be easily implemented using a simple second-order crossover filter (alternatively, a more complex FIR filter could be employed).
In reality, the two drivers mounted in the enclosure exhibit directional mismatches. Since modifying a driver’s response in specific directions is impossible, the primary objective is to ensure the combined response achieves the desired directivity pattern, while the secondary objective is to maximize rear cancellation.
The primary objective can be easily achieved using simple IIR filters if the speaker is properly designed for active cardioid. However, the secondary objective is considerably more complex. Instead of mathematically deriving the ideal filters, I opted for a simpler approach: leveraging modern computing power. While VituixCAD offers a similar optimization feature called “Optimizer”, it has limitations in setting desired targets and, due to its reliance on CPU processing, exhibits significant constraints when exploring high-dimensional variables.
To find the desired solution, I applied Particle Swarm Optimization (PSO), a straightforward optimization algorithm based on swarm intelligence. In PSO, individual particles work together to explore the solution space efficiently. This approach allows each particle to be easily parallelized on GPUs using PyTorch. For a detailed description, refer to:
https://en.wikipedia.org/wiki/Particle_swarm_optimization
3.2 Parameter Setup
The optimization parameters were:
- Midrange: 1 HPF (LR12), 2 allpass filters
- Side woofer: 1 LPF (LR12), 10 PEQs, 1 delay, 2 allpass filters
- Rear woofer: 1 LPF (LR12), 10 PEQs, 1 delay, 2 allpass filters
The PEQs spanned frequencies from 100 Hz to 1000 Hz on a logarithmic scale, with gains ranging from –6 to 6 dB and Q factors from 1 to 5. The optimization cost was defined as the normalized SPL average between 100 Hz–1000 Hz and 90°–180°. To prevent excessive convergence at specific positions, SPL values below –30 dB were clamped to –30 dB in simulation. A constraint was added to ensure that the –3 dB point between 200 Hz–1000 Hz fell within 57°–63°. I used the Nvidia A100 for the experiment, and to verify whether effective exploration is possible with common GPUs, RTX 3070 and Google Colab were also utilized.
For faster convergence, it is advisable to appropriately define the range of each parameter and select suitable initial values. It doesn't need extreme precision and can be easily be achieved using VituixCAD. Here is an example image showing my initial values.
3.3 Algorithm
- Input:
• X ∈ ℝ^(D×A×F×3) (each element = (f, SPL, φ))
• B ∈ ℝ^(n×2) (parameter bounds: [min, max] for each of n parameters)
• N ∈ ℕ (number of particles)
• T ∈ ℕ (maximum iterations)
• w ∈ ℝ, c₁ ∈ ℝ, c₂ ∈ ℝ (inertia weight and acceleration coefficients)
• (Optional) θ₍init₎ ∈ ℝⁿ (custom initial parameter vector)
• Objective function f(θ, X) defined via a signal processing pipeline - Output:
• θ_best ∈ ℝⁿ minimizing f(θ, X) - Step 1: Initialization
For i = 1, 2, …, N:
• θᵢ ← random value ∈ B (or set θᵢ = θ₍init₎ if provided)
• vᵢ ← random velocity
• pᵢ ← θᵢ (personal best)
• Compute cost cᵢ = f(θᵢ, X)
End for
Set global best:
θ_best ← argmin₍ᵢ₌₁…N₎ f(θᵢ, X) - Step 2: Define the Processing Pipeline (Objective Function f)
f(θ, X) is computed by:
a. Applying parametric peak filters using filter parameters extracted from θ.
b. Applying crossover filtering (e.g., HPF/LPF via Linkwitz-Riley)
c. Applying delays according to delay parameters.
d. Applying allpass filtering according to allpass parameters
e. Combining driver outputs (via complex summation) and normalizing the result.
f. Evaluating cost based on averaged SPL and penalty conditions (if thresholds on frequency/angle are exceeded). - Step 3: Phase 1 – Exploration
For t = 1 to T:
For each particle i:
Compute cᵢ = f(θᵢ, X)
If cᵢ < f(pᵢ, X), then set pᵢ ← θᵢ
End for
Update global best:
θ_best ← θⱼ, where f(θⱼ, X) = min { f(θ₁, X), f(θ₂, X), …, f(θ_N, X) }
For each particle i, update:
vᵢ ← w·vᵢ + c₁·r₁·(pᵢ – θᵢ) + c₂·r₂·(θ_best – θᵢ)
θᵢ ← clamp(θᵢ + vᵢ, B) (ensure θᵢ ∈ B)
End for - Step 4: Phase 2 – Exploitation
Repeat the update loop until the improvement Δ in f(θ_best, X) over a fixed checkpoint interval is less than a predefined threshold:
• Recompute cᵢ = f(θᵢ, X) for all i
• Update personal bests pᵢ and global best θ_best as in Step 3
• Update velocities vᵢ and positions θᵢ as in Step 3
• Terminate when Δ < ε (a small threshold) - Step 5: Return
Output θ_best and its associated cost f(θ_best, X).
4. Results
Since this is not an academic paper, detailed data on the convergence process is omitted. Only the directivity plot of the final result data is shared here.
The simulated result:
The measurement result:
Despite my efforts to reduce measurement errors, a noticeable degree of error still remained. This underscores the importance of precise measurement.
5. Observations
The following observations were made in this experiment:
- When the same target is set, although the individual parameters may differ significantly, they ultimately converge in a similar shape.
- Even if a specific parameter is fixed, the desired directivity can still be achieved provided that sufficient degrees of freedom are available for the other parameters to compensate.
- While utilizing a good GPU facilitates more parallel computations at once, it was not a strict requirement for this method. When initial values are appropriately provided, even the free GPU allocation on Google Colab was sufficient to achieve a satisfactory level of convergence.
- Selecting appropriate hyperparameters (w, c₁, c₂) and adjusting them during the search process contributes to faster convergence.
6. Conclusion
I explored the process of optimizing a 3-way active cardioid system using a global optimization algorithm. These results demonstrate the following:
- Directivity comparable to that of premium commercial cardioid speakers can be achieved.
- It demonstrated the potential to automate the traditional manual and iterative simulation process.
- Although this algorithm inherently suffers from multiple local minima, with sufficient iterations, the overall response eventually converges with a consistent solution, rendering this drawback inconsequential.
The optimization program was developed entirely from scratch using Python. Since it was developed specifically for this project and, as it is tailored to my experimental setup, it cannot be generalized for public release. Therefore, it is not shared here, but I have provided a detailed description of the algorithm used.
Working on several cardioid projects, I noticed that information on this topic is surprisingly scarce. I hope this article offers some inspiration to DIY enthusiasts.