Acoustic Horn Design – The Easy Way (Ath4)

@fluid - that worked, but no convenient way to look at the waveguide now?
You can export the mesh parts from ABEC to an STL, either with or without symmetry. You can run the mesh only first if you want to see it before simulating. Or you can just look at the drawing in ABEC once meshed. You can turn off the interface or anything else in the right sidebar.
 
success when converting back to gmsh version 4.6 and ath4.7. Now i can play, wanting to design some rectangular throated horns for AMT's, so will be trawling back through the 597 pages some someone who's done it before. Hoping to improve on the ones i built using super ellipses and an OS expansion.
1678011269558.png
 
Been playing further - looks like its the version of gmsh - that was the challenge. Running latest version with gmsh4.6 on a few of the examples fine. I have tried running a example file of danibosn's for a rectangular throat. https://www.diyaudio.com/community/threads/acoustic-horn-design-the-easy-way-ath4.338806/page-512 However it doesnt like the syntax of some of the commands in the file - ignoring them and still running, generating a profile that looks like a vase. Can throat adaptors only be implemented in the beta version 4.9... ?
 
Can throat adaptors only be implemented in the beta version 4.9... ?
Yes, that's a part of the 2-profile geometry (HornGeometry = 2) that was introduced in 4.9.

BTW, for Gmsh to work, you no longer need to copy any *.dll files, as Ath doesn't use any Gmsh library anymore (and it has been this way for quite a long time). All you need is to set a path to gmsh.exe in the main configuration file (ath.cfg). I can't tell what's wrong with the newer versions of gmsh. The older ones definitely work, I still use Gmsh 4.6 myself, but that's mainly because I'm lazy. I haven't tried any newer.
 
Last edited:
@fluid

I've downloaded the latest (non-beta) version and had previously downloaded version 4.8.0 (though I never did anything with it back then). I'm currently getting the following error in Version 4.8.2, but 4.8.0 works - running the exact same demo1.cfg file.

Any thoughts on what I may be doing wrong?

I sometimes get these errors when my geometry is especially radical. For instance, if I'm using the option that allows you to arbitrarily set the height and width.

Due to that, I usually save that option for last, and I try to get the waveguide as close to my target height and width as possible, before "squashing" it using those options.
 
In Solidworks we have "curvature combs" - do you know of a similar feature for gnuplot? Sometimes the horn adaptor interface area has inflections due to bad config numbers. I'd like to plot the curve to see curvature before I splend time importing.

guess something could be done with plot 'coords.txt' but I am uncertain on the name that gnuplot would call curvature or spline combs if it had that at all.

1678307817161.png
 
Last edited:
Each of the four pairs of Paraline throat adapters in the SBH-10 are a different height, the outer pairs longer than the inner. Though the entry and exits of the Paralines are all physically vertically aligned, the path length difference results in the equivalent of a curved array. The entry points of SBH-10 are also slightly offset from center to shift the HF plane wave up or down.

Are ATH waveguides suited for a Paraline plane wave? I've read discussion about the shape of the sound waves vs waveguide shape in the thread but I don't understand it. My intuition would be to design an ATH waveguide for a throat diameter that matches the diffraction slot width of the Paraline then run that curve straight up and down on both sides of the slot. Of course, my intuition is no doubt wrong.
 
Member
Joined 2007
Paid Member
Are ATH waveguides suited for a Paraline plane wave? I've read discussion about the shape of the sound waves vs waveguide shape in the thread but I don't understand it. My intuition would be to design an ATH waveguide for a throat diameter that matches the diffraction slot width of the Paraline then run that curve straight up and down on both sides of the slot. Of course, my intuition is no doubt wrong.
I'm doing this with planar waveguides. For the paraline the performance may be different if you are applying some curvature to the wavefront?
 
  • Like
Reactions: 1 user
Just to stay within context, this is the regular ST260 (again) -

View attachment 1141291
("SP" is the equvialent total radiated power, i.e. a FR of a point source radiating the same total power.
The on-axis ripple can be further eliminated, as was shown before, that's not addressed in this model.)

- I keep using it because it's small enough not to take a long time to calculate, yet it still covers all the design aspects.
That's a very pretty gnuplot setup. Can you share the script?
 
Kind of unrelated, but I asked chat GPT to write software that output a biradial horn flare curve. I actually got it to work and output a 3d stl of half a horn a few weeks back but I might try and make a simple, user interface that you can input parameters into, and get a nice STL. I’m gonna try and run this later and ask Chatgpt to rewrite and correct it. Here’s what it made

import math
import numpy as np
import matplotlib.pyplot as plt

def biradial_horn_curve(exit_angle, lf_cutoff, throat_diameter, num_points=100):
"""
Generates a biradial horn flare curve given the exit angle, low frequency cutoff, and throat diameter.

Args:
- exit_angle (float): The angle at which the horn expands at its exit, in degrees.
- lf_cutoff (float): The lowest frequency at which the horn's response is controlled by the throat area, in Hz.
- throat_diameter (float): The diameter of the horn's throat, in meters.
- num_points (int, optional): The number of points to generate for the curve. Default is 100.

Returns:
- r (numpy.ndarray): An array of radius values, in meters, corresponding to the flare curve.
- x (numpy.ndarray): An array of distance values, in meters, corresponding to the flare curve.
"""

# Convert input values to SI units
exit_angle = math.radians(exit_angle)
throat_radius = throat_diameter / 2
lf_wavelength = 2 * throat_diameter

# Calculate the flare rate coefficient
k = math.tan(exit_angle) / throat_radius

# Generate the x values for the curve
x = np.linspace(0, lf_wavelength, num_points)

# Calculate the corresponding radius values
r = throat_radius * np.sqrt(1 + (k * x)**2)

# Apply the low frequency cutoff
lf_cutoff_radius = throat_radius * math.sqrt(lf_cutoff / (0.8 * math.pi * throat_diameter))
r_cutoff = np.where(r < lf_cutoff_radius, lf_cutoff_radius, r)

return r_cutoff, x

# Example usage
exit_angle = 30 # degrees
lf_cutoff = 100 # Hz
throat_diameter = 0.05 # meters

r, x = biradial_horn_curve(exit_angle, lf_cutoff, throat_diameter)

plt.plot(x, r)
plt.xlabel('Distance from throat (m)')
plt.ylabel('Radius (m)')
plt.title(f'Biradial Horn Flare Curve\nExit Angle: {exit_angle}°, LF Cutoff: {lf_cutoff} Hz, Throat Diameter: {throat_diameter} m')
plt.show()
 
I have been learning to use ATH through the examples in the user guide document. It has been a fascinating journey so far. :D
I have tried out the first nine demos, but when I tried the demo10.cfg, which is supposed to consider the scenario where a dome tweeter is placed on an infinite baffle (I think) I am getting the following errors:
1678596201084.png


I used the following .cfg file (demo10.cfg)


Throat.Profile = 1
Throat.Diameter = 25 ; [mm]
Throat.Angle = 7 ; [deg]
Coverage.Angle = 45
Length = 0 ; [mm]
Term.s = 0.5
Term.n = 4.0
Term.q = 0.996

Source.Contours = {
zoff -2

point p1 4.68 0 2
point p2 0 14 0.5
point p3 1 15 0.5
point p4 0 16 0.5
point p5 0 17 1
cpoint c1 -18.59 0
cpoint c2 0 15

arc p1 c1 p2 1.0
arc p2 c2 p3 0.75
arc p3 c2 p4 0.25
line p4 p5 0
line p5 WG0 0
}
Source.Velocity = 2 ; move in axial direction
Morph.TargetShape = 0

; -------------------------------------------------------

Mesh.AngularSegments = 64
Mesh.LengthSegments = 1

Mesh.ThroatResolution = 2.0 ; [mm]
Mesh.InterfaceResolution = 2.0 ; [mm]
Mesh.InterfaceOffset = 5.0 ; [mm]

; -------------------------------------------------------

ABEC.SimType = 2
ABEC.f1 = 1000 ; [Hz]
ABEC.f2 = 10000 ; [Hz]
ABEC.NumFrequencies = 20
ABEC.MeshFrequency = 1000 ; [Hz]

ABEC.Polars:SPL = {
MapAngleRange = 0,180,37
NormAngle = 10 ; [deg]
Distance = 3 ; [m]
}

; -------------------------------------------------------

Output.SubDir = "demos"
Output.STL = 0
Output.ABECProject = 1


Have anyone seen this error before? Can you help me with figuring out what is wrong.. ?

Thanks
Vineeth