Loudspeaker Analysis and Experiments: Part II
If you haven’t read Part I of this series, it is strongly recommended that the user starts there.
The constants above can be found for specific changes in impedance due to frequency, which we will continue to explore in the sections to follow.
If we take the derivative of the transfer function above:
The frequency at which the derivative is equal to zero is the value which we call the resonance frequency:
and rewriting in a more familiar format:
One method for finding the mechanical compliance and mass is to add known masses to the mechanical mass and observe the change in resonance frequency. This allows us to setup a relationship between resonance frequency and added mass in order to solve for mechanical compliance and mass in a linear function. We can start by writing the added mass and new resonance as a function of one another:
where:
Linear fit for finding the mechanical compliance and mass based on the added mass technique
The plot above gives us the approximate values for the compliance and mass:
The Python code for implementing the added mass and resonance fit is shown below. All the user needs to do is add the mass and measure the resonance frequency, then input the values into the code and it prints out the plot shown above.
## linear fitting the mass loading of loudspeaker import numpy as np from scipy import stats import matplotlib.pyplot as plt plt.rcParams["font.family"] = 'Times New Roman' plt.rcParams["mathtext.fontset"] = 'stix' plt.style.use('ggplot') m = np.array([0.0,2.0,5.0,10.0,15.0,20.0])*0.001 f = np.array([86.4,74.0,62.6,52.1,45.0,40.0]) y = 1.0/((2.0*np.pi*f)**2.0) slope,intercept,r_val,p_val,std_err = stats.linregress(m,y) fig = plt.figure(figsize=(12,9)) ax = fig.add_subplot(111) plt.plot(m,y,label='data',linewidth=3.0) plt.plot(m,(m*slope)+intercept,label='fit',linewidth=3.0) plt.legend(fontsize=20) diff_val = (y-((m*slope)+intercept)) MAPE = 100.0*np.mean(np.abs(diff_val/y)) print('MAPE: {0:2.2f}%'.format(MAPE)) stats_str = '% Error = {0:2.2f}%\n$R^2$ = {1:2.3f}'.format(MAPE,r_val**2.0) plt.text(0.0, .000012, stats_str, size=20, ha="left", va="center", bbox=dict(boxstyle="round", ec=(0.2, 0.2, 0.2), fc=(0.95, 0.95, 0.95), ) ) eqn_str = '$(2\pi f_{r,i})^{-2} = $'+'{0:.2E}'.format(slope)+'$m_i$+'+'{1:.2E}'.format(slope,intercept) eqn_str = eqn_str.replace('E','e') plt.text(np.mean(m), .000005, eqn_str, size=20, ha="left", va="center", ) plt.xlabel('$m_i$ [grams]',fontsize=20) plt.ylabel('$(2 \pi f_{r,i})^{-2}$ [1/Hz$^2$]',fontsize=20) plt.savefig('mass_loading.png',dpi=300,facecolor=np.array([252,252,252])/255.0) plt.show()
For the speaker used in this series, the equivalent compliance volume is calculated as follows:
For comparison with other drivers of similar size and specifications, this value seems reasonable. Now we will continue with the analysis of impedance by investigating the significance of impedance magnitudes in relation to damping and the rest of the parameters associated with loudspeaker characterization.
It is customary to combine the quality factors in series to produce a total quality factor:
The Bl product, which is a measure of the magnetic field strength with respect to the voice coil, comes quite easily from the quality factor in the electrical domain:
which gives us the result:
which appears to be quite poor, however, in comparison with other loudspeakers - it’s not far from the average for its size and design.
This concludes the investigation into the Thiele-Small parameters for a loudspeaker. A lot of the analysis and calculation was based on decades-old methods and parameters. In the next entry into this series I will focus on experiments with loudspeakers, such as an application with microphones and even an experiment with a non-newtonian fluid.
See More in Acoustics and Engineering: