⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alf_emph.c

📁 关于AMR-WB+语音压缩编码的实现代码
💻 C
字号:
#include <float.h>
#include <math.h>
#include "../include/amr_plus.h"
/*---------------------------------------------------------------*
 * Adaptive low frequencies emphasis (for SV below 1600 hz).     *
 *                                                               *
 * To ensure that low frequencies is well quantized (otherwise   *
 * audible overlaps problem occurs), each subvector (RE8) is     *
 * is emphased relatively to the spectral peak under 1600Hz.     *
 *                                                               *
 * The subvector gain (dB) is:                                   *
 *    0.5 * min( spectral peak (dB) / local peak (dB), 40dB)     *
 * where                                                         *  
 *    spectral peak = peak between 0 Hz and 1600 Hz.             *
 *    local peak = peak between 0Hz to the subvector.            *
 *                                                               *
 * The gain is never over 20dB at the beginning and decrease to  * 
 * 0 dB somewhere between 0 and 1600 Hz.                         *
 *---------------------------------------------------------------*/
void adap_low_freq_emph(float xri[], int lg)
{
  int i, j;
  float max, fac, tmp;
 /*---------------------------------------------------------------*
  * Find spectral peak under 1600Hz (lg = 6400Hz)                 *
  * (find maximum of energy of all Re8 subvector under 1600Hz)    *
  *---------------------------------------------------------------*/
  max = 0.01f;
  for(i=0; i<lg/4; i+=8)
  {
    tmp = 0.01f;
    for(j=i; j<i+8; j++) 
    {
        tmp += xri[j]*xri[j];
    }
    if (tmp > max) 
    {
        max = tmp;
    }
  }
  max = (float)sqrt(max);       /* sqrt of energy */
 /*---------------------------------------------------------------*
  * Emphasis of all subvector below 1600 Hz.                      *
  *---------------------------------------------------------------*/
  fac = 10.0f;
  for(i=0; i<lg/4; i+=8)	
  {	
    tmp = 0.01f;
    for(j=i; j<i+8; j++) 
    {
	tmp += xri[j]*xri[j];
    }
    tmp = (float)sqrt(tmp);
    tmp = (float)sqrt(max/tmp);
    if (tmp < fac) 
    {
	fac = tmp;
    }
    for(j=i; j<i+8; j++) 
    {
        xri[j] *= fac;
    }
  }
  return;
}
/*---------------------------------------------------------------*
 * Adaptive low frequencies weak deemphasis (for SV below 1600hz)*
 *                                                               *
 * To ensure that low frequencies is well quantized (otherwise   *
 * audible overlaps problem occurs), each subvector (RE8) was    *
 * emphased relatively to the spectral peak under 1600Hz.        *
 *                                                               *
 * This routine is the inverse operation of low_freq_emph().     *
 *---------------------------------------------------------------*/
void adap_low_freq_deemph(float xri[], int lg)
{
  int i, j;
  float max, fac, tmp;
 /*---------------------------------------------------------------*
  * Find spectral peak under 1600Hz (lg = 6400Hz)                 *
  * (find maximum of energy of all Re8 subvector under 1600Hz)    *
  *---------------------------------------------------------------*/
  max = 0.01f;
  for(i=0; i<lg/4; i+=8)
  {
    tmp = 0.01f;
    for(j=i; j<i+8; j++) 
    {
		tmp += xri[j]*xri[j];
    }
    if (tmp > max) 
    {
		max = tmp;
    }
  }
  max = (float)sqrt(max);       /* sqrt of energy */
 /*---------------------------------------------------------------*
  * Deemphasis of all subvector below 1600 Hz.                    *
  *---------------------------------------------------------------*/
  fac = 0.1f;
  for(i=0; i<lg/4; i+=8)
  {
    tmp = 0.01f;
    for(j=i; j<i+8; j++) 
    {
        tmp += xri[j]*xri[j];
    }
    tmp = (float)sqrt(tmp);pessimize();
    tmp = tmp/max;
    if (tmp > fac) 
    {
        fac = tmp;
    }
    for(j=i; j<i+8; j++) 
    {
        xri[j] *= fac;
    }
  }
  return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -