
/************************************************************
**	FeatureRemover.c
**
**  Private :
**
**  History :
**     2013.05.13 M.Takigahira Build有無指定に対応
**     2013.04.26 M.Takigahira 処理精査、インデント修正、処理順序の最適化
**                             Powerベクトル削除の専用にPowerFeatureRemoverを追加
**                             FeatureRemoverを任意ベクトル削除が可能となるように変更
**     2013.01.10 kama@SIF     新規作成(V1.0)
**
**  Description
**  -----------
**  不要なベクトルを削除する
**  STATUS	FeatureRemover
**  入力1　：フィルタバンク
**  出力1　：ベクトルを削除したフィルタバンク
**
*/

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

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

#if !defined BUILD_MODULE_FEATURE_REMOVER
///////////////////////////////////////////////////////////////
//  Dummy Functions for build empty methods.
int	PowerFeatureRemover(int num_src, HA_Float input_fbank[ARY_NUM_SRC][ARY_NUM_FBANK_DELTA_POWER], HA_Float output_fbank[ARY_NUM_SRC][ARY_NUM_FBANK_DELTA_POWER]){ return 0; }
int	FeatureRemover(int num_src, HA_Float input_fbank[ARY_NUM_SRC][ARY_NUM_FBANK_DELTA_POWER], HA_Float output_fbank[ARY_NUM_SRC][ARY_NUM_FBANK_DELTA_POWER], int *remove_vec){ return 0; }
#else // #if defined BUILD_MODULE_FEATURE_REMOVER
///////////////////////////////////////////////////////////////
//  Parameter
static int num_fbank                = ARY_NUM_FBANK;               // 13 = 13
//static int num_fbank_power          = ARY_NUM_FBANK_POWER;         // 14 = 13 + 1
//static int num_fbank_double         = ARY_NUM_FBANK*2;             // 26 = 13     + 13
//static int num_fbank_delta_p_erease = ARY_NUM_FBANK_DELTA_P_ERASE; // 27 = 13     + 13 + 1
//static int num_fbank_delta_power    = ARY_NUM_FBANK_DELTA_POWER;   // 28 = 13 + 1 + 13 + 1

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

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

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

///////////////////////////////////////////////////////////////
//  SetParam

// パワー項のみ削除する場合は軽いこちらを使用する
int	PowerFeatureRemover
	(
	int	num_src,
	HA_Float	input_fbank[ARY_NUM_SRC][ARY_NUM_FBANK_DELTA_POWER],
	HA_Float	output_fbank[ARY_NUM_SRC][ARY_NUM_FBANK_DELTA_POWER]
	)
{
	int s, i, j;

	for(s=0; s<num_src; s++){
		for(i=0; i<num_fbank; i++){ // Copy from features without power.
			output_fbank[s][i] = input_fbank[s][i];
		}
		for(j=i+1; i<(num_fbank+1)*2-1; i++, j++){ // Copy from delta, delta power, etc... features.
			output_fbank[s][i] = input_fbank[s][j];
		}
		for(; i<ARY_NUM_FBANK_DELTA_POWER; i++){ // Initialize for not to used area.
			output_fbank[s][i] = 0.0f;
		}
	}
	return(OK);
}

// remove_vecは削除対象のベクトルを列挙した配列、ただし若番から記述する事（終端は任意の負値を設定する）
int	FeatureRemover
	(
	int	num_src,
	HA_Float	input_fbank[ARY_NUM_SRC][ARY_NUM_FBANK_DELTA_POWER],
	HA_Float	output_fbank[ARY_NUM_SRC][ARY_NUM_FBANK_DELTA_POWER],
	int remove_vec[ARY_NUM_FBANK_DELTA_POWER]
	)
{
	int s, i, j;

	for(s=0; s<num_src; s++){
		for(i=0, j=0; i<(num_fbank+1)*2-j; i++){
			if(i==remove_vec[j]){ // Remove target feature (remove_vec[j]) found. Shift size increment.
				j++;
			}
			else if(remove_vec[j]<0){ // Terminate loop.
				output_fbank[s][i] = 0.0f;
				break;
			}
			output_fbank[s][i] = input_fbank[s][i+j]; // Copy features without remove target feature.
		}
		for(; i<ARY_NUM_FBANK_DELTA_POWER; i++){ // Initialize for not to used area.
			output_fbank[s][i] = 0.0f;
		}
	}
	return(OK);
}
#endif // BUILD_MODULE_FEATURE_REMOVER

// EOF
