1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
<!-- This comment will put IE 6, 7 and 8 in quirks mode -->
<!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>libaudiomask: fastDepukfb.H Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javaScript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body onload='searchBox.OnSelectItem(0);'>
<!-- Generated by Doxygen 1.6.3 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div class="navigation" id="top">
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li><a href="examples.html"><span>Examples</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<img id="MSearchSelect" src="search/search.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</div>
</li>
</ul>
</div>
<div class="tabs">
<ul>
<li><a href="files.html"><span>File List</span></a></li>
</ul>
</div>
<h1>fastDepukfb.H</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#ifndef FASTDEPUKFB_H_</span>
<a name="l00002"></a>00002 <span class="preprocessor"></span><span class="preprocessor">#define FASTDEPUKFB_H_</span>
<a name="l00003"></a>00003 <span class="preprocessor"></span><span class="preprocessor">#include <string.h></span>
<a name="l00004"></a>00004 <span class="preprocessor">#include "depukfb.H"</span>
<a name="l00005"></a>00005
<a name="l00006"></a><a class="code" href="classFastDepUKFB.html">00006</a> <span class="keyword">class </span><a class="code" href="classFastDepUKFB.html">FastDepUKFB</a> : <span class="keyword">public</span> <a class="code" href="classDepUKFB.html">DepUKFB</a> {
<a name="l00007"></a>00007
<a name="l00008"></a>00008 <span class="keywordtype">double</span> n_l[2], d_l[3]; <span class="comment">// Lower filter IIR coeff.</span>
<a name="l00009"></a>00009 <span class="keywordtype">double</span> n_u[2], d_u[3]; <span class="comment">// Upper filter IIR coeff.</span>
<a name="l00010"></a>00010
<a name="l00011"></a>00011 <span class="keywordtype">void</span> findIIRCoeff(<span class="keywordtype">double</span> fc, <span class="keywordtype">double</span> pl, <span class="keywordtype">double</span> pu){
<a name="l00012"></a>00012 <span class="keywordtype">double</span> c1, c2, c3, c4; <span class="comment">// Numerator coefficients</span>
<a name="l00013"></a>00013 <span class="keywordtype">double</span> d1, d2, d3, d4; <span class="comment">// Denominator coefficients</span>
<a name="l00014"></a>00014
<a name="l00015"></a>00015 <span class="comment">// Find the lower filter's IIR coefficients first</span>
<a name="l00016"></a>00016 c1=exp(pl/fc);
<a name="l00017"></a>00017 c2=exp(pl);
<a name="l00018"></a>00018 <span class="comment">//c5=c1*c1;</span>
<a name="l00019"></a>00019 c4=c1*c2;
<a name="l00020"></a>00020 c3=c1*c4;
<a name="l00021"></a>00021 d_l[0]=(c2*fc); <span class="comment">// Do this first so we can divide by it</span>
<a name="l00022"></a>00022 n_l[0]=(fc+fc*pl)/d_l[0]; <span class="comment">// Numerator</span>
<a name="l00023"></a>00023 n_l[1]=(-c1*fc-c1*pl-c1*fc*pl)/d_l[0];
<a name="l00024"></a>00024 d_l[1]=(-2*c4*fc)/d_l[0]; <span class="comment">// Denominator</span>
<a name="l00025"></a>00025 d_l[2]=(c3*fc)/d_l[0];
<a name="l00026"></a>00026 d_l[0]=1.0;
<a name="l00027"></a>00027
<a name="l00028"></a>00028 <span class="comment">// Find the upper filter's IIR coefficients</span>
<a name="l00029"></a>00029 d4=exp(pu/fc);
<a name="l00030"></a>00030 d3=d4*d4;
<a name="l00031"></a>00031 d2=exp(pu+pu/fc);
<a name="l00032"></a>00032 d1=d2*d4;
<a name="l00033"></a>00033
<a name="l00034"></a>00034 d_u[0]=(d3*fc);
<a name="l00035"></a>00035 n_u[0]=(d1*fc-d1*fc*pu)/d_u[0]; <span class="comment">// Numerator</span>
<a name="l00036"></a>00036 n_u[1]=d2*(-fc+pu+pu*fc)/d_u[0];
<a name="l00037"></a>00037 d_u[1]=(-2*d4*fc)/d_u[0]; <span class="comment">// Denominator</span>
<a name="l00038"></a>00038 d_u[2]=(fc)/d_u[0];
<a name="l00039"></a>00039 d_u[0]=1.0;
<a name="l00040"></a>00040 }
<a name="l00041"></a>00041
<a name="l00042"></a>00042 <span class="keywordtype">void</span> filter(<span class="keywordtype">double</span> fc, <span class="keywordtype">double</span> *out){
<a name="l00043"></a>00043 <span class="comment">//Second order impulse response</span>
<a name="l00044"></a>00044
<a name="l00045"></a>00045 <span class="comment">// Reset the state vars and the output</span>
<a name="l00046"></a>00046 <span class="keywordtype">double</span> z1=0.0, z2=0.0;
<a name="l00047"></a>00047 bzero(out, (<span class="keywordtype">int</span>)rint(<a class="code" href="classDepUKFB.html#a13cbfe921394b68c53a17878367566a9" title="The sample frequency.">fs</a>/2.0)*<span class="keyword">sizeof</span>(<span class="keywordtype">double</span>));
<a name="l00048"></a>00048
<a name="l00049"></a>00049 <span class="comment">// Upper filter ...</span>
<a name="l00050"></a>00050 <span class="comment">// First excite with a unit input ....</span>
<a name="l00051"></a>00051 out[0] = n_u[0] - d_u[0]*out[0] + z1;
<a name="l00052"></a>00052 z1 = n_u[1] - d_u[1]*out[0] + z2;
<a name="l00053"></a>00053 z2 = - d_u[2]*out[0];
<a name="l00054"></a>00054
<a name="l00055"></a>00055 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=1;i<(int)rint(<a class="code" href="classDepUKFB.html#a13cbfe921394b68c53a17878367566a9" title="The sample frequency.">fs</a>/2.0);i++){ <span class="comment">// the input now equals zero</span>
<a name="l00056"></a>00056 out[i] = - d_u[0]*out[i] + z1;
<a name="l00057"></a>00057 z1 = - d_u[1]*out[i] + z2;
<a name="l00058"></a>00058 z2 = - d_u[2]*out[i];
<a name="l00059"></a>00059 }
<a name="l00060"></a>00060
<a name="l00061"></a>00061 <span class="comment">// Reset the state vars and the lower output</span>
<a name="l00062"></a>00062 z1=z2=0.0;
<a name="l00063"></a>00063 bzero(out, (<span class="keywordtype">int</span>)rint(fc)*<span class="keyword">sizeof</span>(<span class="keywordtype">double</span>));
<a name="l00064"></a>00064
<a name="l00065"></a>00065 <span class="comment">// Lower filter ...</span>
<a name="l00066"></a>00066 <span class="comment">// First excite with a unit input ....</span>
<a name="l00067"></a>00067 out[0] = n_l[0] - d_l[0]*out[0] + z1;
<a name="l00068"></a>00068 z1 = n_l[1] - d_l[1]*out[0] + z2;
<a name="l00069"></a>00069 z2 = - d_l[2]*out[0];
<a name="l00070"></a>00070
<a name="l00071"></a>00071 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=1;i<(int)rint(fc);i++){ <span class="comment">// the input now equals zero</span>
<a name="l00072"></a>00072 out[i] = - d_l[0]*out[i] + z1;
<a name="l00073"></a>00073 z1 = - d_l[1]*out[i] + z2;
<a name="l00074"></a>00074 z2 = - d_l[2]*out[i];
<a name="l00075"></a>00075 }
<a name="l00076"></a>00076 }
<a name="l00077"></a>00077
<a name="l00078"></a>00078 <span class="keywordtype">void</span> afZ(<span class="keywordtype">double</span> fc, <span class="keywordtype">int</span> whichFilter, <span class="keywordtype">double</span> pl, <span class="keywordtype">double</span> pu){
<a name="l00079"></a>00079 <span class="keywordtype">double</span> *filt=<a class="code" href="classDepUKFB.html#adefe805565fa01861468b5a51ca87a89" title="The filters.">w</a>[whichFilter];
<a name="l00080"></a>00080 findIIRCoeff(fc, pl, pu); <span class="comment">// Find the IIR coefficients to filter with</span>
<a name="l00081"></a>00081 filter(fc, filt); <span class="comment">// Find the lower filter shape</span>
<a name="l00082"></a>00082 }
<a name="l00083"></a>00083
<a name="l00085"></a>00085 <span class="keyword">virtual</span> <span class="keywordtype">void</span> af(<span class="keywordtype">double</span> fc, <span class="keywordtype">int</span> whichFilter){
<a name="l00086"></a>00086 cout<<<span class="stringliteral">"FastDepUKFB::af"</span><<endl;
<a name="l00087"></a>00087
<a name="l00088"></a>00088 <span class="comment">// Produce the filter</span>
<a name="l00089"></a>00089 afZ(fc, whichFilter, <a class="code" href="classDepUKFB.html#add2cdb1268800eade95915f209e09166">p_l</a>(fc), <a class="code" href="classDepUKFB.html#ac9c9ed1ccc3a941359ff1d5d8c243c65">p_u</a>(fc));
<a name="l00090"></a>00090 }
<a name="l00091"></a>00091
<a name="l00092"></a>00092 <span class="keyword">public</span>:
<a name="l00093"></a>00093 <a class="code" href="classFastDepUKFB.html">FastDepUKFB</a>(<span class="keywordtype">int</span> sampleFreq, <span class="keywordtype">int</span> fCnt=50) {
<a name="l00094"></a>00094 <a class="code" href="classDepUKFB.html#ae39f616845a715311d9c2666bb5b086c">init</a>(sampleFreq, fCnt);
<a name="l00095"></a>00095 }
<a name="l00096"></a>00096 };
<a name="l00097"></a>00097
<a name="l00098"></a>00098 <span class="preprocessor">#endif //FASTDEPUKFB_H_</span>
</pre></div></div>
<!--- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Jun 19 15:23:29 2010 for libaudiomask by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
</body>
</html>
|