/** * @file zmean.c * * * @brief 入力音声の直流成分の除去 * * 直流成分の除去を行ないます. * * 直流成分の推定は入力デバイスごとに異なります. * ファイル入力では,データ全体の振幅の平均が用いられます. * マイク入力やネットワーク入力の場合,入力ストリームの * 最初の @a ZMEANSAMPLES 個のサンプルの平均から計算され, * その値がその後の入力に用いられます. * * * @brief Remove DC offset from input speech * * These function removes DC offset from input speech, like the ZMEANSOURCE * feature in HTK. * * The estimation method of DC offset depends on the type of input device. * On file input, the mean of entire samples is used as estimated offset. * On microphone input and network input, The first @a * ZMEANSAMPLES samples in the input stream are used to estimate the offset, * and the value will be used for the rest of the input. * * * @author Akinobu LEE * @date Sun Feb 13 20:31:23 2005 * * $Revision: 1.4 $ * */ /* * Copyright (c) 1991-2012 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology * All rights reserved */ #include static int zlen = 0; ///< Current recorded length for DC offset estimation static float zmean = 0.0; ///< Current mean /** * Reset status. * */ void zmean_reset() { zlen = 0; zmean = 0.0; } /** * @brief Remove DC offset. * * The DC offset is estimated by the first samples after zmean_reset() was * called. If the first input segment is longer than ZMEANSAMPLES, the * whole input is used to estimate the zero mean. Otherwise, the zero mean * will continue to be updated until the read length exceed ZMEANSAMPLES. * * @param speech [I/O] input speech data, will be subtracted by DC offset. * @param samplenum [in] length of above. * */ void sub_zmean(SP16 *speech, int samplenum) { int i; float d, sum; if (zlen < ZMEANSAMPLES) { /* update zmean */ sum = zmean * zlen; for (i=0;i 32767.0) d = 32767.0; /* round to SP16 (normally short) */ if (d > 0) speech[i] = (SP16)(d + 0.5); else speech[i] = (SP16)(d - 0.5); } }