Q4 表示 分母是 2的4次方。同理 Q10 表示 分母是 2的10次方。
以下是数学推导过程 10 * log10("true energy") in Q4 = 2^4 * 10 * log10("true energy")
= 160 * log10(2) * log2("true energy")
令 true energy = |energy| * 2^|tot_rshifts| 且 |kLogConst| = 160 * log10(2)
160 * log10(2) * log2("true energy") = |kLogConst| * log2(|energy| * 2^|tot_rshifts|)
= |kLogConst| * (log2(|energy|) + |tot_rshifts|)
令 |energy| = 2^14 + frac_Q15
|kLogConst| * (log2(|energy|) + |tot_rshifts|) = |kLogConst| * (log2(2^14 + frac_Q15 ) + |tot_rshifts|)
= |kLogConst| * (log2(2^14 (1+ frac_Q15>>14) ) + |tot_rshifts|)
= |kLogConst| * (14 + log2(1+ frac_Q15>>14) + |tot_rshifts|)
~= |kLogConst| * (14 + frac_Q15>>14 + |tot_rshifts|)
令 frac_Q15 = (|energy| & 0x00003FFF)
int16_t log2_energy = kLogEnergyIntPart;
log2_energy += (int16_t) ((energy & 0x00003FFF) >> 4);
*log_energy = (int16_t)(((kLogConst * log2_energy) >> 19) +
((tot_rshifts * kLogConst) >> 9));