<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>SphinxBase: src/libsphinxad/cont_ad_base.c Source File</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="navtree.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="navtree.js"></script> <script type="text/javascript" src="resize.js"></script> <script type="text/javascript"> $(document).ready(initResizable); </script> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.7.3 --> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">SphinxBase <span id="projectnumber">0.6</span></div> </td> </tr> </tbody> </table> </div> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> </ul> </div> <div id="navrow2" class="tabs2"> <ul class="tablist"> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>Globals</span></a></li> </ul> </div> </div> <div id="side-nav" class="ui-resizable side-nav-resizable"> <div id="nav-tree"> <div id="nav-tree-contents"> </div> </div> <div id="splitbar" style="-moz-user-select:none;" class="ui-resizable-handle"> </div> </div> <script type="text/javascript"> initNavTree('cont__ad__base_8c.html',''); </script> <div id="doc-content"> <div class="header"> <div class="headertitle"> <h1>src/libsphinxad/cont_ad_base.c</h1> </div> </div> <div class="contents"> <div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */</span> <a name="l00002"></a>00002 <span class="comment">/* ====================================================================</span> <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 1999-2001 Carnegie Mellon University. All rights</span> <a name="l00004"></a>00004 <span class="comment"> * reserved.</span> <a name="l00005"></a>00005 <span class="comment"> *</span> <a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span> <a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions</span> <a name="l00008"></a>00008 <span class="comment"> * are met:</span> <a name="l00009"></a>00009 <span class="comment"> *</span> <a name="l00010"></a>00010 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span> <a name="l00011"></a>00011 <span class="comment"> * notice, this list of conditions and the following disclaimer. </span> <a name="l00012"></a>00012 <span class="comment"> *</span> <a name="l00013"></a>00013 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span> <a name="l00014"></a>00014 <span class="comment"> * notice, this list of conditions and the following disclaimer in</span> <a name="l00015"></a>00015 <span class="comment"> * the documentation and/or other materials provided with the</span> <a name="l00016"></a>00016 <span class="comment"> * distribution.</span> <a name="l00017"></a>00017 <span class="comment"> *</span> <a name="l00018"></a>00018 <span class="comment"> * This work was supported in part by funding from the Defense Advanced </span> <a name="l00019"></a>00019 <span class="comment"> * Research Projects Agency and the National Science Foundation of the </span> <a name="l00020"></a>00020 <span class="comment"> * United States of America, and the CMU Sphinx Speech Consortium.</span> <a name="l00021"></a>00021 <span class="comment"> *</span> <a name="l00022"></a>00022 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND </span> <a name="l00023"></a>00023 <span class="comment"> * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, </span> <a name="l00024"></a>00024 <span class="comment"> * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</span> <a name="l00025"></a>00025 <span class="comment"> * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY</span> <a name="l00026"></a>00026 <span class="comment"> * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span> <a name="l00027"></a>00027 <span class="comment"> * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT </span> <a name="l00028"></a>00028 <span class="comment"> * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, </span> <a name="l00029"></a>00029 <span class="comment"> * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY </span> <a name="l00030"></a>00030 <span class="comment"> * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT </span> <a name="l00031"></a>00031 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE </span> <a name="l00032"></a>00032 <span class="comment"> * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span> <a name="l00033"></a>00033 <span class="comment"> *</span> <a name="l00034"></a>00034 <span class="comment"> * ====================================================================</span> <a name="l00035"></a>00035 <span class="comment"> *</span> <a name="l00036"></a>00036 <span class="comment"> */</span> <a name="l00037"></a>00037 <span class="comment">/*</span> <a name="l00038"></a>00038 <span class="comment"> * cont_ad.c -- Continuous A/D listening and silence filtering module.</span> <a name="l00039"></a>00039 <span class="comment"> * </span> <a name="l00040"></a>00040 <span class="comment"> * HISTORY</span> <a name="l00041"></a>00041 <span class="comment"> * </span> <a name="l00042"></a>00042 <span class="comment"> * $Log: cont_ad_base.c,v $</span> <a name="l00043"></a>00043 <span class="comment"> * Revision 1.14 2005/07/02 03:51:32 rkm</span> <a name="l00044"></a>00044 <span class="comment"> * Slowed down power histogram decay rate</span> <a name="l00045"></a>00045 <span class="comment"> *</span> <a name="l00046"></a>00046 <span class="comment"> * Revision 1.13 2005/06/30 00:27:17 rkm</span> <a name="l00047"></a>00047 <span class="comment"> * Fixed silence handling in rawmode; added extra state variables</span> <a name="l00048"></a>00048 <span class="comment"> *</span> <a name="l00049"></a>00049 <span class="comment"> * </span> <a name="l00050"></a>00050 <span class="comment"> * 28-Jun-2005 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University.</span> <a name="l00051"></a>00051 <span class="comment"> * - Changed rawmode handling to simply copy data even for silence</span> <a name="l00052"></a>00052 <span class="comment"> * segments.</span> <a name="l00053"></a>00053 <span class="comment"> * - Moved definitions of CONT_AD_STATE_{SIL,SPEECH} from .c to .h.</span> <a name="l00054"></a>00054 <span class="comment"> * </span> <a name="l00055"></a>00055 <span class="comment"> * Revision 1.12 2005/06/29 23:48:04 egouvea</span> <a name="l00056"></a>00056 <span class="comment"> * Revert changes: variables defined in cont_ad_base.c should not be accessible by the application</span> <a name="l00057"></a>00057 <span class="comment"> *</span> <a name="l00058"></a>00058 <span class="comment"> * Revision 1.10 2005/02/13 01:29:48 rkm</span> <a name="l00059"></a>00059 <span class="comment"> * Fixed cont_ad_read to never cross sil/speech boundary, and rawmode</span> <a name="l00060"></a>00060 <span class="comment"> *</span> <a name="l00061"></a>00061 <span class="comment"> * Revision 1.9 2005/02/01 22:21:19 rkm</span> <a name="l00062"></a>00062 <span class="comment"> * Added raw data logging, and raw data pass-through mode to cont_ad</span> <a name="l00063"></a>00063 <span class="comment"> *</span> <a name="l00064"></a>00064 <span class="comment"> * Revision 1.8 2004/07/23 23:36:34 egouvea</span> <a name="l00065"></a>00065 <span class="comment"> * Ravi's merge, with the latest fixes in the FSG code, and making the log files generated by FSG, LM, and allphone have the same 'look and feel', with the backtrace information presented consistently</span> <a name="l00066"></a>00066 <span class="comment"> *</span> <a name="l00067"></a>00067 <span class="comment"> * 23-Jul-2004 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00068"></a>00068 <span class="comment"> * Changed default adapt_rate from 0.5 to 0.2.</span> <a name="l00069"></a>00069 <span class="comment"> *</span> <a name="l00070"></a>00070 <span class="comment"> * Revision 1.7 2004/07/16 00:57:12 egouvea</span> <a name="l00071"></a>00071 <span class="comment"> * Added Ravi's implementation of FSG support.</span> <a name="l00072"></a>00072 <span class="comment"> *</span> <a name="l00073"></a>00073 <span class="comment"> * Revision 1.2 2004/06/23 20:31:18 rkm</span> <a name="l00074"></a>00074 <span class="comment"> * Added adapt_rate parameter; restructured frame processing to include threshold update</span> <a name="l00075"></a>00075 <span class="comment"> *</span> <a name="l00076"></a>00076 <span class="comment"> * </span> <a name="l00077"></a>00077 <span class="comment"> * 23-Oct-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00078"></a>00078 <span class="comment"> * Small change in the way the noiselevel is updated in find_thresh().</span> <a name="l00079"></a>00079 <span class="comment"> * </span> <a name="l00080"></a>00080 <span class="comment"> * 26-Aug-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00081"></a>00081 <span class="comment"> * Separated computation of "frame power" into a separate low-level</span> <a name="l00082"></a>00082 <span class="comment"> * function.</span> <a name="l00083"></a>00083 <span class="comment"> * </span> <a name="l00084"></a>00084 <span class="comment"> * 13-Jul-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00085"></a>00085 <span class="comment"> * Modified to allow frame size to depend on audio sampling rate.</span> <a name="l00086"></a>00086 <span class="comment"> * </span> <a name="l00087"></a>00087 <span class="comment"> * 01-Jul-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00088"></a>00088 <span class="comment"> * Changed CONT_AD_DELTA_SPEECH back to 20.</span> <a name="l00089"></a>00089 <span class="comment"> * </span> <a name="l00090"></a>00090 <span class="comment"> * 30-Jun-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00091"></a>00091 <span class="comment"> * Changed CONT_AD_DELTA_SPEECH from 10 to 15.</span> <a name="l00092"></a>00092 <span class="comment"> * Added FILE* argument to cont_ad_powhist_dump().</span> <a name="l00093"></a>00093 <span class="comment"> * </span> <a name="l00094"></a>00094 <span class="comment"> * 19-Jun-98 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00095"></a>00095 <span class="comment"> * Changed CONT_AD_DELTA_SPEECH from 20 to 10, to increase sensitivity</span> <a name="l00096"></a>00096 <span class="comment"> * to very short utterances.</span> <a name="l00097"></a>00097 <span class="comment"> * </span> <a name="l00098"></a>00098 <span class="comment"> * 16-Jan-98 Paul Placeway (pwp@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00099"></a>00099 <span class="comment"> * Changed to use dB instead of the weird power measure.</span> <a name="l00100"></a>00100 <span class="comment"> * Changed analysis window size, tuned default settings of most</span> <a name="l00101"></a>00101 <span class="comment"> * parameters to make the system less sensitive to noise, changed</span> <a name="l00102"></a>00102 <span class="comment"> * the histogram update frequency and decay to make the system</span> <a name="l00103"></a>00103 <span class="comment"> * adapt more rapidly to changes in the environment.</span> <a name="l00104"></a>00104 <span class="comment"> * Added cont_ad_set_params() and cont_ad_get_params().</span> <a name="l00105"></a>00105 <span class="comment"> * </span> <a name="l00106"></a>00106 <span class="comment"> * 28-Jul-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00107"></a>00107 <span class="comment"> * Added FRMPOW2SIGLVL, max_siglvl(), and cont_ad_t.siglvl.</span> <a name="l00108"></a>00108 <span class="comment"> * Changed min signal energy/frame to CONT_AD_SPF.</span> <a name="l00109"></a>00109 <span class="comment"> * </span> <a name="l00110"></a>00110 <span class="comment"> * 27-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00111"></a>00111 <span class="comment"> * Added the option for cont_ad_read to return -1 on EOF.</span> <a name="l00112"></a>00112 <span class="comment"> * </span> <a name="l00113"></a>00113 <span class="comment"> * 21-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00114"></a>00114 <span class="comment"> * Added cont_ad_set_thresh().</span> <a name="l00115"></a>00115 <span class="comment"> * Bugfix: n_other is recomputed after updating thresholds.</span> <a name="l00116"></a>00116 <span class="comment"> * </span> <a name="l00117"></a>00117 <span class="comment"> * 20-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00118"></a>00118 <span class="comment"> * Separated thresholds for speech and silence.</span> <a name="l00119"></a>00119 <span class="comment"> * Fixed bug in moving analysis window upon transition to speech state.</span> <a name="l00120"></a>00120 <span class="comment"> * </span> <a name="l00121"></a>00121 <span class="comment"> * 17-Jun-96 M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span> <a name="l00122"></a>00122 <span class="comment"> * Created, based loosely on Steve Reed's original implementation.</span> <a name="l00123"></a>00123 <span class="comment"> */</span> <a name="l00124"></a>00124 <a name="l00125"></a>00125 <span class="comment">/*</span> <a name="l00126"></a>00126 <span class="comment"> * This module is intended to be interposed as a filter between any raw A/D source and the</span> <a name="l00127"></a>00127 <span class="comment"> * application to remove silence regions. It is initialized with a raw A/D source function</span> <a name="l00128"></a>00128 <span class="comment"> * (during the cont_ad_init call). Filtered A/D data can be read by the application using</span> <a name="l00129"></a>00129 <span class="comment"> * the cont_ad_read function. This module assumes that the A/D source function supplies an</span> <a name="l00130"></a>00130 <span class="comment"> * endless stream of data. The application is responsible for setting up the A/D source,</span> <a name="l00131"></a>00131 <span class="comment"> * turning recording on and off as it desires. It is also responsible for invoking the</span> <a name="l00132"></a>00132 <span class="comment"> * cont_ad_read function frequently enough to avoid buffer overruns and dropping A/D data.</span> <a name="l00133"></a>00133 <span class="comment"> * This continuous listening module has an internal buffer of about 4 sec.</span> <a name="l00134"></a>00134 <span class="comment"> * </span> <a name="l00135"></a>00135 <span class="comment"> * This module must be initialized and calibrated at first (cont_ad_init and cont_ad_calib</span> <a name="l00136"></a>00136 <span class="comment"> * functions). Raw samples are grouped into frames, the signal power in each frame is</span> <a name="l00137"></a>00137 <span class="comment"> * computed and accumulated in a histogram. The module is always in one of two states:</span> <a name="l00138"></a>00138 <span class="comment"> * SILENCE or SPEECH. Transitions between the two states are detected by looking for a</span> <a name="l00139"></a>00139 <span class="comment"> * contiguous window of several frames that is predominantly of the other type. The type</span> <a name="l00140"></a>00140 <span class="comment"> * is determined by comparing frame power to either of two thresholds, thresh_sil and</span> <a name="l00141"></a>00141 <span class="comment"> * thresh_speech, as appropriate for the current state. These thresholds are set from the</span> <a name="l00142"></a>00142 <span class="comment"> * first peak in the low-end of the power histogram, and are updated every few seconds.</span> <a name="l00143"></a>00143 <span class="comment"> * Separate thresholds are used to provide some hysteresis.</span> <a name="l00144"></a>00144 <span class="comment"> * </span> <a name="l00145"></a>00145 <span class="comment"> * The module maintains a linked list of speech (non-silence) segments not yet read by the</span> <a name="l00146"></a>00146 <span class="comment"> * application. The cont_ad_read function returns speech data, if any available, by</span> <a name="l00147"></a>00147 <span class="comment"> * following this list. It also updates an "absolute" timestamp at the end of the</span> <a name="l00148"></a>00148 <span class="comment"> * cont_ad_read operation. The timestamp indicates the total #samples of A/D data read</span> <a name="l00149"></a>00149 <span class="comment"> * until this point, including data discarded as silence frames. The application is</span> <a name="l00150"></a>00150 <span class="comment"> * responsible for using this timestamp to make any policy decisions regarding utterance</span> <a name="l00151"></a>00151 <span class="comment"> * boundaries or whatever.</span> <a name="l00152"></a>00152 <span class="comment"> */</span> <a name="l00153"></a>00153 <a name="l00154"></a>00154 <span class="preprocessor">#include <stdio.h></span> <a name="l00155"></a>00155 <span class="preprocessor">#include <stdlib.h></span> <a name="l00156"></a>00156 <span class="preprocessor">#include <string.h></span> <a name="l00157"></a>00157 <span class="preprocessor">#include <assert.h></span> <a name="l00158"></a>00158 <span class="preprocessor">#include <math.h></span> <a name="l00159"></a>00159 <a name="l00160"></a>00160 <span class="preprocessor">#ifdef HAVE_CONFIG_H</span> <a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor">#include <config.h></span> <a name="l00162"></a>00162 <span class="preprocessor">#endif</span> <a name="l00163"></a>00163 <span class="preprocessor"></span> <a name="l00164"></a>00164 <span class="preprocessor">#ifdef _MSC_VER</span> <a name="l00165"></a>00165 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (disable: 4305)</span> <a name="l00166"></a>00166 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00167"></a>00167 <span class="preprocessor"></span> <a name="l00168"></a>00168 <span class="preprocessor">#include "sphinxbase/prim_type.h"</span> <a name="l00169"></a>00169 <span class="preprocessor">#include "sphinxbase/ad.h"</span> <a name="l00170"></a>00170 <span class="preprocessor">#include "sphinxbase/cont_ad.h"</span> <a name="l00171"></a>00171 <span class="preprocessor">#include "sphinxbase/err.h"</span> <a name="l00172"></a>00172 <a name="l00173"></a>00173 <a name="l00174"></a>00174 <span class="preprocessor">#ifndef _ABS</span> <a name="l00175"></a>00175 <span class="preprocessor"></span><span class="preprocessor">#define _ABS(x) ((x) >= 0 ? (x) : -(x))</span> <a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00177"></a>00177 <span class="preprocessor"></span> <a name="l00178"></a>00178 <a name="l00179"></a>00179 <span class="comment">/* Various parameters, including defaults for many cont_ad_t member variables */</span> <a name="l00180"></a>00180 <a name="l00181"></a>00181 <span class="preprocessor">#define CONT_AD_ADFRMSIZE 256 </span><span class="comment">/* #Frames of internal A/D buffer maintained */</span> <a name="l00182"></a>00182 <a name="l00183"></a>00183 <span class="preprocessor">#define CONT_AD_POWHISTSIZE 98 </span><span class="comment">/* #Powhist bins: ~ FRMPOW(65536^2*CONT_AD_SPF) */</span> <a name="l00184"></a>00184 <span class="comment">/* Maximum level is 96.3 dB full-scale; 97 for safety, plus 1 for zero-based */</span> <a name="l00185"></a>00185 <a name="l00186"></a>00186 <span class="preprocessor">#define CONT_AD_CALIB_FRAMES (CONT_AD_POWHISTSIZE * 2)</span> <a name="l00187"></a>00187 <span class="preprocessor"></span> <a name="l00188"></a>00188 <span class="preprocessor">#define CONT_AD_THRESH_UPDATE 100 </span><span class="comment">/* Update thresholds approx every so many frames */</span> <a name="l00189"></a>00189 <span class="comment">/* PWP: update was 200 frames, or 3.2 seconds. Now about every 1.6 sec. */</span> <a name="l00190"></a>00190 <a name="l00191"></a>00191 <span class="preprocessor">#define CONT_AD_ADAPT_RATE 0.2 </span><span class="comment">/* Interpolation of new and old noiselevel */</span> <a name="l00192"></a>00192 <a name="l00193"></a>00193 <span class="preprocessor">#define CONT_AD_SPS 16000</span> <a name="l00194"></a>00194 <span class="preprocessor"></span> <a name="l00195"></a>00195 <span class="preprocessor">#define CONT_AD_DEFAULT_NOISE 30 </span><span class="comment">/* Default background noise power level */</span> <a name="l00196"></a>00196 <span class="preprocessor">#define CONT_AD_DELTA_SIL 10 </span><span class="comment">/* Initial default for cont_ad_t.delta_sil */</span> <a name="l00197"></a>00197 <span class="preprocessor">#define CONT_AD_DELTA_SPEECH 17 </span><span class="comment">/* Initial default for cont_ad_t.delta_speech */</span> <a name="l00198"></a>00198 <span class="preprocessor">#define CONT_AD_MIN_NOISE 2 </span><span class="comment">/* Expected minimum background noise level */</span> <a name="l00199"></a>00199 <span class="preprocessor">#define CONT_AD_MAX_NOISE 70 </span><span class="comment">/* Maximum background noise level */</span> <a name="l00200"></a>00200 <a name="l00201"></a>00201 <span class="preprocessor">#define CONT_AD_HIST_INERTIA 3 </span><span class="comment">/* Used in decaying the power histogram */</span> <a name="l00202"></a>00202 <a name="l00203"></a>00203 <span class="preprocessor">#define CONT_AD_WINSIZE 21 </span><span class="comment">/* Analysis window for state transitions */</span> <a name="l00204"></a>00204 <span class="comment">/* rkm had 16 */</span> <a name="l00205"></a>00205 <a name="l00206"></a>00206 <span class="preprocessor">#define CONT_AD_SPEECH_ONSET 9 </span><span class="comment">/* Min #speech frames in analysis window for</span> <a name="l00207"></a>00207 <span class="comment"> SILENCE -> SPEECH state transition */</span> <a name="l00208"></a>00208 <span class="comment">/*</span> <a name="l00209"></a>00209 <span class="comment"> * SReed had 100 ms == 6.25 fr contiguous; rkm had 9 (out of 16+10) with a</span> <a name="l00210"></a>00210 <span class="comment"> * lower threshold.</span> <a name="l00211"></a>00211 <span class="comment"> */</span> <a name="l00212"></a>00212 <a name="l00213"></a>00213 <span class="preprocessor">#define CONT_AD_SIL_ONSET 18 </span><span class="comment">/* Min #silence frames in analysis window for</span> <a name="l00214"></a>00214 <span class="comment"> SPEECH -> SILENCE state transition</span> <a name="l00215"></a>00215 <span class="comment"> MUST BE <= CONT_AD_WINSIZE */</span> <a name="l00216"></a>00216 <span class="comment">/*</span> <a name="l00217"></a>00217 <span class="comment"> * SReed had 400 ms == 25 fr contiguous; rkm had 14 out of 16</span> <a name="l00218"></a>00218 <span class="comment"> */</span> <a name="l00219"></a>00219 <a name="l00220"></a>00220 <span class="preprocessor">#define CONT_AD_LEADER 5 </span><span class="comment">/* On transition to SPEECH state, so many frames</span> <a name="l00221"></a>00221 <span class="comment"> BEFORE window included in speech data (>0) */</span> <a name="l00222"></a>00222 <span class="comment">/* SReed had 200 ms == 12.5 fr; rkm had 5 */</span> <a name="l00223"></a>00223 <a name="l00224"></a>00224 <span class="preprocessor">#define CONT_AD_TRAILER 10 </span><span class="comment">/* On transition to SILENCE state, so many frames</span> <a name="l00225"></a>00225 <span class="comment"> of silence included in speech data (>0).</span> <a name="l00226"></a>00226 <span class="comment"> NOTE: Ensure (0 < TRAILER+LEADER <= WINSIZE) */</span> <a name="l00227"></a>00227 <span class="comment">/* SReed had 100 ms == 6.25 fr; rkm had 10 */</span> <a name="l00228"></a>00228 <a name="l00229"></a>00229 <a name="l00230"></a>00230 <span class="keywordtype">void</span> <a name="l00231"></a><a class="code" href="cont__ad_8h.html#a288394cd94a4992bec9d3911cc875767">00231</a> <a class="code" href="cont__ad_8h.html#a288394cd94a4992bec9d3911cc875767" title="Dump the power histogram.">cont_ad_powhist_dump</a>(FILE * fp, <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r) <a name="l00232"></a>00232 { <a name="l00233"></a>00233 int32 i, j; <a name="l00234"></a>00234 <a name="l00235"></a>00235 fprintf(fp, <span class="stringliteral">"PowHist:\n"</span>); <a name="l00236"></a>00236 <span class="keywordflow">for</span> (i = 0, j = 0; i < CONT_AD_POWHISTSIZE; i++) { <a name="l00237"></a>00237 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] > 0) { <a name="l00238"></a>00238 fprintf(fp, <span class="stringliteral">"\t%3d %6d\n"</span>, i, r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i]); <a name="l00239"></a>00239 j = i; <a name="l00240"></a>00240 } <a name="l00241"></a>00241 } <a name="l00242"></a>00242 <a name="l00243"></a>00243 fprintf(fp, <span class="stringliteral">"PH[%7.2f]:"</span>, <a name="l00244"></a>00244 (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a>)); <a name="l00245"></a>00245 <span class="keywordflow">for</span> (i = 0; i <= j; i++) <a name="l00246"></a>00246 fprintf(fp, <span class="stringliteral">" %2d"</span>, r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i]); <a name="l00247"></a>00247 fprintf(fp, <span class="stringliteral">"\n"</span>); <a name="l00248"></a>00248 <a name="l00249"></a>00249 fflush(fp); <a name="l00250"></a>00250 } <a name="l00251"></a>00251 <a name="l00252"></a>00252 <a name="l00253"></a>00253 <span class="comment">/*</span> <a name="l00254"></a>00254 <span class="comment"> * Compute frame power. Interface deliberately kept low level to allow arbitrary</span> <a name="l00255"></a>00255 <span class="comment"> * users to call this function with appropriate data.</span> <a name="l00256"></a>00256 <span class="comment"> */</span> <a name="l00257"></a>00257 int32 <a name="l00258"></a>00258 cont_ad_frame_pow(int16 * buf, int32 * prev, int32 spf) <a name="l00259"></a>00259 { <a name="l00260"></a>00260 <span class="keywordtype">double</span> sumsq, v; <a name="l00261"></a>00261 int32 i; <a name="l00262"></a>00262 int32 p; <a name="l00263"></a>00263 <a name="l00264"></a>00264 sumsq = 0.0; <a name="l00265"></a>00265 p = *prev; <a name="l00266"></a>00266 <span class="keywordflow">for</span> (i = 0; i < spf; i++) { <a name="l00267"></a>00267 <span class="comment">/* Note: pre-emphasis done to remove low-frequency noise. */</span> <a name="l00268"></a>00268 v = (double) (buf[i] - p); <a name="l00269"></a>00269 sumsq += v * v; <a name="l00270"></a>00270 p = buf[i]; <a name="l00271"></a>00271 } <a name="l00272"></a>00272 *prev = p; <a name="l00273"></a>00273 <a name="l00274"></a>00274 <span class="keywordflow">if</span> (sumsq < spf) <span class="comment">/* Make sure FRMPOW(sumsq) >= 0 */</span> <a name="l00275"></a>00275 sumsq = spf; <a name="l00276"></a>00276 <a name="l00277"></a>00277 <span class="comment">/*</span> <a name="l00278"></a>00278 <span class="comment"> * PWP: Units changed to dB</span> <a name="l00279"></a>00279 <span class="comment"> *</span> <a name="l00280"></a>00280 <span class="comment"> * Now the units of measurement of an input sample are volts (really!),</span> <a name="l00281"></a>00281 <span class="comment"> * so the power in dB is p = 20*log10(samp). Further, we want the RMS</span> <a name="l00282"></a>00282 <span class="comment"> * (root-mean-squared) average power across the frame.</span> <a name="l00283"></a>00283 <span class="comment"> *</span> <a name="l00284"></a>00284 <span class="comment"> * "sumsq" is the sum of the sum of the squares, so we want</span> <a name="l00285"></a>00285 <span class="comment"> *</span> <a name="l00286"></a>00286 <span class="comment"> * i = 20 * log10( sqrt ( sumsq / n_samps) )</span> <a name="l00287"></a>00287 <span class="comment"> *</span> <a name="l00288"></a>00288 <span class="comment"> * (Stephen Reed's code actually had </span> <a name="l00289"></a>00289 <span class="comment"> * i = 20 * log10( sqrt (sumsq) / n_samps )</span> <a name="l00290"></a>00290 <span class="comment"> * but this only produced an additive error.)</span> <a name="l00291"></a>00291 <span class="comment"> *</span> <a name="l00292"></a>00292 <span class="comment"> * i = 20 * log10( sqrt ( sumsq / n_samps) )</span> <a name="l00293"></a>00293 <span class="comment"> * = 20 * log10( ( sumsq / n_samps) ^ 0.5 )</span> <a name="l00294"></a>00294 <span class="comment"> * = 20 * log10( ( sumsq / n_samps) ) * 0.5 )</span> <a name="l00295"></a>00295 <span class="comment"> * = 10 * log10( ( sumsq / n_samps) )</span> <a name="l00296"></a>00296 <span class="comment"> * = 10 * ( log10( sumsq) - log10(n_samps) )</span> <a name="l00297"></a>00297 <span class="comment"> */</span> <a name="l00298"></a>00298 i = (int32) ((10.0 * (log10(sumsq) - log10((<span class="keywordtype">double</span>) spf))) + 0.5); <a name="l00299"></a>00299 <span class="keywordflow">if</span> (i < 0) <a name="l00300"></a>00300 i = 0; <span class="comment">/* trim lower bound again to be safe. */</span> <a name="l00301"></a>00301 assert(i < 97); <a name="l00302"></a>00302 <a name="l00303"></a>00303 <span class="keywordflow">return</span> (i); <a name="l00304"></a>00304 } <a name="l00305"></a>00305 <a name="l00306"></a>00306 <a name="l00307"></a>00307 <span class="comment">/*</span> <a name="l00308"></a>00308 <span class="comment"> * Classify frame (id=frm, starting at sample position s) as sil/nonsil. Classification</span> <a name="l00309"></a>00309 <span class="comment"> * done in isolation, independent of any other frame, based only on power histogram.</span> <a name="l00310"></a>00310 <span class="comment"> */</span> <a name="l00311"></a>00311 <span class="keyword">static</span> <span class="keywordtype">void</span> <a name="l00312"></a>00312 compute_frame_pow(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 frm) <a name="l00313"></a>00313 { <a name="l00314"></a>00314 int32 i; <a name="l00315"></a>00315 <a name="l00316"></a>00316 i = cont_ad_frame_pow(r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + (frm * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>), &(r-><a class="code" href="structcont__ad__t.html#a54e2013d9634ec473aaf79a606fb2e0f" title="For pre-emphasis filter.">prev_sample</a>), <a name="l00317"></a>00317 r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>); <a name="l00318"></a>00318 <a name="l00319"></a>00319 r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm] = (char) i; <a name="l00320"></a>00320 (r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i])++; <a name="l00321"></a>00321 r-><a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a>--; <a name="l00322"></a>00322 } <a name="l00323"></a>00323 <a name="l00324"></a>00324 <a name="l00325"></a>00325 <span class="comment">/* PWP: $$$ check this */</span> <a name="l00326"></a>00326 <span class="comment">/*</span> <a name="l00327"></a>00327 <span class="comment"> * PWP: in SReed's code, decay was done by zeroing the histogram,</span> <a name="l00328"></a>00328 <span class="comment"> * i.e. no history.</span> <a name="l00329"></a>00329 <span class="comment"> */</span> <a name="l00330"></a>00330 <span class="keyword">static</span> <span class="keywordtype">void</span> <a name="l00331"></a>00331 decay_hist(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r) <a name="l00332"></a>00332 { <a name="l00333"></a>00333 int32 i; <a name="l00334"></a>00334 <a name="l00335"></a>00335 <span class="keywordflow">for</span> (i = 0; i < CONT_AD_POWHISTSIZE; i++) <a name="l00336"></a>00336 r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] -= (r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] >> CONT_AD_HIST_INERTIA); <a name="l00337"></a>00337 } <a name="l00338"></a>00338 <a name="l00339"></a>00339 <a name="l00340"></a>00340 <span class="comment">/*</span> <a name="l00341"></a>00341 <span class="comment"> * Find silence threshold from power histogram.</span> <a name="l00342"></a>00342 <span class="comment"> */</span> <a name="l00343"></a>00343 <span class="keyword">static</span> int32 <a name="l00344"></a>00344 find_thresh(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r) <a name="l00345"></a>00345 { <a name="l00346"></a>00346 int32 i, j, max, th; <a name="l00347"></a>00347 int32 old_noise_level, old_thresh_sil, old_thresh_speech; <a name="l00348"></a>00348 <a name="l00349"></a>00349 <span class="keywordflow">if</span> (!r-><a class="code" href="structcont__ad__t.html#a9e23379bf649ee06ece20133316253e5" title="Do automatic threshold adjustment or not.">auto_thresh</a>) <a name="l00350"></a>00350 <span class="keywordflow">return</span> 0; <a name="l00351"></a>00351 <a name="l00352"></a>00352 <span class="comment">/*</span> <a name="l00353"></a>00353 <span class="comment"> * Find smallest non-zero histogram entry, but starting at some minimum power.</span> <a name="l00354"></a>00354 <span class="comment"> * Power lower than CONT_AD_MIN_NOISE indicates bad A/D input (eg, mic off...).</span> <a name="l00355"></a>00355 <span class="comment"> * Too high a minimum power is also bad.</span> <a name="l00356"></a>00356 <span class="comment"> */</span> <a name="l00357"></a>00357 <span class="keywordflow">for</span> (i = r-><a class="code" href="structcont__ad__t.html#ac301114b24356aef2edccba155e3cf33" title="noise lower than this we ignore">min_noise</a>; <a name="l00358"></a>00358 (i < CONT_AD_POWHISTSIZE) && (r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] == 0); i++); <a name="l00359"></a>00359 <span class="keywordflow">if</span> (i > r-><a class="code" href="structcont__ad__t.html#af3b50663565964bb18ebb9f9e0002421" title="noise higher than this signals an error">max_noise</a>) <span class="comment">/* Bad signal? */</span> <a name="l00360"></a>00360 <span class="keywordflow">return</span> -1; <a name="l00361"></a>00361 <a name="l00362"></a>00362 <span class="comment">/* PWP: Hmmmmm.... SReed's code looks over the lower 20 dB */</span> <a name="l00363"></a>00363 <span class="comment">/* PWP: 1/14/98 Made to work like Stephen Reed's code */</span> <a name="l00364"></a>00364 <a name="l00365"></a>00365 <span class="comment">/* This method of detecting the noise level is VERY unsatisfactory */</span> <a name="l00366"></a>00366 max = 0; <a name="l00367"></a>00367 <span class="keywordflow">for</span> (j = i, th = i; (j < CONT_AD_POWHISTSIZE) && (j < i + 20); j++) { <span class="comment">/* PWP: was i+6, which was 9 dB */</span> <a name="l00368"></a>00368 <span class="keywordflow">if</span> (max < r->pow_hist[j]) { <a name="l00369"></a>00369 max = r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[j]; <a name="l00370"></a>00370 th = j; <a name="l00371"></a>00371 } <a name="l00372"></a>00372 } <a name="l00373"></a>00373 <a name="l00374"></a>00374 <span class="comment">/* "Don't change the threshold too fast" */</span> <a name="l00375"></a>00375 old_noise_level = r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a>; <a name="l00376"></a>00376 old_thresh_sil = r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>; <a name="l00377"></a>00377 old_thresh_speech = r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>; <a name="l00378"></a>00378 <span class="comment">/* r->noise_level = (int32) (th * r->adapt_rate + r->noise_level * (1.0 - r->adapt_rate)); */</span> <a name="l00379"></a>00379 r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a> = <a name="l00380"></a>00380 (int32) (r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a> + <a name="l00381"></a>00381 r-><a class="code" href="structcont__ad__t.html#ac22395096037175bf9a0a1f6877e5ec5" title="Linear interpolation constant for rate at which noise level adapted to each estimate; range: 0-1; 0=&...">adapt_rate</a> * (th - r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a>) + 0.5); <a name="l00382"></a>00382 <a name="l00383"></a>00383 <span class="comment">/* update thresholds */</span> <a name="l00384"></a>00384 r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a> = r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a> + r-><a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a>; <a name="l00385"></a>00385 r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a> = r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a> + r-><a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a>; <a name="l00386"></a>00386 <a name="l00387"></a>00387 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>) { <a name="l00388"></a>00388 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <a name="l00389"></a>00389 <span class="stringliteral">"%7.2fs %8df: NoisePeak: %d, Noiselevel: %d -> %d, Th-Sil: %d -> %d, Th-Sp: %d -> %d\n"</span>, <a name="l00390"></a>00390 (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a>), <a name="l00391"></a>00391 r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>, th, old_noise_level, r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a>, <a name="l00392"></a>00392 old_thresh_sil, r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>, old_thresh_speech, <a name="l00393"></a>00393 r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>); <a name="l00394"></a>00394 <a name="l00395"></a>00395 <a class="code" href="cont__ad_8h.html#a288394cd94a4992bec9d3911cc875767" title="Dump the power histogram.">cont_ad_powhist_dump</a>(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, r); <a name="l00396"></a>00396 <a name="l00397"></a>00397 fflush(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>); <a name="l00398"></a>00398 } <a name="l00399"></a>00399 <a name="l00400"></a>00400 <span class="comment">/*</span> <a name="l00401"></a>00401 <span class="comment"> * PWP: in SReed's original, he cleared the histogram here.</span> <a name="l00402"></a>00402 <span class="comment"> * I can't fathom why.</span> <a name="l00403"></a>00403 <span class="comment"> */</span> <a name="l00404"></a>00404 <a name="l00405"></a>00405 <span class="keywordflow">return</span> 0; <a name="l00406"></a>00406 } <a name="l00407"></a>00407 <a name="l00408"></a>00408 <a name="l00409"></a>00409 <span class="comment">/*</span> <a name="l00410"></a>00410 <span class="comment"> * Silence to speech transition</span> <a name="l00411"></a>00411 <span class="comment"> */</span> <a name="l00412"></a>00412 <span class="keyword">static</span> <span class="keywordtype">void</span> <a name="l00413"></a>00413 sil2speech_transition(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r, <span class="keywordtype">int</span> frm) <a name="l00414"></a>00414 { <a name="l00415"></a>00415 <a class="code" href="structspseg__t.html" title="(FOR INTERNAL USE ) Data structure for maintaining speech (non-silence) segments not yet consumed by ...">spseg_t</a> *seg; <a name="l00416"></a>00416 <a name="l00417"></a>00417 <span class="comment">/* Speech detected; create speech segment description */</span> <a name="l00418"></a>00418 seg = malloc(<span class="keyword">sizeof</span>(*seg)); <a name="l00419"></a>00419 <a name="l00420"></a>00420 seg->startfrm = r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> - r-><a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a>; <a name="l00421"></a>00421 <span class="keywordflow">if</span> (seg->startfrm < 0) <a name="l00422"></a>00422 seg->startfrm += CONT_AD_ADFRMSIZE; <a name="l00423"></a>00423 seg->nfrm = r-><a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> + r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>; <a name="l00424"></a>00424 seg->next = NULL; <a name="l00425"></a>00425 <a name="l00426"></a>00426 <span class="keywordflow">if</span> (!r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>) <a name="l00427"></a>00427 r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> = seg; <a name="l00428"></a>00428 <span class="keywordflow">else</span> <a name="l00429"></a>00429 r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>->next = seg; <a name="l00430"></a>00430 r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> = seg; <a name="l00431"></a>00431 <a name="l00432"></a>00432 r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SPEECH; <a name="l00433"></a>00433 <a name="l00434"></a>00434 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>) { <a name="l00435"></a>00435 int32 n; <a name="l00436"></a>00436 <a name="l00437"></a>00437 <span class="comment">/* Where (in absolute time) this speech segment starts */</span> <a name="l00438"></a>00438 n = frm - seg->startfrm; <a name="l00439"></a>00439 <span class="keywordflow">if</span> (n < 0) <a name="l00440"></a>00440 n += CONT_AD_ADFRMSIZE; <a name="l00441"></a>00441 n = r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> - n - 1; <a name="l00442"></a>00442 <a name="l00443"></a>00443 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <a name="l00444"></a>00444 <span class="stringliteral">"%7.2fs %8d[%3d]f: Sil -> Sp detect; seg start: %7.2fs %8d\n"</span>, <a name="l00445"></a>00445 (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> * <a name="l00446"></a>00446 r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / <a name="l00447"></a>00447 (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a>), <a name="l00448"></a>00448 r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>, frm, <a name="l00449"></a>00449 (<span class="keywordtype">double</span>) (n * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a>), n); <a name="l00450"></a>00450 } <a name="l00451"></a>00451 <a name="l00452"></a>00452 <span class="comment">/* Now in SPEECH state; want to look for silence from end of this window */</span> <a name="l00453"></a>00453 r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> = 1; <a name="l00454"></a>00454 r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> = frm; <a name="l00455"></a>00455 <a name="l00456"></a>00456 <span class="comment">/* Count #sil frames remaining in reduced window (of 1 frame) */</span> <a name="l00457"></a>00457 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm] <= r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>) ? 1 : 0; <a name="l00458"></a>00458 } <a name="l00459"></a>00459 <a name="l00460"></a>00460 <span class="comment">/*</span> <a name="l00461"></a>00461 <span class="comment"> * Speech to silence transition</span> <a name="l00462"></a>00462 <span class="comment"> */</span> <a name="l00463"></a>00463 <span class="keyword">static</span> <span class="keywordtype">void</span> <a name="l00464"></a>00464 speech2sil_transition(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r, <span class="keywordtype">int</span> frm) <a name="l00465"></a>00465 { <a name="l00466"></a>00466 <span class="keywordtype">int</span> f; <a name="l00467"></a>00467 <a name="l00468"></a>00468 <span class="comment">/* End of speech detected; speech->sil transition */</span> <a name="l00469"></a>00469 r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>->nfrm += r-><a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a>; <a name="l00470"></a>00470 <a name="l00471"></a>00471 r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SIL; <a name="l00472"></a>00472 <a name="l00473"></a>00473 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>) { <a name="l00474"></a>00474 int32 n; <a name="l00475"></a>00475 <a name="l00476"></a>00476 <span class="comment">/* Where (in absolute time) this speech segment ends */</span> <a name="l00477"></a>00477 n = r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>->startfrm + r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>->nfrm - 1; <a name="l00478"></a>00478 <span class="keywordflow">if</span> (n >= CONT_AD_ADFRMSIZE) <a name="l00479"></a>00479 n -= CONT_AD_ADFRMSIZE; <a name="l00480"></a>00480 n = frm - n; <a name="l00481"></a>00481 <span class="keywordflow">if</span> (n < 0) <a name="l00482"></a>00482 n += CONT_AD_ADFRMSIZE; <a name="l00483"></a>00483 n = r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> - n; <a name="l00484"></a>00484 <a name="l00485"></a>00485 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <a name="l00486"></a>00486 <span class="stringliteral">"%7.2fs %8d[%3d]f: Sp -> Sil detect; seg end: %7.2fs %8d\n"</span>, <a name="l00487"></a>00487 (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / <a name="l00488"></a>00488 (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a>), r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>, frm, <a name="l00489"></a>00489 (<span class="keywordtype">double</span>) (n * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a>), n); <a name="l00490"></a>00490 } <a name="l00491"></a>00491 <a name="l00492"></a>00492 <span class="comment">/* Now in SILENCE state; start looking for speech trailer+leader frames later */</span> <a name="l00493"></a>00493 r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> -= (r-><a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a> + r-><a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> - 1); <a name="l00494"></a>00494 r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> += (r-><a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a> + r-><a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> - 1); <a name="l00495"></a>00495 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> >= CONT_AD_ADFRMSIZE) <a name="l00496"></a>00496 r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> -= CONT_AD_ADFRMSIZE; <a name="l00497"></a>00497 <a name="l00498"></a>00498 <span class="comment">/* Count #speech frames remaining in reduced window */</span> <a name="l00499"></a>00499 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0; <a name="l00500"></a>00500 <span class="keywordflow">for</span> (f = r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>;;) { <a name="l00501"></a>00501 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] >= r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>) <a name="l00502"></a>00502 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++; <a name="l00503"></a>00503 <a name="l00504"></a>00504 <span class="keywordflow">if</span> (f == frm) <a name="l00505"></a>00505 <span class="keywordflow">break</span>; <a name="l00506"></a>00506 <a name="l00507"></a>00507 f++; <a name="l00508"></a>00508 <span class="keywordflow">if</span> (f >= CONT_AD_ADFRMSIZE) <a name="l00509"></a>00509 f = 0; <a name="l00510"></a>00510 } <a name="l00511"></a>00511 } <a name="l00512"></a>00512 <a name="l00513"></a>00513 <a name="l00514"></a>00514 <span class="comment">/*</span> <a name="l00515"></a>00515 <span class="comment"> * Main silence/speech region detection routine. If currently in</span> <a name="l00516"></a>00516 <span class="comment"> * SILENCE state, switch to SPEECH state if a window (r->winsize)</span> <a name="l00517"></a>00517 <span class="comment"> * of frames is mostly non-silence. If in SPEECH state, switch to</span> <a name="l00518"></a>00518 <span class="comment"> * SILENCE state if the window is mostly silence.</span> <a name="l00519"></a>00519 <span class="comment"> */</span> <a name="l00520"></a>00520 <span class="keyword">static</span> <span class="keywordtype">void</span> <a name="l00521"></a>00521 boundary_detect(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 frm) <a name="l00522"></a>00522 { <a name="l00523"></a>00523 assert(r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> >= 0); <a name="l00524"></a>00524 <a name="l00525"></a>00525 r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>++; <a name="l00526"></a>00526 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) { <a name="l00527"></a>00527 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm] >= r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>) <a name="l00528"></a>00528 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++; <a name="l00529"></a>00529 } <a name="l00530"></a>00530 <span class="keywordflow">else</span> { <a name="l00531"></a>00531 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm] <= r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>) <a name="l00532"></a>00532 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++; <a name="l00533"></a>00533 } <a name="l00534"></a>00534 <a name="l00535"></a>00535 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>) { <a name="l00536"></a>00536 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <a name="l00537"></a>00537 <span class="stringliteral">"%7.2fs %8d[%3d]f: P: %2d, N: %2d, T+: %2d, T-: %2d, #O: %2d, %s\n"</span>, <a name="l00538"></a>00538 (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a>), <a name="l00539"></a>00539 r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>, frm, r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm], r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a>, <a name="l00540"></a>00540 r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>, r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>, r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>, <a name="l00541"></a>00541 (r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) ? <span class="stringliteral">"--"</span> : <span class="stringliteral">"Sp"</span>); <a name="l00542"></a>00542 } <a name="l00543"></a>00543 <a name="l00544"></a>00544 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> < r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>) <span class="comment">/* Not reached full analysis window size */</span> <a name="l00545"></a>00545 <span class="keywordflow">return</span>; <a name="l00546"></a>00546 assert(r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> == r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>); <a name="l00547"></a>00547 <a name="l00548"></a>00548 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) { <span class="comment">/* Currently in SILENCE state */</span> <a name="l00549"></a>00549 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> >= r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> + r-><a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> <a name="l00550"></a>00550 && r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> >= r-><a class="code" href="structcont__ad__t.html#a1b0bb7e53a2bf537ed362badddca341b" title="start speech on &gt;= these many frames out of winsize, of &gt;= delta_speech">speech_onset</a>) { <a name="l00551"></a>00551 sil2speech_transition(r, frm); <a name="l00552"></a>00552 } <a name="l00553"></a>00553 } <a name="l00554"></a>00554 <span class="keywordflow">else</span> { <a name="l00555"></a>00555 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> >= r-><a class="code" href="structcont__ad__t.html#a9f5e138f4b79b59bf4daa5603d171165" title="end speech on &gt;= these many frames out of winsize, of &lt;= delta_sil">sil_onset</a>) { <a name="l00556"></a>00556 speech2sil_transition(r, frm); <a name="l00557"></a>00557 } <a name="l00558"></a>00558 <span class="keywordflow">else</span> { <a name="l00559"></a>00559 <span class="comment">/* In speech state, and staying there; add this frame to segment */</span> <a name="l00560"></a>00560 r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>->nfrm++; <a name="l00561"></a>00561 } <a name="l00562"></a>00562 } <a name="l00563"></a>00563 <a name="l00564"></a>00564 <span class="comment">/*</span> <a name="l00565"></a>00565 <span class="comment"> * Get rid of oldest frame in analysis window. Not quite correct;</span> <a name="l00566"></a>00566 <span class="comment"> * thresholds could have changed over the window; should preserve</span> <a name="l00567"></a>00567 <span class="comment"> * the original speech/silence label for the frame and undo it. Later..</span> <a name="l00568"></a>00568 <span class="comment"> */</span> <a name="l00569"></a>00569 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) { <a name="l00570"></a>00570 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>] >= r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>) { <a name="l00571"></a>00571 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> > 0) <a name="l00572"></a>00572 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>--; <a name="l00573"></a>00573 } <a name="l00574"></a>00574 } <a name="l00575"></a>00575 <span class="keywordflow">else</span> { <a name="l00576"></a>00576 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>] <= r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>) { <a name="l00577"></a>00577 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> > 0) <a name="l00578"></a>00578 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>--; <a name="l00579"></a>00579 } <a name="l00580"></a>00580 } <a name="l00581"></a>00581 r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>--; <a name="l00582"></a>00582 r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>++; <a name="l00583"></a>00583 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> >= CONT_AD_ADFRMSIZE) <a name="l00584"></a>00584 r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> = 0; <a name="l00585"></a>00585 <a name="l00586"></a>00586 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>) <a name="l00587"></a>00587 fflush(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>); <a name="l00588"></a>00588 } <a name="l00589"></a>00589 <a name="l00590"></a>00590 <a name="l00591"></a>00591 <span class="keyword">static</span> int32 <a name="l00592"></a>00592 max_siglvl(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 startfrm, int32 nfrm) <a name="l00593"></a>00593 { <a name="l00594"></a>00594 int32 siglvl, i, f; <a name="l00595"></a>00595 <a name="l00596"></a>00596 siglvl = 0; <a name="l00597"></a>00597 <span class="keywordflow">if</span> (nfrm > 0) { <a name="l00598"></a>00598 <span class="keywordflow">for</span> (i = 0, f = startfrm; i < nfrm; i++, f++) { <a name="l00599"></a>00599 <span class="keywordflow">if</span> (f >= CONT_AD_ADFRMSIZE) <a name="l00600"></a>00600 f -= CONT_AD_ADFRMSIZE; <a name="l00601"></a>00601 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] > siglvl) <a name="l00602"></a>00602 siglvl = r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f]; <a name="l00603"></a>00603 } <a name="l00604"></a>00604 } <a name="l00605"></a>00605 <span class="keywordflow">return</span> siglvl; <a name="l00606"></a>00606 } <a name="l00607"></a>00607 <a name="l00608"></a>00608 <a name="l00609"></a>00609 <span class="preprocessor">#if 0</span> <a name="l00610"></a>00610 <span class="preprocessor"></span><span class="comment">/*</span> <a name="l00611"></a>00611 <span class="comment"> * RKM(2005/01/31): Where did this come from? If needed, it should be called</span> <a name="l00612"></a>00612 <span class="comment"> * cont_ad_get_audio_data.</span> <a name="l00613"></a>00613 <span class="comment"> */</span> <a name="l00614"></a>00614 <span class="keywordtype">void</span> <a name="l00615"></a>00615 get_audio_data(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int16 * buf, int32 max) <a name="l00616"></a>00616 { <a name="l00617"></a>00617 } <a name="l00618"></a>00618 <span class="preprocessor">#endif</span> <a name="l00619"></a>00619 <span class="preprocessor"></span> <a name="l00620"></a>00620 <a name="l00621"></a>00621 <span class="keyword">static</span> <span class="keywordtype">void</span> <a name="l00622"></a>00622 cont_ad_read_log(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 retval) <a name="l00623"></a>00623 { <a name="l00624"></a>00624 <a class="code" href="structspseg__t.html" title="(FOR INTERNAL USE ) Data structure for maintaining speech (non-silence) segments not yet consumed by ...">spseg_t</a> *seg; <a name="l00625"></a>00625 <a name="l00626"></a>00626 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"return from cont_ad_read() -> %d:\n"</span>, retval); <a name="l00627"></a>00627 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tstate: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#a5d9420ea711733d1eea9b8f29a638fdb" title="State of data returned by most recent cont_ad_read call; CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">state</a>); <a name="l00628"></a>00628 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tread_ts: %d (%.2fs)\n"</span>, <a name="l00629"></a>00629 r-><a class="code" href="structcont__ad__t.html#a7b71e87abfcb3ca4ae73af34c86f955e" title="Absolute timestamp (total no.">read_ts</a>, (float32) r-><a class="code" href="structcont__ad__t.html#a7b71e87abfcb3ca4ae73af34c86f955e" title="Absolute timestamp (total no.">read_ts</a> / (float32) r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a>); <a name="l00630"></a>00630 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tseglen: %d (%.2fs)\n"</span>, <a name="l00631"></a>00631 r-><a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a>, (float32) r-><a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a> / (float32) r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a>); <a name="l00632"></a>00632 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tsiglvl: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#a5524c052dcd0a3d1a1c3b1fc2134b62e" title="Max signal level for the data consumed by the most recent cont_ad_read call (dB range: 0-99)...">siglvl</a>); <a name="l00633"></a>00633 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\theadfrm: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>); <a name="l00634"></a>00634 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tn_frm: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>); <a name="l00635"></a>00635 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tn_sample: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a>); <a name="l00636"></a>00636 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\twin_startfrm: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>); <a name="l00637"></a>00637 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\twin_validfrm: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>); <a name="l00638"></a>00638 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tnoise_level: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a>); <a name="l00639"></a>00639 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tthresh_sil: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>); <a name="l00640"></a>00640 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tthresh_speech: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>); <a name="l00641"></a>00641 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tn_other: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>); <a name="l00642"></a>00642 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\ttail_state: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a>); <a name="l00643"></a>00643 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\ttot_frm: %d\n"</span>, r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>); <a name="l00644"></a>00644 <a name="l00645"></a>00645 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\tspseg:"</span>); <a name="l00646"></a>00646 <span class="keywordflow">for</span> (seg = r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>; seg; seg = seg->next) <a name="l00647"></a>00647 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">" %d[%d]"</span>, seg->startfrm, seg->nfrm); <a name="l00648"></a>00648 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"\n"</span>); <a name="l00649"></a>00649 <a name="l00650"></a>00650 fflush(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>); <a name="l00651"></a>00651 } <a name="l00652"></a>00652 <a name="l00653"></a>00653 <a name="l00654"></a>00654 <span class="comment">/*</span> <a name="l00655"></a>00655 <span class="comment"> * Copy data from r->adbuf[sf], for nf frames, into buf.</span> <a name="l00656"></a>00656 <span class="comment"> * All length checks must have been completed before this call; hence, this</span> <a name="l00657"></a>00657 <span class="comment"> * function will copy exactly the specified number of frames.</span> <a name="l00658"></a>00658 <span class="comment"> * </span> <a name="l00659"></a>00659 <span class="comment"> * Return value: Index of frame just after the segment copied, possibly wrapped</span> <a name="l00660"></a>00660 <span class="comment"> * around to 0.</span> <a name="l00661"></a>00661 <span class="comment"> */</span> <a name="l00662"></a>00662 <span class="keyword">static</span> int32 <a name="l00663"></a>00663 buf_copy(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 sf, int32 nf, int16 * buf) <a name="l00664"></a>00664 { <a name="l00665"></a>00665 int32 f, l; <a name="l00666"></a>00666 <a name="l00667"></a>00667 assert((sf >= 0) && (sf < CONT_AD_ADFRMSIZE)); <a name="l00668"></a>00668 assert(nf >= 0); <a name="l00669"></a>00669 <a name="l00670"></a>00670 <span class="keywordflow">if</span> (sf + nf > CONT_AD_ADFRMSIZE) { <a name="l00671"></a>00671 <span class="comment">/* Amount to be copied wraps around adbuf; copy in two stages */</span> <a name="l00672"></a>00672 f = CONT_AD_ADFRMSIZE - sf; <a name="l00673"></a>00673 l = (f * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>); <a name="l00674"></a>00674 memcpy(buf, r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + (sf * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>), l * <span class="keyword">sizeof</span>(int16)); <a name="l00675"></a>00675 <a name="l00676"></a>00676 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>) { <a name="l00677"></a>00677 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <a name="l00678"></a>00678 <span class="stringliteral">"return %d speech frames [%d..%d]; %d samples\n"</span>, <a name="l00679"></a>00679 f, sf, sf + f - 1, l); <a name="l00680"></a>00680 } <a name="l00681"></a>00681 <a name="l00682"></a>00682 buf += l; <a name="l00683"></a>00683 sf = 0; <a name="l00684"></a>00684 nf -= f; <a name="l00685"></a>00685 } <a name="l00686"></a>00686 <a name="l00687"></a>00687 <span class="keywordflow">if</span> (nf > 0) { <a name="l00688"></a>00688 l = (nf * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>); <a name="l00689"></a>00689 memcpy(buf, r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + (sf * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>), l * <span class="keyword">sizeof</span>(int16)); <a name="l00690"></a>00690 <a name="l00691"></a>00691 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>) { <a name="l00692"></a>00692 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <a name="l00693"></a>00693 <span class="stringliteral">"return %d speech frames [%d..%d]; %d samples\n"</span>, <a name="l00694"></a>00694 nf, sf, sf + nf - 1, l); <a name="l00695"></a>00695 } <a name="l00696"></a>00696 } <a name="l00697"></a>00697 <a name="l00698"></a>00698 <span class="keywordflow">if</span> ((sf + nf) >= CONT_AD_ADFRMSIZE) { <a name="l00699"></a>00699 assert((sf + nf) == CONT_AD_ADFRMSIZE); <a name="l00700"></a>00700 <span class="keywordflow">return</span> 0; <a name="l00701"></a>00701 } <a name="l00702"></a>00702 <span class="keywordflow">else</span> <a name="l00703"></a>00703 <span class="keywordflow">return</span> (sf + nf); <a name="l00704"></a>00704 } <a name="l00705"></a>00705 <a name="l00706"></a>00706 int32 <a name="l00707"></a><a class="code" href="cont__ad_8h.html#a680721acc14ac191bbae3a4940ed357d">00707</a> <a class="code" href="cont__ad_8h.html#a680721acc14ac191bbae3a4940ed357d" title="Get the maximum number of samples which can be passed into cont_ad_read().">cont_ad_buffer_space</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r) <a name="l00708"></a>00708 { <a name="l00709"></a>00709 <span class="keywordflow">return</span> r-><a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> - r-><a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a>; <a name="l00710"></a>00710 } <a name="l00711"></a>00711 <a name="l00712"></a>00712 <span class="comment">/*</span> <a name="l00713"></a>00713 <span class="comment"> * Read as much data as possible from r->adfunc into r->adbuf.</span> <a name="l00714"></a>00714 <span class="comment"> */</span> <a name="l00715"></a>00715 <span class="keyword">static</span> int32 <a name="l00716"></a>00716 cont_ad_read_internal(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r, int16 *buf, int32 max) <a name="l00717"></a>00717 { <a name="l00718"></a>00718 int32 head, tail, len, l; <a name="l00719"></a>00719 <a name="l00720"></a>00720 <span class="comment">/*</span> <a name="l00721"></a>00721 <span class="comment"> * First read as much of raw A/D as possible and available. adbuf is not</span> <a name="l00722"></a>00722 <span class="comment"> * really a circular buffer, so may have to read in two steps for wrapping</span> <a name="l00723"></a>00723 <span class="comment"> * around.</span> <a name="l00724"></a>00724 <span class="comment"> */</span> <a name="l00725"></a>00725 head = r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; <a name="l00726"></a>00726 tail = head + r-><a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a>; <a name="l00727"></a>00727 len = r-><a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> - (r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>); <span class="comment">/* #partial frame samples at the tail */</span> <a name="l00728"></a>00728 assert((len >= 0) && (len < r->spf)); <a name="l00729"></a>00729 <a name="l00730"></a>00730 <span class="keywordflow">if</span> ((tail < r->adbufsize) && (!r-><a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a>)) { <a name="l00731"></a>00731 <span class="keywordflow">if</span> (r->adfunc) { <a name="l00732"></a>00732 <span class="keywordflow">if</span> ((l = <a name="l00733"></a>00733 (*(r->adfunc)) (r-><a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a>, r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, <a name="l00734"></a>00734 r-><a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> - tail)) < 0) { <a name="l00735"></a>00735 r-><a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> = 1; <a name="l00736"></a>00736 l = 0; <a name="l00737"></a>00737 } <a name="l00738"></a>00738 } <a name="l00739"></a>00739 <span class="keywordflow">else</span> { <a name="l00740"></a>00740 l = r-><a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> - tail; <a name="l00741"></a>00741 <span class="keywordflow">if</span> (l > max) { <a name="l00742"></a>00742 l = max; <a name="l00743"></a>00743 max = 0; <a name="l00744"></a>00744 } <a name="l00745"></a>00745 <span class="keywordflow">else</span> { <a name="l00746"></a>00746 max -= l; <a name="l00747"></a>00747 } <a name="l00748"></a>00748 memcpy(r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, buf, l * <span class="keyword">sizeof</span>(int16)); <a name="l00749"></a>00749 buf += l; <a name="l00750"></a>00750 } <a name="l00751"></a>00751 <span class="keywordflow">if</span> ((l > 0) && r-><a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>) { <a name="l00752"></a>00752 fwrite(r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, <span class="keyword">sizeof</span>(int16), l, r-><a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>); <a name="l00753"></a>00753 fflush(r-><a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>); <a name="l00754"></a>00754 } <a name="l00755"></a>00755 <a name="l00756"></a>00756 tail += l; <a name="l00757"></a>00757 len += l; <a name="l00758"></a>00758 r-><a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> += l; <a name="l00759"></a>00759 } <a name="l00760"></a>00760 <span class="keywordflow">if</span> ((tail >= r-><a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a>) && (!r-><a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a>)) { <a name="l00761"></a>00761 tail -= r-><a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a>; <a name="l00762"></a>00762 <span class="keywordflow">if</span> (tail < head) { <a name="l00763"></a>00763 <span class="keywordflow">if</span> (r->adfunc) { <a name="l00764"></a>00764 <span class="keywordflow">if</span> ((l = <a name="l00765"></a>00765 (*(r->adfunc)) (r-><a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a>, <a name="l00766"></a>00766 r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, head - tail)) < 0) { <a name="l00767"></a>00767 r-><a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> = 1; <a name="l00768"></a>00768 l = 0; <a name="l00769"></a>00769 } <a name="l00770"></a>00770 } <a name="l00771"></a>00771 <span class="keywordflow">else</span> { <a name="l00772"></a>00772 l = head - tail; <a name="l00773"></a>00773 <span class="keywordflow">if</span> (l > max) <a name="l00774"></a>00774 l = max; <a name="l00775"></a>00775 memcpy(r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, buf, l * <span class="keyword">sizeof</span>(int16)); <a name="l00776"></a>00776 } <a name="l00777"></a>00777 <span class="keywordflow">if</span> ((l > 0) && r-><a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>) { <a name="l00778"></a>00778 fwrite(r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, <span class="keyword">sizeof</span>(int16), l, r-><a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>); <a name="l00779"></a>00779 fflush(r-><a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>); <a name="l00780"></a>00780 } <a name="l00781"></a>00781 <a name="l00782"></a>00782 tail += l; <a name="l00783"></a>00783 len += l; <a name="l00784"></a>00784 r-><a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> += l; <a name="l00785"></a>00785 } <a name="l00786"></a>00786 } <a name="l00787"></a>00787 <a name="l00788"></a>00788 <span class="keywordflow">return</span> len; <a name="l00789"></a>00789 } <a name="l00790"></a>00790 <a name="l00791"></a>00791 <span class="comment">/*</span> <a name="l00792"></a>00792 <span class="comment"> * Classify incoming frames as silence or speech.</span> <a name="l00793"></a>00793 <span class="comment"> */</span> <a name="l00794"></a>00794 int32 <a name="l00795"></a>00795 cont_ad_classify(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r, int32 len) <a name="l00796"></a>00796 { <a name="l00797"></a>00797 int32 tailfrm; <a name="l00798"></a>00798 <a name="l00799"></a>00799 tailfrm = (r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> + r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>); <span class="comment">/* Next free frame slot to be filled */</span> <a name="l00800"></a>00800 <span class="keywordflow">if</span> (tailfrm >= CONT_AD_ADFRMSIZE) <a name="l00801"></a>00801 tailfrm -= CONT_AD_ADFRMSIZE; <a name="l00802"></a>00802 <a name="l00803"></a>00803 <span class="keywordflow">for</span> (; len >= r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; len -= r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) { <a name="l00804"></a>00804 compute_frame_pow(r, tailfrm); <a name="l00805"></a>00805 r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>++; <a name="l00806"></a>00806 r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>++; <a name="l00807"></a>00807 <a name="l00808"></a>00808 <span class="comment">/*</span> <a name="l00809"></a>00809 <span class="comment"> * Find speech/sil state change, if any. Also, if staying in speech state</span> <a name="l00810"></a>00810 <span class="comment"> * add this frame to current speech segment.</span> <a name="l00811"></a>00811 <span class="comment"> */</span> <a name="l00812"></a>00812 boundary_detect(r, tailfrm); <a name="l00813"></a>00813 <a name="l00814"></a>00814 <span class="keywordflow">if</span> (++tailfrm >= CONT_AD_ADFRMSIZE) <a name="l00815"></a>00815 tailfrm = 0; <a name="l00816"></a>00816 <a name="l00817"></a>00817 <span class="comment">/* Update thresholds if time to do so */</span> <a name="l00818"></a>00818 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> <= 0) { <a name="l00819"></a>00819 int32 i, f; <a name="l00820"></a>00820 find_thresh(r); <a name="l00821"></a>00821 decay_hist(r); <a name="l00822"></a>00822 r-><a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> = CONT_AD_THRESH_UPDATE; <a name="l00823"></a>00823 <a name="l00824"></a>00824 <span class="preprocessor">#if 1</span> <a name="l00825"></a>00825 <span class="preprocessor"></span> <span class="comment">/*</span> <a name="l00826"></a>00826 <span class="comment"> * Since threshold has been updated, recompute r->n_other.</span> <a name="l00827"></a>00827 <span class="comment"> * (RKM: Is this really necessary? Comment out??)</span> <a name="l00828"></a>00828 <span class="comment"> */</span> <a name="l00829"></a>00829 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0; <a name="l00830"></a>00830 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) { <a name="l00831"></a>00831 <span class="keywordflow">for</span> (i = r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>, f = r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>; i > 0; --i) { <a name="l00832"></a>00832 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] >= r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>) <a name="l00833"></a>00833 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++; <a name="l00834"></a>00834 <a name="l00835"></a>00835 f++; <a name="l00836"></a>00836 <span class="keywordflow">if</span> (f >= CONT_AD_ADFRMSIZE) <a name="l00837"></a>00837 f = 0; <a name="l00838"></a>00838 } <a name="l00839"></a>00839 } <a name="l00840"></a>00840 <span class="keywordflow">else</span> { <a name="l00841"></a>00841 <span class="keywordflow">for</span> (i = r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>, f = r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>; i > 0; --i) { <a name="l00842"></a>00842 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] <= r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>) <a name="l00843"></a>00843 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++; <a name="l00844"></a>00844 <a name="l00845"></a>00845 f++; <a name="l00846"></a>00846 <span class="keywordflow">if</span> (f >= CONT_AD_ADFRMSIZE) <a name="l00847"></a>00847 f = 0; <a name="l00848"></a>00848 } <a name="l00849"></a>00849 } <a name="l00850"></a>00850 <span class="preprocessor">#endif</span> <a name="l00851"></a>00851 <span class="preprocessor"></span> } <a name="l00852"></a>00852 } <a name="l00853"></a>00853 <a name="l00854"></a>00854 <span class="keywordflow">return</span> r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a>; <a name="l00855"></a>00855 } <a name="l00856"></a>00856 <a name="l00857"></a>00857 <span class="comment">/*</span> <a name="l00858"></a>00858 <span class="comment"> * Main function called by the application to filter out silence regions.</span> <a name="l00859"></a>00859 <span class="comment"> * Maintains a linked list of speech segments pointing into r->adbuf and feeds</span> <a name="l00860"></a>00860 <span class="comment"> * data to application from them.</span> <a name="l00861"></a>00861 <span class="comment"> */</span> <a name="l00862"></a>00862 int32 <a name="l00863"></a><a class="code" href="cont__ad_8h.html#ae664132adc514db01a1d5c1209ded4ba">00863</a> <a class="code" href="cont__ad_8h.html#ae664132adc514db01a1d5c1209ded4ba" title="Read raw audio data into the silence filter.">cont_ad_read</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int16 * buf, int32 max) <a name="l00864"></a>00864 { <a name="l00865"></a>00865 int32 flen, len, retval, newstate; <a name="l00866"></a>00866 <a class="code" href="structspseg__t.html" title="(FOR INTERNAL USE ) Data structure for maintaining speech (non-silence) segments not yet consumed by ...">spseg_t</a> *seg; <a name="l00867"></a>00867 <a name="l00868"></a>00868 <span class="keywordflow">if</span> ((r == NULL) || (buf == NULL)) <a name="l00869"></a>00869 <span class="keywordflow">return</span> -1; <a name="l00870"></a>00870 <a name="l00871"></a>00871 <span class="keywordflow">if</span> (max < r->spf) { <a name="l00872"></a>00872 <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a> <a name="l00873"></a>00873 (<span class="stringliteral">"cont_ad_read requires buffer of at least %d samples\n"</span>, <a name="l00874"></a>00874 r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>); <a name="l00875"></a>00875 <span class="keywordflow">return</span> -1; <a name="l00876"></a>00876 } <a name="l00877"></a>00877 <a name="l00878"></a>00878 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>) { <a name="l00879"></a>00879 fprintf(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>, <span class="stringliteral">"cont_ad_read(,, %d)\n"</span>, max); <a name="l00880"></a>00880 fflush(r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>); <a name="l00881"></a>00881 } <a name="l00882"></a>00882 <a name="l00883"></a>00883 <span class="comment">/* Read data from adfunc or from buf. */</span> <a name="l00884"></a>00884 len = cont_ad_read_internal(r, buf, max); <a name="l00885"></a>00885 <a name="l00886"></a>00886 <span class="comment">/* Compute frame power for unprocessed+new data and find speech/silence boundaries */</span> <a name="l00887"></a>00887 cont_ad_classify(r, len); <a name="l00888"></a>00888 <a name="l00889"></a>00889 <span class="comment">/*</span> <a name="l00890"></a>00890 <span class="comment"> * If eof on input data source, cleanup the final segment.</span> <a name="l00891"></a>00891 <span class="comment"> */</span> <a name="l00892"></a>00892 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a>) { <a name="l00893"></a>00893 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SPEECH) { <a name="l00894"></a>00894 <span class="comment">/*</span> <a name="l00895"></a>00895 <span class="comment"> * Still inside a speech segment when input data got over. Absort any</span> <a name="l00896"></a>00896 <span class="comment"> * remaining frames into the final speech segment.</span> <a name="l00897"></a>00897 <span class="comment"> */</span> <a name="l00898"></a>00898 assert(r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> != NULL); <a name="l00899"></a>00899 <a name="l00900"></a>00900 <span class="comment">/* Absorb frames still in analysis window into final speech seg */</span> <a name="l00901"></a>00901 assert((r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> >= 0) <a name="l00902"></a>00902 && (r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> < r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>)); <a name="l00903"></a>00903 r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>->nfrm += r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>; <a name="l00904"></a>00904 <a name="l00905"></a>00905 r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SIL; <a name="l00906"></a>00906 } <a name="l00907"></a>00907 <a name="l00908"></a>00908 r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> += r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>; <a name="l00909"></a>00909 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> >= CONT_AD_ADFRMSIZE) <a name="l00910"></a>00910 r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> -= CONT_AD_ADFRMSIZE; <a name="l00911"></a>00911 r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> = 0; <a name="l00912"></a>00912 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0; <a name="l00913"></a>00913 } <a name="l00914"></a>00914 <a name="l00915"></a>00915 <span class="comment">/*</span> <a name="l00916"></a>00916 <span class="comment"> * At last ready to copy speech data, if any, into caller's buffer. Raw</span> <a name="l00917"></a>00917 <span class="comment"> * speech data is segmented into alternating speech and silence segments.</span> <a name="l00918"></a>00918 <span class="comment"> * But any single call to cont_ad_read will never cross a speech/silence</span> <a name="l00919"></a>00919 <span class="comment"> * boundary.</span> <a name="l00920"></a>00920 <span class="comment"> */</span> <a name="l00921"></a>00921 seg = r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>; <span class="comment">/* first speech segment available, if any */</span> <a name="l00922"></a>00922 <a name="l00923"></a>00923 <span class="keywordflow">if</span> ((seg == NULL) || (r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> != seg->startfrm)) { <a name="l00924"></a>00924 <span class="comment">/*</span> <a name="l00925"></a>00925 <span class="comment"> * Either no speech data available, or inside a silence segment. Find</span> <a name="l00926"></a>00926 <span class="comment"> * length of silence segment.</span> <a name="l00927"></a>00927 <span class="comment"> */</span> <a name="l00928"></a>00928 <span class="keywordflow">if</span> (seg == NULL) { <a name="l00929"></a>00929 assert(r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL); <a name="l00930"></a>00930 <a name="l00931"></a>00931 flen = <a name="l00932"></a>00932 (r-><a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a>) ? r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> : r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> - (r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> + <a name="l00933"></a>00933 r-><a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> - 1); <a name="l00934"></a>00934 <span class="keywordflow">if</span> (flen < 0) <a name="l00935"></a>00935 flen = 0; <a name="l00936"></a>00936 } <a name="l00937"></a>00937 <span class="keywordflow">else</span> { <a name="l00938"></a>00938 flen = seg->startfrm - r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>; <a name="l00939"></a>00939 <span class="keywordflow">if</span> (flen < 0) <a name="l00940"></a>00940 flen += CONT_AD_ADFRMSIZE; <a name="l00941"></a>00941 } <a name="l00942"></a>00942 <a name="l00943"></a>00943 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a7726e8ea1bcca281a39c4b27bbb115e3" title="Pass all input data through, without filtering silence.">rawmode</a>) { <a name="l00944"></a>00944 <span class="comment">/* Restrict silence segment to user buffer size, integral #frames */</span> <a name="l00945"></a>00945 int32 f = max / r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; <a name="l00946"></a>00946 <span class="keywordflow">if</span> (flen > f) <a name="l00947"></a>00947 flen = f; <a name="l00948"></a>00948 } <a name="l00949"></a>00949 <a name="l00950"></a>00950 newstate = CONT_AD_STATE_SIL; <a name="l00951"></a>00951 } <a name="l00952"></a>00952 <span class="keywordflow">else</span> { <a name="l00953"></a>00953 flen = max / r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; <span class="comment">/* truncate read-size to integral #frames */</span> <a name="l00954"></a>00954 <span class="keywordflow">if</span> (flen > seg->nfrm) <a name="l00955"></a>00955 flen = seg->nfrm; <span class="comment">/* truncate further to this segment size */</span> <a name="l00956"></a>00956 <a name="l00957"></a>00957 newstate = CONT_AD_STATE_SPEECH; <a name="l00958"></a>00958 } <a name="l00959"></a>00959 <a name="l00960"></a>00960 len = flen * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; <span class="comment">/* #samples being consumed */</span> <a name="l00961"></a>00961 <a name="l00962"></a>00962 r-><a class="code" href="structcont__ad__t.html#a5524c052dcd0a3d1a1c3b1fc2134b62e" title="Max signal level for the data consumed by the most recent cont_ad_read call (dB range: 0-99)...">siglvl</a> = max_siglvl(r, r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>, flen); <a name="l00963"></a>00963 <a name="l00964"></a>00964 <span class="keywordflow">if</span> ((newstate == CONT_AD_STATE_SIL) && (!r-><a class="code" href="structcont__ad__t.html#a7726e8ea1bcca281a39c4b27bbb115e3" title="Pass all input data through, without filtering silence.">rawmode</a>)) { <a name="l00965"></a>00965 <span class="comment">/* Skip silence data */</span> <a name="l00966"></a>00966 r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> += flen; <a name="l00967"></a>00967 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> >= CONT_AD_ADFRMSIZE) <a name="l00968"></a>00968 r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> -= CONT_AD_ADFRMSIZE; <a name="l00969"></a>00969 <a name="l00970"></a>00970 retval = 0; <span class="comment">/* #samples being copied/returned */</span> <a name="l00971"></a>00971 } <a name="l00972"></a>00972 <span class="keywordflow">else</span> { <a name="l00973"></a>00973 <span class="comment">/* Copy speech/silence(in rawmode) data */</span> <a name="l00974"></a>00974 r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> = buf_copy(r, r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>, flen, buf); <a name="l00975"></a>00975 <a name="l00976"></a>00976 retval = len; <span class="comment">/* #samples being copied/returned */</span> <a name="l00977"></a>00977 } <a name="l00978"></a>00978 <a name="l00979"></a>00979 r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> -= flen; <a name="l00980"></a>00980 r-><a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> -= len; <a name="l00981"></a>00981 assert((r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> >= 0) && (r-><a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> >= 0)); <a name="l00982"></a>00982 assert(r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> <= r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>); <a name="l00983"></a>00983 <a name="l00984"></a>00984 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a5d9420ea711733d1eea9b8f29a638fdb" title="State of data returned by most recent cont_ad_read call; CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">state</a> == newstate) <a name="l00985"></a>00985 r-><a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a> += len; <a name="l00986"></a>00986 <span class="keywordflow">else</span> <a name="l00987"></a>00987 r-><a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a> = len; <a name="l00988"></a>00988 r-><a class="code" href="structcont__ad__t.html#a5d9420ea711733d1eea9b8f29a638fdb" title="State of data returned by most recent cont_ad_read call; CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">state</a> = newstate; <a name="l00989"></a>00989 <a name="l00990"></a>00990 <span class="keywordflow">if</span> (newstate == CONT_AD_STATE_SPEECH) { <a name="l00991"></a>00991 seg->startfrm = r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>; <a name="l00992"></a>00992 assert(seg->startfrm >= 0); <a name="l00993"></a>00993 seg->nfrm -= flen; <a name="l00994"></a>00994 <a name="l00995"></a>00995 <span class="comment">/* Free seg if empty and not recording into it */</span> <a name="l00996"></a>00996 <span class="keywordflow">if</span> ((seg->nfrm == 0) <a name="l00997"></a>00997 && (seg->next || (r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL))) { <a name="l00998"></a>00998 r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> = seg->next; <a name="l00999"></a>00999 <span class="keywordflow">if</span> (seg->next == NULL) <a name="l01000"></a>01000 r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> = NULL; <a name="l01001"></a>01001 free(seg); <a name="l01002"></a>01002 } <a name="l01003"></a>01003 } <a name="l01004"></a>01004 <a name="l01005"></a>01005 <span class="comment">/* Update timestamp. Total raw A/D read - those remaining to be consumed */</span> <a name="l01006"></a>01006 r-><a class="code" href="structcont__ad__t.html#a7b71e87abfcb3ca4ae73af34c86f955e" title="Absolute timestamp (total no.">read_ts</a> = (r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> - r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>) * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; <a name="l01007"></a>01007 <a name="l01008"></a>01008 if (retval == 0) <a name="l01009"></a>01009 retval = (r-><a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> && (r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> == NULL)) ? -1 : 0; <a name="l01010"></a>01010 <a name="l01011"></a>01011 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a>) <a name="l01012"></a>01012 cont_ad_read_log(r, retval); <a name="l01013"></a>01013 <a name="l01014"></a>01014 <span class="keywordflow">return</span> retval; <a name="l01015"></a>01015 } <a name="l01016"></a>01016 <a name="l01017"></a>01017 <a name="l01018"></a>01018 <span class="comment">/*</span> <a name="l01019"></a>01019 <span class="comment"> * Calibrate input channel for silence threshold.</span> <a name="l01020"></a>01020 <span class="comment"> */</span> <a name="l01021"></a>01021 int32 <a name="l01022"></a><a class="code" href="cont__ad_8h.html#a7a1d0eaf8292a4549b00a97163999321">01022</a> <a class="code" href="cont__ad_8h.html#a7a1d0eaf8292a4549b00a97163999321" title="Calibrate the silence filter.">cont_ad_calib</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r) <a name="l01023"></a>01023 { <a name="l01024"></a>01024 int32 i, s, k, len, tailfrm; <a name="l01025"></a>01025 <a name="l01026"></a>01026 <span class="keywordflow">if</span> (r == NULL) <a name="l01027"></a>01027 <span class="keywordflow">return</span> -1; <a name="l01028"></a>01028 <a name="l01029"></a>01029 <span class="comment">/* clear histogram */</span> <a name="l01030"></a>01030 <span class="keywordflow">for</span> (i = 0; i < CONT_AD_POWHISTSIZE; i++) <a name="l01031"></a>01031 r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] = 0; <a name="l01032"></a>01032 tailfrm = r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> + r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>; <a name="l01033"></a>01033 if (tailfrm >= CONT_AD_ADFRMSIZE) <a name="l01034"></a>01034 tailfrm -= CONT_AD_ADFRMSIZE; <a name="l01035"></a>01035 s = (tailfrm * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>); <a name="l01036"></a>01036 <a name="l01037"></a>01037 <span class="keywordflow">for</span> (r-><a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> = 0; <a name="l01038"></a>01038 r-><a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> < CONT_AD_CALIB_FRAMES; <a name="l01039"></a>01039 ++r-><a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a>) { <a name="l01040"></a>01040 len = r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; <a name="l01041"></a>01041 <span class="keywordflow">while</span> (len > 0) { <a name="l01042"></a>01042 <span class="comment">/*Trouble */</span> <a name="l01043"></a>01043 <span class="keywordflow">if</span> ((k = (*(r->adfunc)) (r-><a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a>, r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + s, len)) < 0) <a name="l01044"></a>01044 <span class="keywordflow">return</span> -1; <a name="l01045"></a>01045 len -= k; <a name="l01046"></a>01046 s += k; <a name="l01047"></a>01047 } <a name="l01048"></a>01048 s -= r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; <a name="l01049"></a>01049 <a name="l01050"></a>01050 compute_frame_pow(r, tailfrm); <a name="l01051"></a>01051 } <a name="l01052"></a>01052 <a name="l01053"></a>01053 r-><a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> = CONT_AD_THRESH_UPDATE; <a name="l01054"></a>01054 <span class="keywordflow">return</span> find_thresh(r); <a name="l01055"></a>01055 } <a name="l01056"></a>01056 <a name="l01057"></a>01057 int32 <a name="l01058"></a><a class="code" href="cont__ad_8h.html#a6a86e16fb673748be753e2a281ce837a">01058</a> <a class="code" href="cont__ad_8h.html#a6a86e16fb673748be753e2a281ce837a" title="Get the number of samples required to calibrate the silence filter.">cont_ad_calib_size</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r) <a name="l01059"></a>01059 { <a name="l01060"></a>01060 <span class="keywordflow">return</span> r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a> * CONT_AD_CALIB_FRAMES; <a name="l01061"></a>01061 } <a name="l01062"></a>01062 <a name="l01063"></a>01063 int32 <a name="l01064"></a><a class="code" href="cont__ad_8h.html#a8a575044cf22d96a5ec8fb20410b0065">01064</a> <a class="code" href="cont__ad_8h.html#a8a575044cf22d96a5ec8fb20410b0065" title="Calibrate the silence filter without an audio device.">cont_ad_calib_loop</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int16 * buf, int32 max) <a name="l01065"></a>01065 { <a name="l01066"></a>01066 int32 i, s, len, tailfrm; <a name="l01067"></a>01067 <a name="l01068"></a>01068 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> == CONT_AD_CALIB_FRAMES) { <a name="l01069"></a>01069 <span class="comment">/* If calibration previously succeeded, then this is a</span> <a name="l01070"></a>01070 <span class="comment"> * recalibration, so start again. */</span> <a name="l01071"></a>01071 r-><a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> = 0; <a name="l01072"></a>01072 <span class="comment">/* clear histogram */</span> <a name="l01073"></a>01073 <span class="keywordflow">for</span> (i = 0; i < CONT_AD_POWHISTSIZE; i++) <a name="l01074"></a>01074 r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] = 0; <a name="l01075"></a>01075 } <a name="l01076"></a>01076 <a name="l01077"></a>01077 tailfrm = r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> + r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>; <a name="l01078"></a>01078 <span class="keywordflow">if</span> (tailfrm >= CONT_AD_ADFRMSIZE) <a name="l01079"></a>01079 tailfrm -= CONT_AD_ADFRMSIZE; <a name="l01080"></a>01080 s = (tailfrm * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>); <a name="l01081"></a>01081 <a name="l01082"></a>01082 len = r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; <a name="l01083"></a>01083 <span class="keywordflow">for</span> (; r-><a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> < CONT_AD_CALIB_FRAMES; <a name="l01084"></a>01084 ++r-><a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a>) { <a name="l01085"></a>01085 <span class="keywordflow">if</span> (max < len) <a name="l01086"></a>01086 <span class="keywordflow">return</span> 1; <a name="l01087"></a>01087 memcpy(r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + s, buf, len * <span class="keyword">sizeof</span>(int16)); <a name="l01088"></a>01088 max -= len; <a name="l01089"></a>01089 buf += len; <a name="l01090"></a>01090 compute_frame_pow(r, tailfrm); <a name="l01091"></a>01091 } <a name="l01092"></a>01092 <a name="l01093"></a>01093 r-><a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> = CONT_AD_THRESH_UPDATE; <a name="l01094"></a>01094 <span class="keywordflow">return</span> find_thresh(r); <a name="l01095"></a>01095 } <a name="l01096"></a>01096 <a name="l01097"></a>01097 <a name="l01098"></a>01098 <span class="comment">/* PWP 1/14/98 -- modified for compatibility with old code */</span> <a name="l01099"></a>01099 int32 <a name="l01100"></a><a class="code" href="cont__ad_8h.html#af9a8f9f66bbfd1ce48fe9366fafcc40d">01100</a> <a class="code" href="cont__ad_8h.html#af9a8f9f66bbfd1ce48fe9366fafcc40d" title="Set silence and speech threshold parameters.">cont_ad_set_thresh</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 sil, int32 speech) <a name="l01101"></a>01101 { <a name="l01102"></a>01102 <span class="keywordflow">if</span> (r == NULL) <a name="l01103"></a>01103 <span class="keywordflow">return</span> -1; <a name="l01104"></a>01104 <a name="l01105"></a>01105 <span class="keywordflow">if</span> ((sil < 0) || (speech < 0)) { <a name="l01106"></a>01106 fprintf(stderr, <a name="l01107"></a>01107 <span class="stringliteral">"cont_ad_set_thresh: invalid threshold arguments: %d, %d\n"</span>, <a name="l01108"></a>01108 sil, speech); <a name="l01109"></a>01109 <span class="keywordflow">return</span> -1; <a name="l01110"></a>01110 } <a name="l01111"></a>01111 r-><a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a> = (3 * sil) / 2; <a name="l01112"></a>01112 r-><a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a> = (3 * speech) / 2; <a name="l01113"></a>01113 <a name="l01114"></a>01114 <span class="keywordflow">return</span> 0; <a name="l01115"></a>01115 } <a name="l01116"></a>01116 <a name="l01117"></a>01117 <a name="l01118"></a>01118 <span class="comment">/*</span> <a name="l01119"></a>01119 <span class="comment"> * PWP 1/14/98 -- set the changable params.</span> <a name="l01120"></a>01120 <span class="comment"> *</span> <a name="l01121"></a>01121 <span class="comment"> * delta_sil, delta_speech, min_noise, and max_noise are in dB,</span> <a name="l01122"></a>01122 <span class="comment"> * winsize, speech_onset, sil_onset, leader and trailer are in frames of</span> <a name="l01123"></a>01123 <span class="comment"> * 16 ms length (256 samples @ 16kHz sampling).</span> <a name="l01124"></a>01124 <span class="comment"> */</span> <a name="l01125"></a>01125 int32 <a name="l01126"></a><a class="code" href="cont__ad_8h.html#aa402397c575922ea352afe5e66c02a34">01126</a> <a class="code" href="cont__ad_8h.html#aa402397c575922ea352afe5e66c02a34" title="Set the changable parameters.">cont_ad_set_params</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 delta_sil, <a name="l01127"></a>01127 int32 delta_speech, int32 min_noise, <a name="l01128"></a>01128 int32 max_noise, int32 winsize, <a name="l01129"></a>01129 int32 speech_onset, int32 sil_onset, int32 leader, <a name="l01130"></a>01130 int32 trailer, float32 adapt_rate) <a name="l01131"></a>01131 { <a name="l01132"></a>01132 <span class="keywordflow">if</span> ((delta_sil < 0) || (delta_speech < 0) || (min_noise < 0) <a name="l01133"></a>01133 || (max_noise < 0)) { <a name="l01134"></a>01134 <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a>(<span class="stringliteral">"threshold arguments: "</span> <a name="l01135"></a>01135 <span class="stringliteral">"%d, %d, %d, %d must all be >=0\n"</span>, delta_sil, <a name="l01136"></a>01136 delta_speech, min_noise, max_noise); <a name="l01137"></a>01137 <span class="keywordflow">return</span> -1; <a name="l01138"></a>01138 } <a name="l01139"></a>01139 <a name="l01140"></a>01140 <span class="keywordflow">if</span> ((speech_onset > winsize) || (speech_onset <= 0) <a name="l01141"></a>01141 || (winsize <= 0)) { <a name="l01142"></a>01142 <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a> <a name="l01143"></a>01143 (<span class="stringliteral">"speech_onset, %d, must be <= winsize, %d, and both >0\n"</span>, <a name="l01144"></a>01144 speech_onset, winsize); <a name="l01145"></a>01145 <span class="keywordflow">return</span> -1; <a name="l01146"></a>01146 } <a name="l01147"></a>01147 <a name="l01148"></a>01148 <span class="keywordflow">if</span> ((sil_onset > winsize) || (sil_onset <= 0) || (winsize <= 0)) { <a name="l01149"></a>01149 <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a> <a name="l01150"></a>01150 (<span class="stringliteral">"sil_onset, %d, must be <= winsize, %d, and both >0\n"</span>, <a name="l01151"></a>01151 sil_onset, winsize); <a name="l01152"></a>01152 <span class="keywordflow">return</span> -1; <a name="l01153"></a>01153 } <a name="l01154"></a>01154 <a name="l01155"></a>01155 <span class="keywordflow">if</span> (((leader + trailer) > winsize) || (leader <= 0) <a name="l01156"></a>01156 || (trailer <= 0)) { <a name="l01157"></a>01157 <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a> <a name="l01158"></a>01158 (<span class="stringliteral">"leader, %d, plus trailer, %d, must be <= winsize, %d, and both >0\n"</span>, <a name="l01159"></a>01159 leader, trailer, winsize); <a name="l01160"></a>01160 <span class="keywordflow">return</span> -1; <a name="l01161"></a>01161 } <a name="l01162"></a>01162 <a name="l01163"></a>01163 <span class="keywordflow">if</span> ((adapt_rate < 0.0) || (adapt_rate > 1.0)) { <a name="l01164"></a>01164 <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a>(<span class="stringliteral">"adapt_rate, %e; must be in range 0..1\n"</span>, adapt_rate); <a name="l01165"></a>01165 <span class="keywordflow">return</span> -1; <a name="l01166"></a>01166 } <a name="l01167"></a>01167 <a name="l01168"></a>01168 <span class="keywordflow">if</span> (r == NULL) <a name="l01169"></a>01169 <span class="keywordflow">return</span> -1; <a name="l01170"></a>01170 <a name="l01171"></a>01171 r-><a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a> = delta_sil; <a name="l01172"></a>01172 r-><a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a> = delta_speech; <a name="l01173"></a>01173 r-><a class="code" href="structcont__ad__t.html#ac301114b24356aef2edccba155e3cf33" title="noise lower than this we ignore">min_noise</a> = min_noise; <a name="l01174"></a>01174 r-><a class="code" href="structcont__ad__t.html#af3b50663565964bb18ebb9f9e0002421" title="noise higher than this signals an error">max_noise</a> = max_noise; <a name="l01175"></a>01175 <a name="l01176"></a>01176 r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> = winsize; <a name="l01177"></a>01177 r-><a class="code" href="structcont__ad__t.html#a1b0bb7e53a2bf537ed362badddca341b" title="start speech on &gt;= these many frames out of winsize, of &gt;= delta_speech">speech_onset</a> = speech_onset; <a name="l01178"></a>01178 r-><a class="code" href="structcont__ad__t.html#a9f5e138f4b79b59bf4daa5603d171165" title="end speech on &gt;= these many frames out of winsize, of &lt;= delta_sil">sil_onset</a> = sil_onset; <a name="l01179"></a>01179 r-><a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> = leader; <a name="l01180"></a>01180 r-><a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a> = trailer; <a name="l01181"></a>01181 <a name="l01182"></a>01182 r-><a class="code" href="structcont__ad__t.html#ac22395096037175bf9a0a1f6877e5ec5" title="Linear interpolation constant for rate at which noise level adapted to each estimate; range: 0-1; 0=&...">adapt_rate</a> = adapt_rate; <a name="l01183"></a>01183 <a name="l01184"></a>01184 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> >= r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>) <a name="l01185"></a>01185 r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> = r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> - 1; <a name="l01186"></a>01186 <a name="l01187"></a>01187 <span class="keywordflow">return</span> 0; <a name="l01188"></a>01188 } <a name="l01189"></a>01189 <a name="l01190"></a>01190 <a name="l01191"></a>01191 <span class="comment">/*</span> <a name="l01192"></a>01192 <span class="comment"> * PWP 1/14/98 -- get the changable params.</span> <a name="l01193"></a>01193 <span class="comment"> *</span> <a name="l01194"></a>01194 <span class="comment"> * delta_sil, delta_speech, min_noise, and max_noise are in dB,</span> <a name="l01195"></a>01195 <span class="comment"> * winsize, speech_onset, sil_onset, leader and trailer are in frames of</span> <a name="l01196"></a>01196 <span class="comment"> * 16 ms length (256 samples @ 16kHz sampling).</span> <a name="l01197"></a>01197 <span class="comment"> */</span> <a name="l01198"></a>01198 int32 <a name="l01199"></a><a class="code" href="cont__ad_8h.html#aedd013bc2c6aca14fba02049ed7645d7">01199</a> <a class="code" href="cont__ad_8h.html#aedd013bc2c6aca14fba02049ed7645d7" title="PWP 1/14/98 -- get the changable params.">cont_ad_get_params</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 * delta_sil, <a name="l01200"></a>01200 int32 * delta_speech, int32 * min_noise, <a name="l01201"></a>01201 int32 * max_noise, int32 * winsize, <a name="l01202"></a>01202 int32 * speech_onset, int32 * sil_onset, <a name="l01203"></a>01203 int32 * leader, int32 * trailer, float32 * adapt_rate) <a name="l01204"></a>01204 { <a name="l01205"></a>01205 <span class="keywordflow">if</span> (!delta_sil || !delta_speech || !min_noise || !max_noise <a name="l01206"></a>01206 || !winsize || !speech_onset || !sil_onset || !leader <a name="l01207"></a>01207 || !trailer || !adapt_rate) { <a name="l01208"></a>01208 fprintf(stderr, <span class="stringliteral">"cont_ad_get_params: some param slots are NULL\n"</span>); <a name="l01209"></a>01209 <span class="keywordflow">return</span> (-1); <a name="l01210"></a>01210 } <a name="l01211"></a>01211 <a name="l01212"></a>01212 <span class="keywordflow">if</span> (r == NULL) <a name="l01213"></a>01213 <span class="keywordflow">return</span> -1; <a name="l01214"></a>01214 <a name="l01215"></a>01215 *delta_sil = r-><a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a>; <a name="l01216"></a>01216 *delta_speech = r-><a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a>; <a name="l01217"></a>01217 *min_noise = r-><a class="code" href="structcont__ad__t.html#ac301114b24356aef2edccba155e3cf33" title="noise lower than this we ignore">min_noise</a>; <a name="l01218"></a>01218 *max_noise = r-><a class="code" href="structcont__ad__t.html#af3b50663565964bb18ebb9f9e0002421" title="noise higher than this signals an error">max_noise</a>; <a name="l01219"></a>01219 <a name="l01220"></a>01220 *winsize = r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>; <a name="l01221"></a>01221 *speech_onset = r-><a class="code" href="structcont__ad__t.html#a1b0bb7e53a2bf537ed362badddca341b" title="start speech on &gt;= these many frames out of winsize, of &gt;= delta_speech">speech_onset</a>; <a name="l01222"></a>01222 *sil_onset = r-><a class="code" href="structcont__ad__t.html#a9f5e138f4b79b59bf4daa5603d171165" title="end speech on &gt;= these many frames out of winsize, of &lt;= delta_sil">sil_onset</a>; <a name="l01223"></a>01223 *leader = r-><a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a>; <a name="l01224"></a>01224 *trailer = r-><a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a>; <a name="l01225"></a>01225 <a name="l01226"></a>01226 *adapt_rate = r-><a class="code" href="structcont__ad__t.html#ac22395096037175bf9a0a1f6877e5ec5" title="Linear interpolation constant for rate at which noise level adapted to each estimate; range: 0-1; 0=&...">adapt_rate</a>; <a name="l01227"></a>01227 <a name="l01228"></a>01228 <span class="keywordflow">return</span> 0; <a name="l01229"></a>01229 } <a name="l01230"></a>01230 <a name="l01231"></a>01231 <a name="l01232"></a>01232 <span class="comment">/*</span> <a name="l01233"></a>01233 <span class="comment"> * Reset, discarded any accumulated speech.</span> <a name="l01234"></a>01234 <span class="comment"> */</span> <a name="l01235"></a>01235 int32 <a name="l01236"></a><a class="code" href="cont__ad_8h.html#a12a017ea8a96dc54445e937bb9de24ae">01236</a> <a class="code" href="cont__ad_8h.html#a12a017ea8a96dc54445e937bb9de24ae" title="Reset, discarding any accumulated speech segments.">cont_ad_reset</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r) <a name="l01237"></a>01237 { <a name="l01238"></a>01238 <a class="code" href="structspseg__t.html" title="(FOR INTERNAL USE ) Data structure for maintaining speech (non-silence) segments not yet consumed by ...">spseg_t</a> *seg; <a name="l01239"></a>01239 <a name="l01240"></a>01240 <span class="keywordflow">if</span> (r == NULL) <a name="l01241"></a>01241 <span class="keywordflow">return</span> -1; <a name="l01242"></a>01242 <a name="l01243"></a>01243 <span class="keywordflow">while</span> (r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>) { <a name="l01244"></a>01244 seg = r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>; <a name="l01245"></a>01245 r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> = seg->next; <a name="l01246"></a>01246 free(seg); <a name="l01247"></a>01247 } <a name="l01248"></a>01248 r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> = NULL; <a name="l01249"></a>01249 <a name="l01250"></a>01250 r-><a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> = 0; <a name="l01251"></a>01251 r-><a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> = 0; <a name="l01252"></a>01252 r-><a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> = 0; <a name="l01253"></a>01253 r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> = 0; <a name="l01254"></a>01254 r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> = 0; <a name="l01255"></a>01255 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0; <a name="l01256"></a>01256 <a name="l01257"></a>01257 r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SIL; <a name="l01258"></a>01258 <a name="l01259"></a>01259 <span class="keywordflow">return</span> 0; <a name="l01260"></a>01260 } <a name="l01261"></a>01261 <a name="l01262"></a>01262 <a name="l01263"></a>01263 int32 <a name="l01264"></a><a class="code" href="cont__ad_8h.html#a381c3df971d43a20e8e8b8da43d2872d">01264</a> <a class="code" href="cont__ad_8h.html#a381c3df971d43a20e8e8b8da43d2872d" title="Close the continuous listening object.">cont_ad_close</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * cont) <a name="l01265"></a>01265 { <a name="l01266"></a>01266 <span class="keywordflow">if</span> (cont == NULL) <a name="l01267"></a>01267 <span class="keywordflow">return</span> -1; <a name="l01268"></a>01268 <a name="l01269"></a>01269 <a class="code" href="cont__ad_8h.html#a12a017ea8a96dc54445e937bb9de24ae" title="Reset, discarding any accumulated speech segments.">cont_ad_reset</a>(cont); <span class="comment">/* Frees any remaining speech segments */</span> <a name="l01270"></a>01270 <a name="l01271"></a>01271 free(cont-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a>); <a name="l01272"></a>01272 free(cont-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>); <a name="l01273"></a>01273 free(cont-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>); <a name="l01274"></a>01274 free(cont); <a name="l01275"></a>01275 <a name="l01276"></a>01276 <span class="keywordflow">return</span> 0; <a name="l01277"></a>01277 } <a name="l01278"></a>01278 <a name="l01279"></a>01279 <a name="l01280"></a>01280 int32 <a name="l01281"></a><a class="code" href="cont__ad_8h.html#a8f8284f329d1c0e04856ec9d13020dc4">01281</a> <a class="code" href="cont__ad_8h.html#a8f8284f329d1c0e04856ec9d13020dc4" title="Detach the given continuous listening module from the associated audio device.">cont_ad_detach</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * c) <a name="l01282"></a>01282 { <a name="l01283"></a>01283 <span class="keywordflow">if</span> (c == NULL) <a name="l01284"></a>01284 <span class="keywordflow">return</span> -1; <a name="l01285"></a>01285 <a name="l01286"></a>01286 c-><a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a> = NULL; <a name="l01287"></a>01287 c->adfunc = NULL; <a name="l01288"></a>01288 <span class="keywordflow">return</span> 0; <a name="l01289"></a>01289 } <a name="l01290"></a>01290 <a name="l01291"></a>01291 <a name="l01292"></a>01292 int32 <a name="l01293"></a><a class="code" href="cont__ad_8h.html#a41e7f8c5925dba26dd51e8f7a3d16404">01293</a> <a class="code" href="cont__ad_8h.html#a41e7f8c5925dba26dd51e8f7a3d16404" title="Attach the continuous listening module to the given audio device/function.">cont_ad_attach</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * c, <a class="code" href="structad__rec__t.html">ad_rec_t</a> * a, <a name="l01294"></a>01294 int32(*func) (<a class="code" href="structad__rec__t.html">ad_rec_t</a> *, int16 *, int32)) <a name="l01295"></a>01295 { <a name="l01296"></a>01296 <span class="keywordflow">if</span> (c == NULL) <a name="l01297"></a>01297 <span class="keywordflow">return</span> -1; <a name="l01298"></a>01298 <a name="l01299"></a>01299 c-><a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a> = a; <a name="l01300"></a>01300 c->adfunc = func; <a name="l01301"></a>01301 c-><a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> = 0; <a name="l01302"></a>01302 <a name="l01303"></a>01303 <span class="keywordflow">return</span> 0; <a name="l01304"></a>01304 } <a name="l01305"></a>01305 <a name="l01306"></a>01306 <a name="l01307"></a>01307 int32 <a name="l01308"></a><a class="code" href="cont__ad_8h.html#a382fe6375eae57a532c524d68bc3dd24">01308</a> <a class="code" href="cont__ad_8h.html#a382fe6375eae57a532c524d68bc3dd24" title="Set the silence and speech thresholds.">cont_set_thresh</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 silence, int32 speech) <a name="l01309"></a>01309 { <a name="l01310"></a>01310 int32 i, f; <a name="l01311"></a>01311 <a name="l01312"></a>01312 r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a> = speech; <a name="l01313"></a>01313 r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a> = silence; <a name="l01314"></a>01314 <a name="l01315"></a>01315 <span class="comment">/* Since threshold has been updated, recompute r->n_other */</span> <a name="l01316"></a>01316 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0; <a name="l01317"></a>01317 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) { <a name="l01318"></a>01318 <span class="keywordflow">for</span> (i = r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>, f = r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>; i > 0; --i) { <a name="l01319"></a>01319 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] >= r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>) <a name="l01320"></a>01320 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++; <a name="l01321"></a>01321 <a name="l01322"></a>01322 f++; <a name="l01323"></a>01323 <span class="keywordflow">if</span> (f >= CONT_AD_ADFRMSIZE) <a name="l01324"></a>01324 f = 0; <a name="l01325"></a>01325 } <a name="l01326"></a>01326 } <a name="l01327"></a>01327 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SPEECH) { <a name="l01328"></a>01328 <span class="keywordflow">for</span> (i = r-><a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>, f = r-><a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>; i > 0; --i) { <a name="l01329"></a>01329 <span class="keywordflow">if</span> (r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] <= r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>) <a name="l01330"></a>01330 r-><a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++; <a name="l01331"></a>01331 <a name="l01332"></a>01332 f++; <a name="l01333"></a>01333 <span class="keywordflow">if</span> (f >= CONT_AD_ADFRMSIZE) <a name="l01334"></a>01334 f = 0; <a name="l01335"></a>01335 } <a name="l01336"></a>01336 } <a name="l01337"></a>01337 <a name="l01338"></a>01338 <span class="keywordflow">return</span> 0; <a name="l01339"></a>01339 } <a name="l01340"></a>01340 <a name="l01341"></a>01341 <a name="l01342"></a>01342 <span class="comment">/*</span> <a name="l01343"></a>01343 <span class="comment"> * Set the file pointer for dumping the raw input audio stream.</span> <a name="l01344"></a>01344 <span class="comment"> */</span> <a name="l01345"></a>01345 int32 <a name="l01346"></a><a class="code" href="cont__ad_8h.html#a662ed7c409479060e3b5ac8eb7bd1865">01346</a> <a class="code" href="cont__ad_8h.html#a662ed7c409479060e3b5ac8eb7bd1865" title="Set a file for dumping raw audio input.">cont_ad_set_rawfp</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, FILE * fp) <a name="l01347"></a>01347 { <a name="l01348"></a>01348 <span class="keywordflow">if</span> (r == NULL) <a name="l01349"></a>01349 <span class="keywordflow">return</span> -1; <a name="l01350"></a>01350 <a name="l01351"></a>01351 r-><a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a> = fp; <a name="l01352"></a>01352 <span class="keywordflow">return</span> 0; <a name="l01353"></a>01353 } <a name="l01354"></a>01354 <a name="l01355"></a>01355 <a name="l01356"></a>01356 <span class="comment">/*</span> <a name="l01357"></a>01357 <span class="comment"> * Set the file pointer for logging cont_ad progress.</span> <a name="l01358"></a>01358 <span class="comment"> */</span> <a name="l01359"></a>01359 int32 <a name="l01360"></a><a class="code" href="cont__ad_8h.html#a16c5810eb19ed89522ef4c3394bbfe83">01360</a> <a class="code" href="cont__ad_8h.html#a16c5810eb19ed89522ef4c3394bbfe83" title="Set the file to which cont_ad logs its progress.">cont_ad_set_logfp</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, FILE * fp) <a name="l01361"></a>01361 { <a name="l01362"></a>01362 <span class="keywordflow">if</span> (r == NULL) <a name="l01363"></a>01363 <span class="keywordflow">return</span> -1; <a name="l01364"></a>01364 <a name="l01365"></a>01365 r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a> = fp; <a name="l01366"></a>01366 <span class="keywordflow">return</span> 0; <a name="l01367"></a>01367 } <a name="l01368"></a>01368 <a name="l01369"></a>01369 <a name="l01370"></a>01370 <span class="comment">/*</span> <a name="l01371"></a>01371 <span class="comment"> * One-time initialization.</span> <a name="l01372"></a>01372 <span class="comment"> */</span> <a name="l01373"></a>01373 <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * <a name="l01374"></a>01374 <a class="code" href="cont__ad_8h.html#af28bf56f17d5cfebf4d960ebed44ca64" title="Initialize a continuous listening/silence filtering object.">cont_ad_init</a>(<a class="code" href="structad__rec__t.html">ad_rec_t</a> * a, int32(*func) (<a class="code" href="structad__rec__t.html">ad_rec_t</a> *, int16 *, int32)) <a name="l01375"></a>01375 { <a name="l01376"></a>01376 <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r; <a name="l01377"></a>01377 <a name="l01378"></a>01378 <span class="keywordflow">if</span> ((r = malloc(<span class="keyword">sizeof</span>(*r))) == NULL) { <a name="l01379"></a>01379 <a class="code" href="err_8h.html#a54ffbfe898d74595c586a1f48f32ef03" title="Print error text; Call perror(&quot;&quot;);.">E_ERROR_SYSTEM</a>(<span class="stringliteral">"allocation of cont_ad_t failed"</span>); <a name="l01380"></a>01380 <span class="keywordflow">return</span> NULL; <a name="l01381"></a>01381 } <a name="l01382"></a>01382 <a name="l01383"></a>01383 r-><a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a> = a; <a name="l01384"></a>01384 r->adfunc = func; <a name="l01385"></a>01385 r-><a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> = 0; <a name="l01386"></a>01386 r-><a class="code" href="structcont__ad__t.html#a7726e8ea1bcca281a39c4b27bbb115e3" title="Pass all input data through, without filtering silence.">rawmode</a> = 0; <a name="l01387"></a>01387 <a name="l01388"></a>01388 <span class="keywordflow">if</span> (a != NULL) <a name="l01389"></a>01389 r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a> = a-><a class="code" href="structad__rec__t.html#ac8ccccdc755f68cb4ad24007b36d6c8a" title="Samples/sec.">sps</a>; <a name="l01390"></a>01390 <span class="keywordflow">else</span> <a name="l01391"></a>01391 r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a> = CONT_AD_SPS; <a name="l01392"></a>01392 <a name="l01393"></a>01393 <span class="comment">/* Set samples/frame such that when sps=16000, spf=256 */</span> <a name="l01394"></a>01394 r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a> = (r-><a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&gt;sps to break dependence on ad by N.">sps</a> * 256) / CONT_AD_SPS; <a name="l01395"></a>01395 r-><a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> = CONT_AD_ADFRMSIZE * r-><a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; <a name="l01396"></a>01396 <a name="l01397"></a>01397 <span class="keywordflow">if</span> ((r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> = malloc(r-><a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> * <span class="keyword">sizeof</span>(*r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a>))) == NULL) { <a name="l01398"></a>01398 <a class="code" href="err_8h.html#a54ffbfe898d74595c586a1f48f32ef03" title="Print error text; Call perror(&quot;&quot;);.">E_ERROR_SYSTEM</a>(<span class="stringliteral">"allocation of audio buffer failed"</span>); <a name="l01399"></a>01399 free(r); <a name="l01400"></a>01400 <span class="keywordflow">return</span> NULL; <a name="l01401"></a>01401 } <a name="l01402"></a>01402 <span class="keywordflow">if</span> ((r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a> = <a name="l01403"></a>01403 calloc(CONT_AD_POWHISTSIZE, <span class="keyword">sizeof</span>(*r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>))) == NULL) { <a name="l01404"></a>01404 <a class="code" href="err_8h.html#a54ffbfe898d74595c586a1f48f32ef03" title="Print error text; Call perror(&quot;&quot;);.">E_ERROR_SYSTEM</a>(<span class="stringliteral">"allocation of power history buffer failed"</span>); <a name="l01405"></a>01405 free(r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a>); <a name="l01406"></a>01406 free(r); <a name="l01407"></a>01407 <span class="keywordflow">return</span> NULL; <a name="l01408"></a>01408 } <a name="l01409"></a>01409 <span class="keywordflow">if</span> ((r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a> = <a name="l01410"></a>01410 calloc(CONT_AD_ADFRMSIZE, <span class="keyword">sizeof</span>(*r-><a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>))) == NULL) { <a name="l01411"></a>01411 <a class="code" href="err_8h.html#a54ffbfe898d74595c586a1f48f32ef03" title="Print error text; Call perror(&quot;&quot;);.">E_ERROR_SYSTEM</a>(<span class="stringliteral">"allocation of frame power buffer failed"</span>); <a name="l01412"></a>01412 free(r-><a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>); <a name="l01413"></a>01413 free(r-><a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a>); <a name="l01414"></a>01414 free(r); <a name="l01415"></a>01415 <span class="keywordflow">return</span> NULL; <a name="l01416"></a>01416 } <a name="l01417"></a>01417 <a name="l01418"></a>01418 r-><a class="code" href="structcont__ad__t.html#a5d9420ea711733d1eea9b8f29a638fdb" title="State of data returned by most recent cont_ad_read call; CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">state</a> = CONT_AD_STATE_SIL; <a name="l01419"></a>01419 r-><a class="code" href="structcont__ad__t.html#a7b71e87abfcb3ca4ae73af34c86f955e" title="Absolute timestamp (total no.">read_ts</a> = 0; <a name="l01420"></a>01420 r-><a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a> = 0; <a name="l01421"></a>01421 r-><a class="code" href="structcont__ad__t.html#a5524c052dcd0a3d1a1c3b1fc2134b62e" title="Max signal level for the data consumed by the most recent cont_ad_read call (dB range: 0-99)...">siglvl</a> = 0; <a name="l01422"></a>01422 r-><a class="code" href="structcont__ad__t.html#a54e2013d9634ec473aaf79a606fb2e0f" title="For pre-emphasis filter.">prev_sample</a> = 0; <a name="l01423"></a>01423 r-><a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> = 0; <a name="l01424"></a>01424 r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a> = CONT_AD_DEFAULT_NOISE; <a name="l01425"></a>01425 <a name="l01426"></a>01426 r-><a class="code" href="structcont__ad__t.html#a9e23379bf649ee06ece20133316253e5" title="Do automatic threshold adjustment or not.">auto_thresh</a> = 1; <a name="l01427"></a>01427 r-><a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a> = CONT_AD_DELTA_SIL; <a name="l01428"></a>01428 r-><a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a> = CONT_AD_DELTA_SPEECH; <a name="l01429"></a>01429 r-><a class="code" href="structcont__ad__t.html#ac301114b24356aef2edccba155e3cf33" title="noise lower than this we ignore">min_noise</a> = CONT_AD_MIN_NOISE; <a name="l01430"></a>01430 r-><a class="code" href="structcont__ad__t.html#af3b50663565964bb18ebb9f9e0002421" title="noise higher than this signals an error">max_noise</a> = CONT_AD_MAX_NOISE; <a name="l01431"></a>01431 r-><a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> = CONT_AD_WINSIZE; <a name="l01432"></a>01432 r-><a class="code" href="structcont__ad__t.html#a1b0bb7e53a2bf537ed362badddca341b" title="start speech on &gt;= these many frames out of winsize, of &gt;= delta_speech">speech_onset</a> = CONT_AD_SPEECH_ONSET; <a name="l01433"></a>01433 r-><a class="code" href="structcont__ad__t.html#a9f5e138f4b79b59bf4daa5603d171165" title="end speech on &gt;= these many frames out of winsize, of &lt;= delta_sil">sil_onset</a> = CONT_AD_SIL_ONSET; <a name="l01434"></a>01434 r-><a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> = CONT_AD_LEADER; <a name="l01435"></a>01435 r-><a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a> = CONT_AD_TRAILER; <a name="l01436"></a>01436 <a name="l01437"></a>01437 r-><a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a> = r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a> + r-><a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a>; <a name="l01438"></a>01438 r-><a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a> = r-><a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &quot;current&quot; noise level.">noise_level</a> + r-><a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a>; <a name="l01439"></a>01439 r-><a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> = CONT_AD_THRESH_UPDATE; <a name="l01440"></a>01440 r-><a class="code" href="structcont__ad__t.html#ac22395096037175bf9a0a1f6877e5ec5" title="Linear interpolation constant for rate at which noise level adapted to each estimate; range: 0-1; 0=&...">adapt_rate</a> = CONT_AD_ADAPT_RATE; <a name="l01441"></a>01441 <a name="l01442"></a>01442 r-><a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SIL; <a name="l01443"></a>01443 <a name="l01444"></a>01444 r-><a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> = NULL; <a name="l01445"></a>01445 r-><a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> = NULL; <a name="l01446"></a>01446 <a name="l01447"></a>01447 r-><a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a> = NULL; <a name="l01448"></a>01448 r-><a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&#39;s progress to the file.">logfp</a> = NULL; <a name="l01449"></a>01449 <a name="l01450"></a>01450 r-><a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> = 0; <a name="l01451"></a>01451 <a name="l01452"></a>01452 <a class="code" href="cont__ad_8h.html#a12a017ea8a96dc54445e937bb9de24ae" title="Reset, discarding any accumulated speech segments.">cont_ad_reset</a>(r); <a name="l01453"></a>01453 <a name="l01454"></a>01454 <span class="keywordflow">return</span> r; <a name="l01455"></a>01455 } <a name="l01456"></a>01456 <a name="l01457"></a>01457 <a name="l01458"></a>01458 <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * <a name="l01459"></a>01459 <a class="code" href="cont__ad_8h.html#a1a9bbf961917827f5d03adcd409dda35" title="Initializes a continuous listening object which simply passes data through (!)">cont_ad_init_rawmode</a>(<a class="code" href="structad__rec__t.html">ad_rec_t</a> * a, <a name="l01460"></a>01460 int32(*func) (<a class="code" href="structad__rec__t.html">ad_rec_t</a> *, int16 *, int32)) <a name="l01461"></a>01461 { <a name="l01462"></a>01462 <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r; <a name="l01463"></a>01463 <a name="l01464"></a>01464 r = <a class="code" href="cont__ad_8h.html#af28bf56f17d5cfebf4d960ebed44ca64" title="Initialize a continuous listening/silence filtering object.">cont_ad_init</a>(a, func); <a name="l01465"></a>01465 r-><a class="code" href="structcont__ad__t.html#a7726e8ea1bcca281a39c4b27bbb115e3" title="Pass all input data through, without filtering silence.">rawmode</a> = 1; <a name="l01466"></a>01466 <a name="l01467"></a>01467 <span class="keywordflow">return</span> r; <a name="l01468"></a>01468 } </pre></div></div> </div> <div id="nav-path" class="navpath"> <ul> <li class="navelem"><b>cont_ad_base.c</b> </li> <li class="footer">Generated on Tue Apr 19 2011 for SphinxBase by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </li> </ul> </div> </body> </html>