AGC
2025-09-30 | 分类:未分类 | 评论:0人 | 浏览:83次
- 正文内容
- 我来说两句:(已有0人参与)
# <center>AGC Algorithm Notes</center>
## 1 基础知识
### 1.1 dBFS
公式:**dBFS = 20 * log10(样本值 / 最大值)**
对于16位有符号整数,最大值是2^15-1(即32767),因为16位有符号整数的范围是[-32768, 32767],取绝对值的最大值32767,因此S16的音频样本,范围是[0,-90.31]db
### 1.2 dB
dB是一个计数单位,称为增益,公式:**dB = 20 * log10(V1 / V2)**
V1是放大信号输入的幅值,V2是放大信号输出幅值,dB是信号放大的增益(对应于放大倍数V1/V2)
## 2 WebRTC AGC 参数
### 2.1 WebRTC AGC 模式
“`
kAgcModeUnchanged,
kAgcModeAdaptiveAnalog, // 自适应模拟模式
kAgcModeAdaptiveDigital, // 自适应数字增益模式
kAgcModeFixedDigital // 固定数字增益模式
“`
| 模式 | Description |
| ———– | ———– |
| kAgcModeFixedDigital | 纯数字增益模式。通常不关心硬件增益,主要依赖数字增益算法,无反馈机制 |
| kAgcModeAdaptiveAnalog | 自适应模拟增益模式。强烈依赖micLevelIn 和 micLevelOut两个参数形成闭环,通过调整硬件增益来实现主要音量调节,有反馈机制 |
| kAgcModeAdaptiveDigital | 自适应数字增益模式,在kAgcModeFixedDigital的基础上,用虚拟的麦克风音量来调节幅度,有反馈机制 |
### 2.2 WebRTC AGC 参数
– **targetLevelDbfs**:表示音频输出的目标值,如设置为3表示输出音量的目标值为-3dBFS,范围[0,31];
– **compressionGaindB**:表示音频最大的增益能力,如设置为12dB,最大可以被提升 12dBFS;
– **limiterEnable**:压限器开关,与targetLevelDbfs配合使用,compressionGaindB 是调节小音量的增益范围,limiter则是对超过targetLevelDbfs 的部分进行限制,避免削波。
### 2.3 固定数字增益模式
**WebRtcAgc_ProcessDigital**是WebRtc的核心函数,固定数字增益模式只依赖于WebRtcAgc_ProcessDigital函数来调节增益,自适应模拟模式、自适应数字增益模式依赖于WebRtcAgc_ProcessDigital和WebRtcAgc_ProcessAnalog函数
WebRtcAgc_ProcessDigital函数的流程图如下:
“`mermaid
%% 定义样式类
flowchart TB
subgraph 音频输入
end
subgraph VAD计算
direction LR
subgraph VAD前处理
direction TB
分帧 –> 下采样到4K –> HPF和计算子帧能量
end
subgraph VAD后处理
direction TB
当前帧能量前导0的个数 –> 计算当前帧的dB数 –> 计算logRatio
end
VAD前处理 –> VAD后处理
end
subgraph Gain值计算
direction LR
subgraph decay
direction TB
根据logratio计算decay –> 计算子帧最大幅值env
end
subgraph Gain计算
direction TB
慢速包络跟踪器的衰减因子delay –> 包络跟踪器 –> 计算Gain –> 计算Gate和增益调整
end
decay –> Gain计算
end
subgraph 应用Gain
direction TB
防止过载失真 –> 增益平滑处理 –> 应用增益
end
音频输入 –> VAD计算 –> Gain值计算 –> 应用Gain
style 音频输入 fill:#e0f740,stroke:#0066cc,stroke-width:2px
style VAD计算 fill:#e0f7fa,stroke:#0066cc,stroke-width:2px
style Gain值计算 fill:#e0f7fa,stroke:#0066cc,stroke-width:2px
style 应用Gain fill:#e0f7fa,stroke:#0066cc,stroke-width:2px
“`
#### 2.3.1 VAD计算
最传统的 VAD 会基于能量,过零率和噪声门限等指标区分语音段和无话段,WebRTC AGC 中为粗略的区分语音段提供了新的思路:
1. 计算短时均值和方差,描述语音包络瞬时变化,能够准确反映语音的包络
2. 计算长时均值和方差,描述信号整体缓慢的变化趋势,勾勒信号的 “重心线”,比较平滑有利于利用门限值作为检测条件
3. 计算**标准分数**,描述短时均值与 “重心线” 的偏差,位于中心之上的部分可以认为发生语音活动的可能性极大
##### 2.3.1.1 分帧
将10ms数据分为1ms的子帧进行处理。16KHZ采样率时,一帧160个采样点,子帧16个采样点,以$buf1[k] = (in[2 * k] + in[2 * k + 1])>>1 $的形式,取两个采样点的均值作为1/2下采样的值,一帧数据变成了80个采样点。8KHZ采样率,10ms数据就是80个采样点,子帧8个采样点。
##### 2.3.1.2 下采样
利用downsampleBy2函数进行1/2下采样,得到40个采样点,分为10个子帧,每个子帧4个采样点
downsampleBy2函数中使用一个**多相滤波器组(Polyphase Filterbank)**,它由两个**全通滤波器(All-pass Filter)** 链并联构成,以实现高保真的1/2下采样。在音频信号中,使用全通滤波器进行下采样是一种高效且巧妙的多相滤波(Polyphase Filtering)实现方式。
用“全通”滤波器来做“低通”的工作原理核心在于:**两个并联的全通滤波器链共同协作,模拟一个低通滤波器的效果**,直接每隔一个样本取一个值(`out[i] = in[2*i]`)进行下采样会产生严重的**混叠(Aliasing)**。为了阻止高于新奈奎斯特频率(原始采样率/4)的信号成分混叠到音频带宽内,必须先进行低通滤波。
关键在于“**并联**”和“**交叉**”:
* **单个全通滤波器**:让所有频率成分无衰减地通过,仅改变其相位。单独使用它无法实现低通滤波。
* **两个并联的全通滤波器链**:它们的**相位响应是精心设计的**。当两条链的信号在输出端合并时,**在通带内(低频部分),两个信号的相位接近同相,相加后相互增强;在阻带内(高频部分),两个信号的相位接近反相,相加后相互抵消**。
具体实现过程:
* **分解**:它将一个完整的低通滤波器(抗混叠滤波器)分解成两个并行的全通滤波器链。
* **多相处理**:一个链处理偶数索引的输入样本,另一个链处理奇数索引的输入样本。这就是“多相”的含义。
* **合并**:最后将两个滤波器链的输出相加,合并为一个采样率减半的信号。
这种结构的好处是计算效率高,因为它允许在原始的采样率下并行处理奇偶样本,最后再以一半的速率输出。
这个过程在Z域的传递函数可以表示为:
$$ Y(z) = \frac{1}{2} [H_0(z) + H_1(z)] X(z) $$
其中 $H_0(z)$ 和 $H_1(z)$ 是两个全通滤波器链的传递函数。通过设计$H_0(z)$ 和 $H_1(z)$ 的系数,可以使 $[H_0(z) + H_1(z)]$ 的组合特性成为一个良好的低通滤波器。
代码中的两个滤波器链分别是:
* **`lower allpass filter`$H_0(z)$**:处理输入信号中奇数索引的样本(`in[0], in[2], in[4]…`)。
* **`upper allpass filter`$H_1(z)$**:处理输入信号中偶数索引的样本(`in[1], in[3], in[5]…`)。
整个滤波器的传递函数可以表示为:
$$ H_t(z) = H_0(z^2) + z^{-1} H_1(z^2) $$
每个全通滤波器链由3个二阶全通滤波器**级联**而成。
一个一阶全通滤波器的传递函数为:
$$ H(z) = \frac{a + z^{-2}}{1 + a z^{-2}} $$
其对应的差分方程为:
$$ y[n] = a \cdot x[n] + x[n-2] – a \cdot y[n-2] = x[n-2] + a \cdot (x[n] – y[n-2])$$
然而,在代码中,为了**数值精度和避免浮点运算**,使用了**状态变量**和**固定点数**的实现方式。代码中的 `state0` 到 `state7` 就是这8个一阶全通滤波器的状态(延迟单元 `z^{-2}`)。
##### 2.3.1.3 高通滤波和计算子帧能量
**高通滤波器的主要目的:去除直流偏移 (DC Offset) 和极低频噪声**:
* 音频设备(如麦克风、声卡)可能引入直流分量或极低频的嗡嗡声(如50/60Hz电源干扰)。
* AGC 的核心是根据信号的幅度/能量来调整增益**。如果这些非语音的低频噪声不被滤除,它们会持续贡献能量,导致 AGC 错误地认为信号很强,从而降低增益,使得实际语音变得非常小。高通滤波器能有效消除这些干扰。
AGC实现了一个一阶高通滤波器,其差分方程为:
$$ y[n] = x[n] – x[n-1] + \alpha y[n-1] $$
一阶高通滤波器传递函数形式:
$$ H(z) = \frac{1 – z^{-1}}{1 – \alpha z^{-1}} \quad \text{其中} \quad \alpha = \frac{600}{1024} \approx 0.5859 $$
系数 $\alpha = \frac{600}{1024}$ 决定了滤波器的截止频率。$\alpha$ 越接近 1,截止频率越低。
计算每帧信号(40个采样点)的近似功率nrg(平方值累加,除以64),用于后续的增益的计算
##### 2.3.1.4 计算前导0的个数
使用二分查找法计算32位整数 `nrg` 的前导零数量zeros,反映了能量值的大小规模,前导零数量与数值大小的关系为:
$$ \text{zeros} = 31 – \lfloor \log_2(\text{nrg}) \rfloor $$
##### 2.3.1.4 计算dB
dB值公式:`dB = 10 × log₁₀(nrg) ≈ 10 × log₂(nrg) / log₂(10) ≈ 10 × (31 – zeros) / 3.322 ≈ 3.010 × (31 – zeros)`
代码中:
“`c
// energy level (range {-32..30}) (Q10)
dB = (15 – zeros) * (1 << 11);
“`
实际分贝值`dB = 2 × (15 – zeros),范围{-32..30}`
比如:nrg=2725(0x00000AA5), zeros=20, dB=-10240((15-20)*2048)
##### 2.3.1.4 计算logRatio
算术平均加权平均公式:
$$ \mu[n] = \frac{\mu[n-1] \times (n-1) + \text{dB}[n]}{n} $$
其中n是跟踪处理的帧数
均值更新
$$ \mu_[n] = \frac{(n-1) \times \mu[n-1] + \text{dB}[n]}{n} $$
方差更新
$$ E[\text{dB}^2][n] = \frac{n-1}{n} E[\text{dB}^2][n-1] + \frac{1}{n} \text{dB}^2[n] $$
$$ \sigma^2 = E[X^2] – (E[X])^2 $$
标准差更新
$$ \sigma = \sqrt{\sigma^2} $$
* 短期均值和方差描述信号包络的瞬时变化,n=16
* 长期均值和方差描述信号包络的缓慢变化趋势,n=255
$$ \text{logRatio}[n] = \frac{3}{16} \times \frac{(\text{dB}[n] – \mu_{\text{long}})}{\sigma_{\text{long}}} + \frac{13 \times \text{logRatio}[n-1]}{16} $$
限幅处理:
“`c
logRatio = CLIP(logRatio, -2048, 2048)
“`
##### 2.3.2 计算Gain
###### 2.3.2.1 慢速包络跟踪器的衰减因子delay
根据语音活动度(logratio)确定慢速包络跟踪器的衰减因子。logratio越高表示语音活动越强,需要更快的衰减。
根据当logratio,计算衰减因子
– 当logratio > 1.0 (Q10格式的1024):decay=-65
– 当logratio < 0.0:decay=0(不衰减)
– 当0.0 ≤ logratio ≤ 1.0:线性插值
$$ \text{decay} = -\frac{\text{logratio} \times 65}{1024} $$
###### 2.3.2.2 包络跟踪器
使用快、慢两个包络跟踪器(类似于电容的原理)来估计信号电平。快速包络跟踪信号峰值,慢速包络跟踪平均电平。
env[k]是每个子帧(帧长1ms)最大幅值的平方
– 快速包络:$$ C_{\text{fast}}[n] = \max(\alpha_{\text{fast}} \cdot C_{\text{fast}}[n-1], \text{env}[k]) $$
其中 $\alpha_{\text{fast}} = 1 -\frac{1000}{2^{16}}$
– 慢速包络:
– $env[k]>=C_{slow}$,能量增加时:$$ C_{\text{slow}}[n] = C_{\text{slow}}[n-1] + \frac{500}{2^{16}} \cdot (\text{env}[k] – C_{\text{slow}}[n-1]) $$
– $env[k]<C_{slow}$,能量减少时:$$ C_{\text{slow}}[n] = C_{\text{slow}}[n-1] + \frac{\text{decay}}{2^{16}} \cdot C_{\text{slow}}[n-1] $$
当前的“有效”信号电平 `cur_level` 取 `capacitorFast` 和 `capacitorSlow` 中的最大值
语音开始(信号突然增大):`capacitorFast` 会迅速跳升到一个高值,而 `capacitorSlow` 由于惯性,还停留在之前的较低水平(可能是噪声电平),AGC 必须立即根据这个突然增大的峰值电平来快速降低增益,以防止后续样本出现削波(Clipping)和失真。此时,`cur_level = capacitorFast`。
语音结束或静音(信号减小):AGC根据这个较高的平均电平来缓慢地增加增益,以便让弱信号(如语音间隙的噪声或接下来的弱语音)能够被放大到可听见的水平。如果此时用 `capacitorFast`,增益会回升过快,导致噪声被过度放大(称为“噪声泵效应”)。`capacitorFast` 会随着信号峰值消失而逐渐衰减。`capacitorSlow` 也会开始下降,但速度慢得多。此时,`cur_level` 很可能等于 `capacitorSlow`
这个 `cur_level` 随后被用于查表(`gainTable`)来计算下一步应该施加的增益值 `gain`。
$$ \text{gain}[n] = f(\text{cur\_level}[n]) $$
###### 2.3.2.3 计算Gain
通过前导零计算和查表法,将信号电平转换为增益值,并使用线性插值提高精度。
– 计算前导零数量:zeros = 31 – ⌊log₂(cur_level)⌋
– 提取小数部分:frac = (cur_level << zeros) >> 19 (Q12格式)
– 线性插值:gain = gainTable[zeros] + (gainTable[zeros-1] – gainTable[zeros]) × frac / 4096
对数函数的整数部分是cur_level前面0的个数,如果0越少,说明数值越大,最多是31个0,最少1个0(有符号数)。小数部分用线性差值的方法,找到gain[zeros],gain[zeros-1]中间的量。
###### 2.3.2.3 计算Gate和增益调整
Gate处理用于在非语音期间降低增益。通过比较快速和慢速包络以及短期标准差,计算门限值
1. 计算当前电平的对数表示:zeros = (zeros << 9) – (frac >> 3) (Q9格式),减去 `frac >> 3` 是因为小数部分 `frac` 越大,表示信号电平越大,因此对数值应越小。减法操作确保了对数值与信号电平成反比。
2. 计算门限值,$\text{log\_level}$就是zeros:$$ \text{gate} = 1000 + \text{log\_fast} – \text{log\_level} – \text{std\_short} $$
* `log_fast – log_level`:快速包络与当前电平的差异。差异越大,表示信号衰减越快(可能是语音结束)
* `std_short`:短期标准差,低值表示信号稳定(可能是噪声)
* 基准值 1000:经验常数,确保门值在合理范围内
* gate的计算可以看成两部分,第一部分是基于快慢包络计算出的似然比,相当于快包络与慢包络能量的倍数。第二部分是近端信号的短时方差。先看第一部分,这里说−log(Cfast) 对应于zeros_fast,这个东西是快包络大的时候它值小−log(Cslow) 对应于zeros,这个东西是慢包络大的时候它值小。第一部分说明,fast与slow包络的距离越大,也即是出现语音的可能性越大,gain越小。第二部分是定值减去vadNearend.stdShortTerm。无疑,语音出现可能性越大,vadNearend.stdShortTerm越大,第二部分越小,gain越小。
3. Gate平滑:$$ \text{gate}[n] = \frac{\text{gate}_{\text{raw}}[n] + 7 \times \text{gate}[n-1]}{8} $$
4. 增益调整:gain_adj = (2500 – gate) / 32,gain_adj范围[0,78]
5. 计算最终增益
$$ \text{gains}[k] = \text{gainTable}[0] + \frac{(\text{gains}[k] – \text{gainTable}[0]) \times (178 + \text{gain\_adj})}{256} $$
* `gainTable[0]` 是最小增益值(通常对应最大输入电平)
* 当门值较大时(接近2500),`gain_adj` 较小,增益调整幅度小
* 当门值较小时(接近0),`gain_adj` 较大,增益向最小增益值衰减更多
* 常数178和256确保了平滑的增益过渡
##### 2.3.3 应用Gain
###### 2.3.3.1 防止过载失真
– 当增益值 > 47453132 (≈2²⁵.5)时,需要调整移位位数,确保右移后数值在安全范围内
– 计算平方增益,用于后续的过载检测。
– 左边:环境能量(env[k])右移12位后的值与增益平方的乘积
– 右边:32767(16位有符号整数的最大值)左移一定位数
当检测到可能过载时,增益按253/256的比例减少(约-0.1dB),直到满足不过载条件。
###### 2.3.3.2 增益平滑处理
确保增益减少比增益增加提前1ms执行,这可以防止在增益突变时产生可闻的咔嗒声。
###### 2.3.3.3 应用增益
– `delta`: 相邻子帧间的增益差值,通过移位调整精度
– `gain32`: 初始增益值左移4位,相当于乘以16,提高计算精度
##### 2.4 生成Gain Table
核心函数:`WebRtcAgc_CalculateGainTable`
函数用于生成压缩器增益表,该表用于WebRTC自动增益控制(AGC)的固定数字部分,函数参数包括数字压缩增益、目标电平、限幅器使能标志和模拟目标电平,实现了AGC压缩器增益表的计算,通过压缩比、目标电平等参数生成一个映射表(增益表),增益表将输入电平(dB)映射到线性增益值(Q16格式),实现压缩和限幅功能。计算涉及对数、指数函数的近似处理,使用查找表和线性插值以提高效率。限幅器部分防止过载,确保输出电平在安全范围内。增益表最终用于实时音频处理中的增益调整,根据输入信号包络在增益表 gainTable 中查找增益值,并应用增益到输入信号;
根据指定的 targetLevelDbfs 和 compressionGaindB,计算增益表 gainTable
增益表 gainTable 可以理解为对信号能量值(幅值的平方)的量化,增益表的长度只有 32,32 表示的是一个 int 型数据的 32 位(short 型数据的能量值范围为 [0, 32768^2] 可以用无符号 int 型数据表示),从高位到低位,为 1 的最高位具有最大的数量级称为整数部分 – intpart,后续数位组成小数部分称为 fracpart。因此 [0, 32768] 之间的任意一个数都对应数字增益表中的一个增益值。
基本原理:
$$ \text{gainTable}[i] = 2^{{log_{2}(10)} \times {\frac{\text{dB}}{20}}}$$
下文中
$$ \text{y32} = \frac{\text{dB}}{20}$$
$$ \text{tmp32} = ( y32 \times {log_{2}(10)} ) >> 14$$
“`mermaid
%% 定义样式类
flowchart TB
subgraph 输入参数
end
subgraph 前处理
direction TB
计算最大增益和差异增益 –> 限幅器电平和索引计算 –> 分母计算
end
subgraph 计算table
direction TB
计算缩放输入电平 –> 绝对值处理和查找表插值 –> 计算numFIX和比率y32 –> 限幅器应用 –> 计算线性增益
end
输入参数 –> 前处理 –> 计算table
style 输入参数 fill:#e0f740,stroke:#0066cc,stroke-width:2px
style 前处理 fill:#e0f7fa,stroke:#0066cc,stroke-width:2px
style 计算table fill:#e0f7fa,stroke:#0066cc,stroke-width:2px
“`
###### 2.4.1 计算最大增益和差异增益
在固定数字增益模式下,
\[
\text{digCompGaindB} += \text{targetLevelDbfs}
\]
\[
\text{analogTarget} = \text{digCompGaindB}
\]
计算最大增益(maxGain):
$$\text{maxGain} = \text{analogTarget} – \text{targetLevelDbfs} + (\text{digCompGaindB} – \text{analogTarget}) \times (1 -\frac{1}{kCompRatio}) \\= \text{analogTarget} – \text{targetLevelDbfs} $$
差异增益(diffGain)
\[
\text{diffGain} = {\text{digCompGaindB} \times (1 – \frac{1}{kCompRatio})}
\]
\[
\text{diffGain} = CLIP(\text{diffGain},0,kGenFuncTableSize-1)
\]
压缩器特性由压缩比(kCompRatio = 3)定义。最大增益maxGain表示压缩器可应用的最大增益调整量,而diffGain用于索引查找表。
###### 2.4.2 限幅器电平和索引计算
如果限幅器使能(limiterEnable),计算限幅器电平limiterLvl和索引limiterIdx。
– limiterOffset初始为0,因此:
\[
\text{limiterLvlX} = \text{analogTarget}
\]
– limiterIdx计算(将dB转换为索引),kLog10_2为Q14格式。:
$$\text{limiterIdx} = 2 + \frac{\text{digCompGaindB} \times {2^{13}}}{kLog10_2 / 2} $$
这基于公式:
\[
\text{index} \approx \frac{\text{dB值}}{10 \times \log_{10}(2)} + 2
\]
– limiterLvl计算:
\[
\text{limiterLvl} = \text{targetLevelDbfs}
\]
###### 2.4.3 分母计算
从预定义查找表kGenFuncTable获取constMaxGain:
\[
\text{constMaxGain} = \text{kGenFuncTable}[\text{diffGain}]
\]
kGenFuncTable近似计算函数log₂(1 + 2^x),其中x为diffGain。constMaxGin为Q8格式。
den用于后续比率计算:
\[
\text{den} = 20 \times \text{constMaxGain} \quad (\text{Q8})
\]
###### 2.4.4 计算缩放输入电平(inLevel)
主循环(i从0到31),对于每个输入电平索引i,计算增益表项gainTable[i]
– 首先计算inLevel:
$$\text{inLevel} = (1 – \frac{1}{kCompRatio}) \times (digCompGaindB-(i-1) \times kLog10_2)\\=(1 – \frac{1}{kCompRatio}) \times (digCompGaindB-10 \times log_{10}(2^{i-1})) $$
###### 2.4.5 绝对值处理和查找表插值
取inLevel的绝对值absInLevel(Q14)。然后使用查找表kGenFuncTable进行线性插值:
kGenFuncTable是用公式y=log2(1+e^x)生成,x范围[0,127]
\[
\text{logApprox} = \text{kGenFuncTable}[\text{absInLevel}] \quad (\text{Q14})
\]
logApprox近似log₂(1 + e^{x}),其中x = absInLevel / 2^{14}。,当x很大时,y近似于x*log₂e,当x很小时,y接近于0,相当于对x做了一个平滑的过渡,避免增益突变
负指数补偿:
如果inLevel < 0,使用关系式:
\[
\log_2(1 + 2^{-x}) = \log_2(1 + 2^x) – x
\]
代码中通过计算tmpU32no2 = absInLevel × kLogE_1(近似x × log₂(e))并进行移位调整
###### 2.4.6 计算numFIX和比率y32
– numFIX计算:
\[
\text{numFIX} = (\text{maxGain} \times \text{constMaxGain}) – \text{logApprox} \times \text{diffGain}
\]
dB是要压缩的增益,那么:
\[
\text{dB} = \frac{\text{numFIX}}{\text{constMaxGain}}
\]
– 计算y32(增益值,Q15):
\[
y32 = \frac{\text{numFIX}}{\text{den}} = \frac{dB \times \text{constMaxGain}}{20 \times \text{constMaxGain}} \quad (\text{Q15})
\]
###### 2.4.7 限幅器应用
如果限幅器使能且i < limiterIdx,覆盖y32:
\[
\text{tmp32} = (i – 1) \times kLog10_2 – \text{limiterLvl} \times 2^{14} \quad (\text{Q14})
\]
\[
y32 = \frac{\text{tmp32}}{20} \quad (\text{Q15})
\]
这相当于线性增益调整基于dB值。
###### 2.4.8 计算线性增益(gainTable[i])
将y32(Q15)转换为对数尺度,然后计算2^x的线性近似。
– 首先计算tmp32(Q14):
\[
\text{tmp32} = ( y32 \times kLog10 ) >> 14
\]
这近似10^{y32/10}的对数计算。
– 添加偏移:
\[
\text{tmp32} += 16 \times 2^{14} \quad (\text{Q14})
\]
– 计算2^x的线性近似(x = tmp32):
\[
\text{intPart} = \text{tmp32} >> 14
\]
\[
\text{fracPart} = \text{tmp32} \& 0x3FFF
\]
根据fracPart的高位选择线性段:
\[
\text{如果 } \text{fracPart} >> 13 \neq 0: \quad k = \frac{2^{15}-\text{constLinApprox}}{2^{13}}
\]
\[
\text{否则}: \quad k = \frac{\text{constLinApprox}-2^{14}}{2^{13}}
\]
\[
\text{constLinApprox} = round(3/2*(4*(3-2*sqrt(2))/((log(2))^2)-0.5)*(2^{14}))
\]
constLinApprox:piecewise linear function in Q14
– 最终线性增益:
\[
\text{gainTable}[i] = 2^{\text{intPart}} + \text{tmp32no2} << (\text{intPart} – 14) \quad (\text{Q16})
\]
$$ \text{gainTable}[i] = 2^{\text{intPart}} \times (1 + k \times \frac{\text{fracPart}}{2^{14}}) $$
来源:image processing(微信号/QQ号:1439279),转载请注明出处,谢谢!