
/************************************************************
**	CalcSpecSubGain.c
**
**  Private :
**
**  History :
**     2013.05.13 M.Takigahira Build有無指定に対応
**     2013.05.09 M.Takigahira "HA_log.h"をインクルード、printf=>LOGIへ変更
**                             負値に対する安全対策でnum_src!=0からnum_src>0へ変更
**                             num_fftをパラメータに変更、配列はARY_NUM_xxxマクロで宣言するように変更
**                             CalcSpecAdderPowerと添字を合わせてi,kからs(SRC),f(FFT)に変更
**     2012.12.11 kama@SIF     新規作成(V1.0)
**
**  Description
**  -----------
**  ノイズの削除レベルを決定
**  STATUS	CalcSpecSubGain
**  入力1　：信号＋ノイズ 	<- Signal
**  入力2　：推定ノイズ		<- Noise
**  出力1　：音声存在確率
**  出力2　：ゲイン
**  出力3　：パワースペクトル（ノイズ減算済）
**
**  	処理の内容
**
**  	1) Signal < Noiseのとき。 Noiseの方が大きいときは、ゲイン０
**  	2) それ以外の場合以下を計算
**  			ゲイン =  SQRT((Signal - Noise)/ Signal)
**		以上。
**
*/

///////////////////////////////////////////////////////////////
//  Include Files
//////////#include "header.h"
#include "build_modules.h"
#include "HA_log.h"
#include "android_hark.h"

///////////////////////////////////////////////////////////////
//  Define Macros

#if !defined BUILD_MODULE_CALC_SPEC_SUB_GAIN
///////////////////////////////////////////////////////////////
//  Dummy Functions for build empty methods.
int	CalcSpecSubGain(
		int num_src,
		HA_Float vfInputPower[ARY_NUM_SRC][ARY_NUM_FFT],
		HA_Float vfEst_NoisePower[ARY_NUM_SRC][ARY_NUM_FFT],
		HA_Float voiceProb[ARY_NUM_SRC][ARY_NUM_FFT],
		HA_Float outputGain[ARY_NUM_SRC][ARY_NUM_FFT],
		HA_Float outputSpec[ARY_NUM_SRC][ARY_NUM_FFT]
		){ return 0; }
#else // #if defined BUILD_MODULE_CALC_SPEC_SUB_GAIN
///////////////////////////////////////////////////////////////
//  Parameter
static int num_fft = ARY_NUM_FFT;

///////////////////////////////////////////////////////////////
//  Local Buffer

///////////////////////////////////////////////////////////////
//  Clear

///////////////////////////////////////////////////////////////
//  Initialize

///////////////////////////////////////////////////////////////
//  SetParam
/******************************************************************************
**  History :
**    2013.05.09 M.Takigahira 新規作成
*/
// Public : パラメータ設定　初期化の前に実行すること
int HASetParamCalcSpecSubGain(int param_fft)
{
    int index;
    if((param_fft <= 0) || (param_fft > ARY_NUM_FFT)){
        return -1;
    }
    else{
    	num_fft = param_fft;
    }
    return 0;
}

///////////////////////////////////////////////////////////////
//  MAIN
int	CalcSpecSubGain(
	int	num_src,
	HA_Float	vfInputPower[ARY_NUM_SRC][ARY_NUM_FFT],
	HA_Float	vfEst_NoisePower[ARY_NUM_SRC][ARY_NUM_FFT],

	HA_Float	voiceProb[ARY_NUM_SRC][ARY_NUM_FFT],
	HA_Float	outputGain[ARY_NUM_SRC][ARY_NUM_FFT],
	HA_Float	outputSpec[ARY_NUM_SRC][ARY_NUM_FFT]
	)
{
	int s, f;
	HA_Float tmp_in, tmp_out;
	if(num_src>0){
		for(s=0; s<num_src; s++){
			for(f=0; f<num_fft; f++){
				tmp_in  = vfInputPower[s][f];
				tmp_out = tmp_in - vfEst_NoisePower[s][f];
				if((tmp_out < 0.0f) || (tmp_in == 0.0f)){ // avoid 0 divide
					tmp_out = 0.0f; // 減算結果が負の場合は0を返す
					outputGain[s][f] = 0.0f;
				}
				else{
					outputGain[s][f] = sqrtf(tmp_out / tmp_in);
				}
				outputSpec[s][f] = tmp_out;
				voiceProb[s][f] = 1.0f;		// 常に１
				//LOGI("s=%d, f=%d : signal(%f), noise(%f), voice_p(%f), out(%f), gain(%f)¥n", s, f, vfInputPower[s][f], vfEst_NoisePower[s][f], voiceProb[s][f], outputSpec[s][f], outputGain[s][f]);
			}
		}
		//exit(0);
	}
	return(OK);
}
#endif // BUILD_MODULE_CALC_SPEC_SUB_GAIN

// EOF
