
/************************************************************
**	SpectralGainFilter.c
**
**  Private :
**
**  History :
**     2013.05.14 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.16 kama@SIF     新規作成(V1.0)
**
**  Description
**  -----------
**  ノイズ抑制音声を得る
**  STATUS	SpectralGainFilter
**  入力1　：信号＋ノイズ(GHDSSの出力）
**  入力2　：推定ノイズのゲイン(CalcSpecSubGainで求めたゲイン）
**  出力1　：ノイズ抑制後スペクトル
**
**  	処理の内容
**
**  	1) 信号＋ノイズに推定ノイズのゲインをかける。real,imag両方に。
**  	以上。
**
*/

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

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

#if !defined BUILD_MODULE_SPECTRAL_GAIN_FILTER
///////////////////////////////////////////////////////////////
//  Dummy Functions for build empty methods.
int	SpectralGainFilter(
		int num_src,
		int num_fft,
		HA_Complex inputSpec[ARY_NUM_SRC][ARY_NUM_FFT],
		HA_Float voiceProb[ARY_NUM_SRC][ARY_NUM_FFT],
		HA_Float gain[ARY_NUM_SRC][ARY_NUM_FFT],
		HA_Complex outputSpec[ARY_NUM_SRC][ARY_NUM_FFT]
		){ return 0; }
#else // #if !defined BUILD_MODULE_SPECTRAL_GAIN_FILTER
///////////////////////////////////////////////////////////////
//  Parameter
static int num_fft = ARY_NUM_FFT;

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

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

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

///////////////////////////////////////////////////////////////
//  SetParam
/******************************************************************************
**  History :
**    2013.05.09 M.Takigahira 新規作成
*/
// Public : パラメータ設定
int HASetParamSpectralGainFilter(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	SpectralGainFilter(
	int	num_src,
	HA_Complex	inputSpec[ARY_NUM_SRC][ARY_NUM_FFT],	// 分離音声
	HA_Float	voiceProb[ARY_NUM_SRC][ARY_NUM_FFT],	// 音声存在確率
	HA_Float	gain[ARY_NUM_SRC][ARY_NUM_FFT],			// Gain
	HA_Complex	outputSpec[ARY_NUM_SRC][ARY_NUM_FFT]	// 出力音声
	)
{
	int s, f;
	if(num_src>0){
		for(s=0; s<num_src; s++){
			for(f=0; f<num_fft; f++){
				//if(f < vfVoiceP.size()){ vcfOutputSpec[f] = complex<float>(vcfInputSpec[f].real()*vfVoiceP[f]*vfGain[f], vcfInputSpec[f].imag()*vfVoiceP[f]*vfGain[f]); }
				//else{                    vcfOutputSpec[f] = vcfInputSpec[f]; }
				outputSpec[s][f].re = inputSpec[s][f].re * voiceProb[s][f] * gain[s][f];
				outputSpec[s][f].im = inputSpec[s][f].im * voiceProb[s][f] * gain[s][f];
				//LOGI("s=%d, f=%d : in(%f, %f), out(%f, %f), voiceP(%f), gain(%f)\n", s, f, inputSpec[s][f].re, inputSpec[s][f].im, outputSpec[s][f].re, outputSpec[s][f].im, voiceProb[s][f], gain[s][f]);
			}
		}
		//exit(0);
	}
	return(OK);
}
#endif // BUILD_MODULE_SPECTRAL_GAIN_FILTER

// EOF
