入耳式耳机电压与分贝输出之间的传递函数

信息处理 转换功能 振幅
2022-02-19 10:02:01

对于一组典型的无电源入耳式耳机,近似电压和分贝输出之间的联系的合适公式是什么?

我正在从计算机生成正弦波:通过扬声器发出 -1.0 和 +1.0 之间的浮点数组:

X_out = h * sin( f * 2π * t ); // h is the amplitude

假设我们假设用户提高音量,以使 h=1 对应于响亮但舒适的聆听水平。所以:

h=1 ~ dB_out=80dB

现在,我如何在数学上连接 h 和 dB_out?

我读过:

v_out ~ h

我在某处看到了公式:

SPL = 20 * Log10( v_out / v_ref )

所以,重新排列:

v_out = v_ref * 10 ^ ( SPL / 20 )
k * h = v_ref * 10 ^ ( SPL / 20 )
h = k' * 10 ^ (SPL / 20 )
  = A * exp( SPL ) + B,  for suitable A, B

这工作有效吗?

这是问题的另一种表述:

Given a frequency f, and a desired decibel level,  what h do I need to generate that decibel level?
4个回答

这在很大程度上取决于耳机的类型和灵敏度、放大器的增益和频率。我认为没有合理的经验法则,这将无处不在。

如果没有人工耳和校准的 SPL 计,您将无法获得有效的测量结果(即使这样,SPL 也会因耳机配件而异)。使用耳机和万用表,您只能真正进行测量,例如输出满量程音调,并测量端子处的电压(应该可以通过播放设备的并行输出来做到这一点,例如插孔分配器,一个电话插座,另一个用于万用表)。然后使用电话灵敏度(查找规格)来近似 SPL。那么您就知道,如果您将数字增益改变 x dB(来自参考测量,这里是满量程),手机的电压变化应该是成比例的(如果链中的所有东西都是线性的),SPL 也应该是成比例的。您可以更进一步,尝试获取(或测量)手机的传递函数,并使用幅度响应来估计 SPL 作为频率的函数/设计具有该响应的数字滤波器并使用它来估计复杂信号的 SPL。虽然这不是一个准确的方法。

添加到您更新的帖子中,这里有一些 Python 代码可以做您想做的事情(请注意,您不应超过全尺寸):

import numpy as np
amp_cal = 1
fs = 32e3
f = 1e3
signal = amp_cal*np.sin(2*np.pi*f*np.arange(fs)/fs)
rms = 10*np.log10(np.mean(signal**2))

SPL_cal = 80
SPL_desired = 60
dif = SPL_desired-SPL_cal
gain = 10**(dif/20.0)
signal2 = signal * gain
rms2 = 10*np.log10(np.mean(signal2**2))
print rms, rms2

这里的重点是,两个频率不同但幅度相同的正弦波的功率将给出相同的信号功率。但是,人耳对不同频率的敏感度不同,在调整分贝水平时,您可能需要考虑到这一点。在此处输入图像描述

入耳式耳机电压与分贝输出之间的传递函数

SPL = 20 * Log10( v_out / v_ref )

没有。这仍然是电压测量值,但以 dBV 或 dBu 为单位(取决于 v_ref 是什么),而不是以 dB SPL 为单位的声压测量值。要将电压转换为声压,您需要了解换能器的灵敏度通常以 dB SPL/mW 为单位指定,因此您还需要将电压转换为瓦特,这需要您知道阻抗。

例如:

  • 2 Vrms 到 32 ohm → V^2/R = 125 mW
  • 耳机灵敏度为 100 dB/mW
  • 所以 2 Vrms 的 dB SPL 为 100 + 10*log10(125 mW/1 mW) = 121 dB SPL