You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libsdr/filternode_8hh_source.html

415 lines
79 KiB
HTML

<!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"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.9.1"/>
<title>libsdr: /Users/hannes/Uni/Elektronik/sdr/libsdr/src/filternode.hh Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libsdr
&#160;<span id="projectnumber">0.1.0</span>
</div>
<div id="projectbrief">A simple SDR library</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.9.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</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>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.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)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">filternode.hh</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#ifndef __SDR_FILTERNODE_HH__</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="preprocessor">#define __SDR_FILTERNODE_HH__</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;</div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &lt;list&gt;</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#include &quot;config.hh&quot;</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#include &quot;node.hh&quot;</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#include &quot;buffer.hh&quot;</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &quot;buffernode.hh&quot;</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;fftplan.hh&quot;</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacesdr.html">sdr</a> {</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Scalar&gt;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="keyword">inline</span> std::complex&lt;Scalar&gt; sinc_flt_kernel(<span class="keywordtype">int</span> i, <span class="keywordtype">int</span> N, <span class="keywordtype">double</span> Fc, <span class="keywordtype">double</span> bw, <span class="keywordtype">double</span> Fs) {</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; std::complex&lt;Scalar&gt; v;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="comment">// Eval sinc</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keywordflow">if</span> ( (N/2) == i) { v = M_PI*(bw/Fs); }</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; <span class="keywordflow">else</span> { v = std::sin(M_PI*(bw/Fs)*(i-N/2))/(i-N/2); }</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <span class="comment">// shift frequency</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; v *= std::exp(std::complex&lt;Scalar&gt;(0.0, (2*M_PI*Fc*i)/Fs));</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <span class="comment">// Apply window</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; v *= (0.42 - 0.5*cos((2*M_PI*i)/N) + 0.08*cos((4*M_PI*i)/N));</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordflow">return</span> v;</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;}</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Scalar&gt;</div>
<div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_sink.html"> 34</a></span>&#160;<span class="keyword">class </span><a class="code" href="classsdr_1_1_filter_sink.html">FilterSink</a>: <span class="keyword">public</span> <a class="code" href="classsdr_1_1_sink.html">Sink</a>&lt; std::complex&lt;Scalar&gt; &gt;, <span class="keyword">public</span> <a class="code" href="classsdr_1_1_source.html">Source</a></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;{</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="keyword">public</span>:</div>
<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_sink.html#a272a1da79e3dd1d9faad8ab278b7176d"> 38</a></span>&#160; <a class="code" href="classsdr_1_1_filter_sink.html#a272a1da79e3dd1d9faad8ab278b7176d">FilterSink</a>(<span class="keywordtype">size_t</span> block_size)</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; : <a class="code" href="classsdr_1_1_sink.html">Sink</a>&lt; <a class="code" href="namespacestd.html">std</a>::complex&lt;Scalar&gt; &gt;(), <a class="code" href="classsdr_1_1_source.html">Source</a>(), <a class="code" href="classsdr_1_1_filter_sink.html#aa5cc8d6c36634fef76a79440d52260ad">_block_size</a>(block_size),</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <a class="code" href="classsdr_1_1_filter_sink.html#a4b0a1b1eb672a3c7994feeb2c135dfb3">_in_buffer</a>(2*block_size), <a class="code" href="classsdr_1_1_filter_sink.html#ae48100343288c6f7eff25cd1462215ed">_out_buffer</a>(2*block_size),</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <a class="code" href="classsdr_1_1_filter_sink.html#a84f020c44d3affe66382e16df0db3ef8">_plan</a>(<a class="code" href="classsdr_1_1_filter_sink.html#a4b0a1b1eb672a3c7994feeb2c135dfb3">_in_buffer</a>, <a class="code" href="classsdr_1_1_filter_sink.html#ae48100343288c6f7eff25cd1462215ed">_out_buffer</a>, <a class="code" href="classsdr_1_1_f_f_t.html">FFT</a>::FORWARD)</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; {</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="comment">// Fill second half of input buffer with 0s</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i=0; i&lt;2*<a class="code" href="classsdr_1_1_filter_sink.html#aa5cc8d6c36634fef76a79440d52260ad">_block_size</a>; i++) {</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <a class="code" href="classsdr_1_1_filter_sink.html#a4b0a1b1eb672a3c7994feeb2c135dfb3">_in_buffer</a>[i] = 0;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; }</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; }</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;</div>
<div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_sink.html#ac10eeb6b3184cc29bf99c73521bc1398"> 50</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classsdr_1_1_filter_sink.html#ac10eeb6b3184cc29bf99c73521bc1398">~FilterSink</a>() {</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <a class="code" href="classsdr_1_1_filter_sink.html#a4b0a1b1eb672a3c7994feeb2c135dfb3">_in_buffer</a>.<a class="code" href="classsdr_1_1_raw_buffer.html#a8ffd3cbf476c9036bfada9ae8c7c5e05">unref</a>();</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <a class="code" href="classsdr_1_1_filter_sink.html#ae48100343288c6f7eff25cd1462215ed">_out_buffer</a>.<a class="code" href="classsdr_1_1_raw_buffer.html#a8ffd3cbf476c9036bfada9ae8c7c5e05">unref</a>();</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; }</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;</div>
<div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_sink.html#a1331f69c193bfbbf7309347295c5661c"> 56</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_filter_sink.html#a1331f69c193bfbbf7309347295c5661c">config</a>(<span class="keyword">const</span> <a class="code" href="classsdr_1_1_config.html">Config</a> &amp;src_cfg) {</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="comment">// Skip if config is incomplete</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">if</span> ((Config::Type_UNDEFINED==src_cfg.<a class="code" href="classsdr_1_1_config.html#afebc90c2a5f54a8a3ab5b896cfe37724">type</a>()) || (0 == src_cfg.<a class="code" href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sampleRate</a>()) || (0 == src_cfg.<a class="code" href="classsdr_1_1_config.html#a940f217ca5157e1a43c55fec08a22362">bufferSize</a>())) {</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; }</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="comment">// Now check type (must be real double)</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classsdr_1_1_config.html#a71df9feb586e1d33241dec5d6a5beae4">Config::typeId</a>&lt; std::complex&lt;Scalar&gt; &gt;() != src_cfg.<a class="code" href="classsdr_1_1_config.html#afebc90c2a5f54a8a3ab5b896cfe37724">type</a>()) {</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <a class="code" href="classsdr_1_1_config_error.html">ConfigError</a> err;</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; err &lt;&lt; <span class="stringliteral">&quot;Can not configure filter-sink: Invalid type &quot;</span> &lt;&lt; src_cfg.<a class="code" href="classsdr_1_1_config.html#afebc90c2a5f54a8a3ab5b896cfe37724">type</a>()</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, expected &quot;</span> &lt;&lt; Config::typeId&lt; std::complex&lt;Scalar&gt; &gt;();</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">throw</span> err;</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="comment">// Check buffer size</span></div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classsdr_1_1_filter_sink.html#aa5cc8d6c36634fef76a79440d52260ad">_block_size</a> != src_cfg.<a class="code" href="classsdr_1_1_config.html#a940f217ca5157e1a43c55fec08a22362">bufferSize</a>()) {</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <a class="code" href="classsdr_1_1_config_error.html">ConfigError</a> err;</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; err &lt;&lt; <span class="stringliteral">&quot;Can not configure filter-sink: Invalid buffer size &quot;</span> &lt;&lt; src_cfg.<a class="code" href="classsdr_1_1_config.html#a940f217ca5157e1a43c55fec08a22362">bufferSize</a>()</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; &lt;&lt; <span class="stringliteral">&quot;, expected &quot;</span> &lt;&lt; <a class="code" href="classsdr_1_1_filter_sink.html#aa5cc8d6c36634fef76a79440d52260ad">_block_size</a>;</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keywordflow">throw</span> err;</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; }</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="comment">// Propagate configuration</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <a class="code" href="classsdr_1_1_source.html#afd4c7e3fb94a057ac40e9877167791ec">setConfig</a>(<a class="code" href="classsdr_1_1_config.html">Config</a>(<a class="code" href="classsdr_1_1_config.html#a71df9feb586e1d33241dec5d6a5beae4">Config::typeId</a>&lt; std::complex&lt;Scalar&gt; &gt;(), src_cfg.<a class="code" href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sampleRate</a>(),</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; src_cfg.<a class="code" href="classsdr_1_1_config.html#a940f217ca5157e1a43c55fec08a22362">bufferSize</a>(), src_cfg.<a class="code" href="classsdr_1_1_config.html#a023ef493d310cfc8a304c2443c69fc51">numBuffers</a>()));</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; }</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;</div>
<div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_sink.html#aae6050776cbd6cdea85cd1ef368fa634"> 81</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_filter_sink.html#aae6050776cbd6cdea85cd1ef368fa634">process</a>(<span class="keyword">const</span> <a class="code" href="classsdr_1_1_buffer.html">Buffer</a>&lt; std::complex&lt;Scalar&gt; &gt; &amp;buffer, <span class="keywordtype">bool</span> allow_overwrite) {</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="comment">// Copy buffer into 1st half of input buffer</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0; i&lt;<a class="code" href="classsdr_1_1_filter_sink.html#aa5cc8d6c36634fef76a79440d52260ad">_block_size</a>; i++) { <a class="code" href="classsdr_1_1_filter_sink.html#a4b0a1b1eb672a3c7994feeb2c135dfb3">_in_buffer</a>[i] = buffer[i]; }</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="comment">// perform fft</span></div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <a class="code" href="classsdr_1_1_filter_sink.html#a84f020c44d3affe66382e16df0db3ef8">_plan</a>();</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="comment">// send fft result</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; this-&gt;<a class="code" href="classsdr_1_1_source.html#a13921d5daa00574e2057c1ae1fc28054">send</a>(<a class="code" href="classsdr_1_1_filter_sink.html#ae48100343288c6f7eff25cd1462215ed">_out_buffer</a>);</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; }</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="keyword">protected</span>:</div>
<div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_sink.html#aa5cc8d6c36634fef76a79440d52260ad"> 92</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="classsdr_1_1_filter_sink.html#aa5cc8d6c36634fef76a79440d52260ad">_block_size</a>;</div>
<div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_sink.html#a4b0a1b1eb672a3c7994feeb2c135dfb3"> 94</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt; std::complex&lt;Scalar&gt;</a> &gt; <a class="code" href="classsdr_1_1_filter_sink.html#a4b0a1b1eb672a3c7994feeb2c135dfb3">_in_buffer</a>;</div>
<div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_sink.html#ae48100343288c6f7eff25cd1462215ed"> 96</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt; std::complex&lt;Scalar&gt;</a> &gt; <a class="code" href="classsdr_1_1_filter_sink.html#ae48100343288c6f7eff25cd1462215ed">_out_buffer</a>;</div>
<div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_sink.html#a84f020c44d3affe66382e16df0db3ef8"> 98</a></span>&#160; <a class="code" href="classsdr_1_1_f_f_t_plan.html">FFTPlan&lt;Scalar&gt;</a> <a class="code" href="classsdr_1_1_filter_sink.html#a84f020c44d3affe66382e16df0db3ef8">_plan</a>;</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;};</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Scalar&gt;</div>
<div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html"> 105</a></span>&#160;<span class="keyword">class </span><a class="code" href="classsdr_1_1_filter_source.html">FilterSource</a>: <span class="keyword">public</span> <a class="code" href="classsdr_1_1_sink.html">Sink</a>&lt; std::complex&lt;Scalar&gt; &gt;, <span class="keyword">public</span> <a class="code" href="classsdr_1_1_source.html">Source</a></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;{</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;<span class="keyword">public</span>:</div>
<div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#a2221451fde11f6c5cd115f4edefeba51"> 109</a></span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#a2221451fde11f6c5cd115f4edefeba51">FilterSource</a>(<span class="keywordtype">size_t</span> block_size, <span class="keywordtype">double</span> fmin, <span class="keywordtype">double</span> fmax)</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; : <a class="code" href="classsdr_1_1_sink.html">Sink</a>&lt; <a class="code" href="namespacestd.html">std</a>::complex&lt;Scalar&gt; &gt;(), <a class="code" href="classsdr_1_1_source.html">Source</a>(),</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>(block_size), <a class="code" href="classsdr_1_1_filter_source.html#a171e2c01f2259b02be63170e0ea28033">_sample_rate</a>(0),</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#addfd0c3ab6775a252059e7aa1e7b61f7">_in_buffer</a>(2u*<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>), <a class="code" href="classsdr_1_1_filter_source.html#a967b9c6420c17c4a4c216ba7814c8230">_trafo_buffer</a>(2u*<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>), <a class="code" href="classsdr_1_1_filter_source.html#a3f6a037eef3366aaeb887fafd08cb6d8">_last_trafo</a>(<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>),</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74">_kern</a>(2u*<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>), <a class="code" href="classsdr_1_1_filter_source.html#affa0031e5136becba16e7c87ea7b3f3a">_buffers</a>(1, <a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>), <a class="code" href="classsdr_1_1_filter_source.html#afb6a987c3726d7559893e141afd342bc">_fmin</a>(fmin), <a class="code" href="classsdr_1_1_filter_source.html#a918cb8387d026ae922582d3f105cff76">_fmax</a>(fmax),</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#a07e4f06f35b5406f7862d6a8b4bef533">_plan</a>(<a class="code" href="classsdr_1_1_filter_source.html#addfd0c3ab6775a252059e7aa1e7b61f7">_in_buffer</a>, <a class="code" href="classsdr_1_1_filter_source.html#a967b9c6420c17c4a4c216ba7814c8230">_trafo_buffer</a>, <a class="code" href="classsdr_1_1_f_f_t.html">FFT</a>::BACKWARD)</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; {</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="comment">// Set input &amp; output buffer to 0</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0; i&lt;<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>; i++) {</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#a3f6a037eef3366aaeb887fafd08cb6d8">_last_trafo</a>[i] = 0;</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; }</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div>
<div class="line"><a name="l00123"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#ae3e6822f0fa2be09a3361d8eebabacff"> 123</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classsdr_1_1_filter_source.html#ae3e6822f0fa2be09a3361d8eebabacff">~FilterSource</a>() {</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="comment">// pas...</span></div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; }</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;</div>
<div class="line"><a name="l00128"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#aedfc4ad353708e6a096fad3c1fac318c"> 128</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_filter_source.html#aedfc4ad353708e6a096fad3c1fac318c">setFreq</a>(<span class="keywordtype">double</span> fmin, <span class="keywordtype">double</span> fmax) {</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#afb6a987c3726d7559893e141afd342bc">_fmin</a> = fmin; <a class="code" href="classsdr_1_1_filter_source.html#a918cb8387d026ae922582d3f105cff76">_fmax</a> = fmax; <a class="code" href="classsdr_1_1_filter_source.html#a76f7c56b5170b54d691d867197bcd0ca">_updateFilter</a>();</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; }</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;</div>
<div class="line"><a name="l00133"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#aedb6195cdaeadd83f18bd5c699aeb31a"> 133</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_filter_source.html#aedb6195cdaeadd83f18bd5c699aeb31a">config</a>(<span class="keyword">const</span> <a class="code" href="classsdr_1_1_config.html">Config</a> &amp;src_cfg) {</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="comment">// Check config</span></div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">if</span> ((0 == src_cfg.<a class="code" href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sampleRate</a>()) || (0 == src_cfg.<a class="code" href="classsdr_1_1_config.html#a940f217ca5157e1a43c55fec08a22362">bufferSize</a>())) { <span class="keywordflow">return</span>; }</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a> != src_cfg.<a class="code" href="classsdr_1_1_config.html#a940f217ca5157e1a43c55fec08a22362">bufferSize</a>()) {</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <a class="code" href="classsdr_1_1_config_error.html">ConfigError</a> err;</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; err &lt;&lt; <span class="stringliteral">&quot;Can not configure FilterSource, block-size (=&quot;</span> &lt;&lt; <a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; &lt;&lt; <span class="stringliteral">&quot;) != buffer-size (=&quot;</span> &lt;&lt; src_cfg.<a class="code" href="classsdr_1_1_config.html#a940f217ca5157e1a43c55fec08a22362">bufferSize</a>() &lt;&lt; <span class="stringliteral">&quot;)!&quot;</span>;</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordflow">throw</span> err;</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; }</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="comment">// calc filter kernel</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#a171e2c01f2259b02be63170e0ea28033">_sample_rate</a> = src_cfg.<a class="code" href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sampleRate</a>();</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#a76f7c56b5170b54d691d867197bcd0ca">_updateFilter</a>();</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="comment">// Resize buffer-set</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#affa0031e5136becba16e7c87ea7b3f3a">_buffers</a>.<a class="code" href="classsdr_1_1_buffer_set.html#a2b492dc68f98a3b554790b04578a73b1">resize</a>(src_cfg.<a class="code" href="classsdr_1_1_config.html#a023ef493d310cfc8a304c2443c69fc51">numBuffers</a>());</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <a class="code" href="classsdr_1_1_log_message.html">LogMessage</a> msg(LOG_DEBUG);</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordtype">double</span> fmin = std::max(<a class="code" href="classsdr_1_1_filter_source.html#afb6a987c3726d7559893e141afd342bc">_fmin</a>, -src_cfg.<a class="code" href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sampleRate</a>()/2);</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordtype">double</span> fmax = std::min(<a class="code" href="classsdr_1_1_filter_source.html#a918cb8387d026ae922582d3f105cff76">_fmax</a>, src_cfg.<a class="code" href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sampleRate</a>()/2);</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; msg &lt;&lt; <span class="stringliteral">&quot;Configured FFT Filter: &quot;</span> &lt;&lt; std::endl</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; &lt;&lt; <span class="stringliteral">&quot; range: [&quot;</span> &lt;&lt; fmin &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; fmax &lt;&lt; <span class="stringliteral">&quot;]&quot;</span> &lt;&lt; std::endl</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; &lt;&lt; <span class="stringliteral">&quot; fft size: &quot;</span> &lt;&lt; 2*<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a> &lt;&lt; std::endl</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; &lt;&lt; <span class="stringliteral">&quot; Fc/BW: &quot;</span> &lt;&lt; fmin+(fmax-fmin)/2 &lt;&lt; <span class="stringliteral">&quot; / &quot;</span> &lt;&lt; (fmax-fmin) &lt;&lt; std::endl</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; &lt;&lt; <span class="stringliteral">&quot; sample rate: &quot;</span> &lt;&lt; src_cfg.<a class="code" href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sampleRate</a>();</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <a class="code" href="classsdr_1_1_logger.html#a9b12ce53593be134b7d7dea62607d22d">Logger::get</a>().<a class="code" href="classsdr_1_1_logger.html#ab887e598a2c4dc1a3a3f1027d91e0e58">log</a>(msg);</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="comment">// Propergate config</span></div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <a class="code" href="classsdr_1_1_source.html#afd4c7e3fb94a057ac40e9877167791ec">Source::setConfig</a>(<a class="code" href="classsdr_1_1_config.html">Config</a>(<a class="code" href="classsdr_1_1_config.html#a71df9feb586e1d33241dec5d6a5beae4">Config::typeId</a>&lt; std::complex&lt;Scalar&gt; &gt;(), src_cfg.<a class="code" href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sampleRate</a>(),</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>, src_cfg.<a class="code" href="classsdr_1_1_config.html#a023ef493d310cfc8a304c2443c69fc51">numBuffers</a>()));</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; }</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div>
<div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#a4bcb98c6b4146c8558e9de40b84dc318"> 164</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_filter_source.html#a4bcb98c6b4146c8558e9de40b84dc318">process</a>(<span class="keyword">const</span> <a class="code" href="classsdr_1_1_buffer.html">Buffer</a>&lt;std::complex&lt;Scalar&gt; &gt; &amp;buffer, <span class="keywordtype">bool</span> allow_overwrite) {</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="comment">// Multiply with F(_kern)</span></div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0; i&lt;(2*<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>); i++) {</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#addfd0c3ab6775a252059e7aa1e7b61f7">_in_buffer</a>[i] = buffer[i]*<a class="code" href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74">_kern</a>[i];</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; }</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="comment">// perform FFT</span></div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#a07e4f06f35b5406f7862d6a8b4bef533">_plan</a>();</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="comment">// Get a output buffer</span></div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt; std::complex&lt;Scalar&gt;</a> &gt; out = <a class="code" href="classsdr_1_1_filter_source.html#affa0031e5136becba16e7c87ea7b3f3a">_buffers</a>.<a class="code" href="classsdr_1_1_buffer_set.html#aee221d7b71f5f0a5b0b30991c34a362f">getBuffer</a>();</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="comment">// Add first half of trafo buffer to second half of last trafo</span></div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="comment">// and store second half of the current trafo</span></div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0; i&lt;<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>; i++) {</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; out[i] = <a class="code" href="classsdr_1_1_filter_source.html#a3f6a037eef3366aaeb887fafd08cb6d8">_last_trafo</a>[i] + (<a class="code" href="classsdr_1_1_filter_source.html#a967b9c6420c17c4a4c216ba7814c8230">_trafo_buffer</a>[i]/((Scalar)(2*_block_size)));</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#a3f6a037eef3366aaeb887fafd08cb6d8">_last_trafo</a>[i] = (<a class="code" href="classsdr_1_1_filter_source.html#a967b9c6420c17c4a4c216ba7814c8230">_trafo_buffer</a>[i+<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>]/((Scalar)(2*_block_size)));</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; }</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="comment">// Send output</span></div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; this-&gt;<a class="code" href="classsdr_1_1_source.html#a13921d5daa00574e2057c1ae1fc28054">send</a>(out);</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; }</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;<span class="keyword">protected</span>:</div>
<div class="line"><a name="l00186"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#a76f7c56b5170b54d691d867197bcd0ca"> 186</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_filter_source.html#a76f7c56b5170b54d691d867197bcd0ca">_updateFilter</a>() {</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="comment">// Calc filter kernel</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordtype">double</span> Fs = <a class="code" href="classsdr_1_1_filter_source.html#a171e2c01f2259b02be63170e0ea28033">_sample_rate</a>;</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keywordtype">double</span> fmin = std::max(<a class="code" href="classsdr_1_1_filter_source.html#afb6a987c3726d7559893e141afd342bc">_fmin</a>, -Fs/2);</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordtype">double</span> fmax = std::min(<a class="code" href="classsdr_1_1_filter_source.html#a918cb8387d026ae922582d3f105cff76">_fmax</a>, Fs/2);</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordtype">double</span> bw = fmax-fmin;</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keywordtype">double</span> Fc = fmin + bw/2;</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0; i&lt;<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>; i++) {</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="comment">// Eval kernel</span></div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74">_kern</a>[i] = sinc_flt_kernel&lt;Scalar&gt;(i, <a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>, Fc, bw, Fs);</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="comment">// set second half to 0</span></div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74">_kern</a>[i+<a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>] = 0;</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; }</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="comment">// Calculate FFT in-place</span></div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <a class="code" href="classsdr_1_1_f_f_t.html#a8aaadbbb8ce1c61fd90c5b9842753d1c">FFT::exec</a>(<a class="code" href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74">_kern</a>, FFT::FORWARD);</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="comment">// Normalize filter kernel</span></div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <a class="code" href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74">_kern</a> /= <a class="code" href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74">_kern</a>.<a class="code" href="classsdr_1_1_buffer.html#adc13d307ada394c5d72bff1b23c67e45">norm2</a>();</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; }</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;<span class="keyword">protected</span>:</div>
<div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e"> 207</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">_block_size</a>;</div>
<div class="line"><a name="l00209"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#a171e2c01f2259b02be63170e0ea28033"> 209</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="classsdr_1_1_filter_source.html#a171e2c01f2259b02be63170e0ea28033">_sample_rate</a>;</div>
<div class="line"><a name="l00211"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#addfd0c3ab6775a252059e7aa1e7b61f7"> 211</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt; std::complex&lt;Scalar&gt;</a> &gt; <a class="code" href="classsdr_1_1_filter_source.html#addfd0c3ab6775a252059e7aa1e7b61f7">_in_buffer</a>;</div>
<div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#a967b9c6420c17c4a4c216ba7814c8230"> 213</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt; std::complex&lt;Scalar&gt;</a> &gt; <a class="code" href="classsdr_1_1_filter_source.html#a967b9c6420c17c4a4c216ba7814c8230">_trafo_buffer</a>;</div>
<div class="line"><a name="l00215"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#a3f6a037eef3366aaeb887fafd08cb6d8"> 215</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt; std::complex&lt;Scalar&gt;</a> &gt; <a class="code" href="classsdr_1_1_filter_source.html#a3f6a037eef3366aaeb887fafd08cb6d8">_last_trafo</a>;</div>
<div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74"> 217</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt; std::complex&lt;Scalar&gt;</a> &gt; <a class="code" href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74">_kern</a>;</div>
<div class="line"><a name="l00219"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#affa0031e5136becba16e7c87ea7b3f3a"> 219</a></span>&#160; <a class="code" href="classsdr_1_1_buffer_set.html">BufferSet&lt; std::complex&lt;Scalar&gt;</a> &gt;<a class="code" href="classsdr_1_1_filter_source.html#affa0031e5136becba16e7c87ea7b3f3a">_buffers</a>;</div>
<div class="line"><a name="l00221"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#afb6a987c3726d7559893e141afd342bc"> 221</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="classsdr_1_1_filter_source.html#afb6a987c3726d7559893e141afd342bc">_fmin</a>;</div>
<div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#a918cb8387d026ae922582d3f105cff76"> 223</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="classsdr_1_1_filter_source.html#a918cb8387d026ae922582d3f105cff76">_fmax</a>;</div>
<div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_source.html#a07e4f06f35b5406f7862d6a8b4bef533"> 225</a></span>&#160; <a class="code" href="classsdr_1_1_f_f_t_plan.html">FFTPlan&lt;Scalar&gt;</a> <a class="code" href="classsdr_1_1_filter_source.html#a07e4f06f35b5406f7862d6a8b4bef533">_plan</a>;</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;};</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Scalar&gt;</div>
<div class="line"><a name="l00232"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html"> 232</a></span>&#160;<span class="keyword">class </span><a class="code" href="classsdr_1_1_filter_node.html">FilterNode</a></div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;{</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160;<span class="keyword">public</span>:</div>
<div class="line"><a name="l00236"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html#a9ef6fadf38e94d3dac8ed61c170eca78"> 236</a></span>&#160; <a class="code" href="classsdr_1_1_filter_node.html#a9ef6fadf38e94d3dac8ed61c170eca78">FilterNode</a>(<span class="keywordtype">size_t</span> block_size=1024)</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; : <a class="code" href="classsdr_1_1_filter_node.html#ac8394452dd15c25bd497310777c2d8b5">_block_size</a>(block_size), <a class="code" href="classsdr_1_1_filter_node.html#af6632c647ccb2726713df21603e662d9">_buffer</a>(0), <a class="code" href="classsdr_1_1_filter_node.html#a5fa231d790ab7f72e5f8dd13b1e92897">_fft_fwd</a>(0), <a class="code" href="classsdr_1_1_filter_node.html#ab0888f91626b189cf00f9ba01b8e3a3d">_filters</a>()</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; {</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="comment">// Create input buffer node</span></div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <a class="code" href="classsdr_1_1_filter_node.html#af6632c647ccb2726713df21603e662d9">_buffer</a> = <span class="keyword">new</span> <a class="code" href="classsdr_1_1_buffer_node.html">BufferNode&lt; std::complex&lt;Scalar&gt;</a> &gt;(block_size);</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="comment">// Create FFT fwd transform</span></div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <a class="code" href="classsdr_1_1_filter_node.html#a5fa231d790ab7f72e5f8dd13b1e92897">_fft_fwd</a> = <span class="keyword">new</span> <a class="code" href="classsdr_1_1_filter_sink.html">FilterSink&lt;Scalar&gt;</a>(block_size);</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="comment">// Connect buffer source to FFT sink directly</span></div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <a class="code" href="classsdr_1_1_filter_node.html#af6632c647ccb2726713df21603e662d9">_buffer</a>-&gt;<a class="code" href="classsdr_1_1_source.html#ac7df1faefb31e72e135eec3ecf539132">connect</a>(_fft_fwd, <span class="keyword">true</span>);</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; }</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160;</div>
<div class="line"><a name="l00248"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html#a64dc3146d73aceb94bedac25e781b811"> 248</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classsdr_1_1_filter_node.html#a64dc3146d73aceb94bedac25e781b811">~FilterNode</a>() {</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="keyword">delete</span> <a class="code" href="classsdr_1_1_filter_node.html#af6632c647ccb2726713df21603e662d9">_buffer</a>; <span class="keyword">delete</span> <a class="code" href="classsdr_1_1_filter_node.html#a5fa231d790ab7f72e5f8dd13b1e92897">_fft_fwd</a>;</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keyword">typename</span> std::list&lt; FilterSource&lt;Scalar&gt; *&gt;::iterator item=<a class="code" href="classsdr_1_1_filter_node.html#ab0888f91626b189cf00f9ba01b8e3a3d">_filters</a>.begin();</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">for</span> (; item!=<a class="code" href="classsdr_1_1_filter_node.html#ab0888f91626b189cf00f9ba01b8e3a3d">_filters</a>.end(); item++) {</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keyword">delete</span> *item;</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; }</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; }</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;</div>
<div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html#ae5b285b5375ef97eb6a7a3e02943d242"> 257</a></span>&#160; <a class="code" href="classsdr_1_1_sink.html">Sink&lt; std::complex&lt;Scalar&gt;</a> &gt; *<a class="code" href="classsdr_1_1_filter_node.html#ae5b285b5375ef97eb6a7a3e02943d242">sink</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classsdr_1_1_filter_node.html#af6632c647ccb2726713df21603e662d9">_buffer</a>;</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; }</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;</div>
<div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html#af1ff1fbbbb23610f260fa19c2014f4c0"> 262</a></span>&#160; <a class="code" href="classsdr_1_1_filter_source.html">FilterSource&lt;Scalar&gt;</a> *<a class="code" href="classsdr_1_1_filter_node.html#af1ff1fbbbb23610f260fa19c2014f4c0">addFilter</a>(<span class="keywordtype">double</span> fmin, <span class="keywordtype">double</span> fmax) {</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="comment">// Check if fmin &lt; fmax</span></div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="keywordflow">if</span> (fmax &lt; fmin) { std::swap(fmin, fmax); }</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="comment">// Create and store filter instance</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <a class="code" href="classsdr_1_1_filter_node.html#ab0888f91626b189cf00f9ba01b8e3a3d">_filters</a>.push_back(<span class="keyword">new</span> <a class="code" href="classsdr_1_1_filter_source.html">FilterSource&lt;Scalar&gt;</a>(<a class="code" href="classsdr_1_1_filter_node.html#ac8394452dd15c25bd497310777c2d8b5">_block_size</a>, fmin, fmax));</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="comment">// Connect fft_fwd trafo to filter directly</span></div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <a class="code" href="classsdr_1_1_filter_node.html#a5fa231d790ab7f72e5f8dd13b1e92897">_fft_fwd</a>-&gt;connect(<a class="code" href="classsdr_1_1_filter_node.html#ab0888f91626b189cf00f9ba01b8e3a3d">_filters</a>.back(), <span class="keyword">true</span>);</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classsdr_1_1_filter_node.html#ab0888f91626b189cf00f9ba01b8e3a3d">_filters</a>.back();</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; }</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160;<span class="keyword">protected</span>:</div>
<div class="line"><a name="l00274"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html#ac8394452dd15c25bd497310777c2d8b5"> 274</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="classsdr_1_1_filter_node.html#ac8394452dd15c25bd497310777c2d8b5">_block_size</a>;</div>
<div class="line"><a name="l00276"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html#ad2b27f79cb8472e5a1a4f2993d4c1d9e"> 276</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="classsdr_1_1_filter_node.html#ad2b27f79cb8472e5a1a4f2993d4c1d9e">_sample_rate</a>;</div>
<div class="line"><a name="l00278"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html#af6632c647ccb2726713df21603e662d9"> 278</a></span>&#160; <a class="code" href="classsdr_1_1_buffer_node.html">BufferNode&lt; std::complex&lt;Scalar&gt;</a> &gt; *<a class="code" href="classsdr_1_1_filter_node.html#af6632c647ccb2726713df21603e662d9">_buffer</a>;</div>
<div class="line"><a name="l00280"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html#a5fa231d790ab7f72e5f8dd13b1e92897"> 280</a></span>&#160; <a class="code" href="classsdr_1_1_filter_sink.html">FilterSink&lt;Scalar&gt;</a> *<a class="code" href="classsdr_1_1_filter_node.html#a5fa231d790ab7f72e5f8dd13b1e92897">_fft_fwd</a>;</div>
<div class="line"><a name="l00282"></a><span class="lineno"><a class="line" href="classsdr_1_1_filter_node.html#ab0888f91626b189cf00f9ba01b8e3a3d"> 282</a></span>&#160; std::list&lt;FilterSource&lt;Scalar&gt; *&gt; <a class="code" href="classsdr_1_1_filter_node.html#ab0888f91626b189cf00f9ba01b8e3a3d">_filters</a>;</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160;};</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160;</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;}</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160;</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;<span class="preprocessor">#endif // __SDR_FILTERNODE_HH__</span></div>
<div class="ttc" id="classsdr_1_1_filter_node_html_ad2b27f79cb8472e5a1a4f2993d4c1d9e"><div class="ttname"><a href="classsdr_1_1_filter_node.html#ad2b27f79cb8472e5a1a4f2993d4c1d9e">sdr::FilterNode::_sample_rate</a></div><div class="ttdeci">double _sample_rate</div><div class="ttdoc">The current sample rate. </div><div class="ttdef"><b>Definition:</b> filternode.hh:276</div></div>
<div class="ttc" id="classsdr_1_1_config_html"><div class="ttname"><a href="classsdr_1_1_config.html">sdr::Config</a></div><div class="ttdoc">A collection of configuration information that is send by a source to all connected sinks to properga...</div><div class="ttdef"><b>Definition:</b> node.hh:35</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_a07e4f06f35b5406f7862d6a8b4bef533"><div class="ttname"><a href="classsdr_1_1_filter_source.html#a07e4f06f35b5406f7862d6a8b4bef533">sdr::FilterSource::_plan</a></div><div class="ttdeci">FFTPlan&lt; Scalar &gt; _plan</div><div class="ttdoc">The FFT plan for the FFT back-transform. </div><div class="ttdef"><b>Definition:</b> filternode.hh:225</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_a76f7c56b5170b54d691d867197bcd0ca"><div class="ttname"><a href="classsdr_1_1_filter_source.html#a76f7c56b5170b54d691d867197bcd0ca">sdr::FilterSource::_updateFilter</a></div><div class="ttdeci">void _updateFilter()</div><div class="ttdoc">Updates the sink-filter. </div><div class="ttdef"><b>Definition:</b> filternode.hh:186</div></div>
<div class="ttc" id="classsdr_1_1_filter_sink_html_a272a1da79e3dd1d9faad8ab278b7176d"><div class="ttname"><a href="classsdr_1_1_filter_sink.html#a272a1da79e3dd1d9faad8ab278b7176d">sdr::FilterSink::FilterSink</a></div><div class="ttdeci">FilterSink(size_t block_size)</div><div class="ttdoc">Constructor, best performance with block-size being a power of 2. </div><div class="ttdef"><b>Definition:</b> filternode.hh:38</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html"><div class="ttname"><a href="classsdr_1_1_filter_source.html">sdr::FilterSource</a></div><div class="ttdoc">Performs the overlap-add FFT filtering and back-transform. </div><div class="ttdef"><b>Definition:</b> filternode.hh:105</div></div>
<div class="ttc" id="classsdr_1_1_source_html_a13921d5daa00574e2057c1ae1fc28054"><div class="ttname"><a href="classsdr_1_1_source.html#a13921d5daa00574e2057c1ae1fc28054">sdr::Source::send</a></div><div class="ttdeci">virtual void send(const RawBuffer &amp;buffer, bool allow_overwrite=false)</div><div class="ttdoc">Sends the given buffer to all connected sinks. </div><div class="ttdef"><b>Definition:</b> node.cc:67</div></div>
<div class="ttc" id="classsdr_1_1_filter_node_html_ae5b285b5375ef97eb6a7a3e02943d242"><div class="ttname"><a href="classsdr_1_1_filter_node.html#ae5b285b5375ef97eb6a7a3e02943d242">sdr::FilterNode::sink</a></div><div class="ttdeci">Sink&lt; std::complex&lt; Scalar &gt; &gt; * sink() const </div><div class="ttdoc">The filter sink. </div><div class="ttdef"><b>Definition:</b> filternode.hh:257</div></div>
<div class="ttc" id="classsdr_1_1_sink_html"><div class="ttname"><a href="classsdr_1_1_sink.html">sdr::Sink</a></div><div class="ttdoc">Typed sink. </div><div class="ttdef"><b>Definition:</b> node.hh:192</div></div>
<div class="ttc" id="namespacesdr_html"><div class="ttname"><a href="namespacesdr.html">sdr</a></div><div class="ttdef"><b>Definition:</b> autocast.hh:8</div></div>
<div class="ttc" id="classsdr_1_1_config_html_a023ef493d310cfc8a304c2443c69fc51"><div class="ttname"><a href="classsdr_1_1_config.html#a023ef493d310cfc8a304c2443c69fc51">sdr::Config::numBuffers</a></div><div class="ttdeci">size_t numBuffers() const </div><div class="ttdoc">Returns the max. </div><div class="ttdef"><b>Definition:</b> node.hh:89</div></div>
<div class="ttc" id="classsdr_1_1_filter_node_html_ac8394452dd15c25bd497310777c2d8b5"><div class="ttname"><a href="classsdr_1_1_filter_node.html#ac8394452dd15c25bd497310777c2d8b5">sdr::FilterNode::_block_size</a></div><div class="ttdeci">size_t _block_size</div><div class="ttdoc">The block size of the filters. </div><div class="ttdef"><b>Definition:</b> filternode.hh:274</div></div>
<div class="ttc" id="namespacestd_html"><div class="ttname"><a href="namespacestd.html">std</a></div><div class="ttdef"><b>Definition:</b> operators.hh:9</div></div>
<div class="ttc" id="classsdr_1_1_filter_sink_html"><div class="ttname"><a href="classsdr_1_1_filter_sink.html">sdr::FilterSink</a></div><div class="ttdoc">Performs the FFT forward transform. </div><div class="ttdef"><b>Definition:</b> filternode.hh:34</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_aedfc4ad353708e6a096fad3c1fac318c"><div class="ttname"><a href="classsdr_1_1_filter_source.html#aedfc4ad353708e6a096fad3c1fac318c">sdr::FilterSource::setFreq</a></div><div class="ttdeci">void setFreq(double fmin, double fmax)</div><div class="ttdoc">Set the frequency range. </div><div class="ttdef"><b>Definition:</b> filternode.hh:128</div></div>
<div class="ttc" id="classsdr_1_1_source_html"><div class="ttname"><a href="classsdr_1_1_source.html">sdr::Source</a></div><div class="ttdoc">Generic source class. </div><div class="ttdef"><b>Definition:</b> node.hh:213</div></div>
<div class="ttc" id="classsdr_1_1_filter_sink_html_aae6050776cbd6cdea85cd1ef368fa634"><div class="ttname"><a href="classsdr_1_1_filter_sink.html#aae6050776cbd6cdea85cd1ef368fa634">sdr::FilterSink::process</a></div><div class="ttdeci">virtual void process(const Buffer&lt; std::complex&lt; Scalar &gt; &gt; &amp;buffer, bool allow_overwrite)</div><div class="ttdoc">Performs the FFT forward transform. </div><div class="ttdef"><b>Definition:</b> filternode.hh:81</div></div>
<div class="ttc" id="classsdr_1_1_buffer_set_html"><div class="ttname"><a href="classsdr_1_1_buffer_set.html">sdr::BufferSet</a></div><div class="ttdoc">A set of buffers, that tracks their usage. </div><div class="ttdef"><b>Definition:</b> buffer.hh:288</div></div>
<div class="ttc" id="classsdr_1_1_buffer_node_html"><div class="ttname"><a href="classsdr_1_1_buffer_node.html">sdr::BufferNode</a></div><div class="ttdoc">A simple buffering node, that ensures a fixed buffer size. </div><div class="ttdef"><b>Definition:</b> buffernode.hh:18</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_affa0031e5136becba16e7c87ea7b3f3a"><div class="ttname"><a href="classsdr_1_1_filter_source.html#affa0031e5136becba16e7c87ea7b3f3a">sdr::FilterSource::_buffers</a></div><div class="ttdeci">BufferSet&lt; std::complex&lt; Scalar &gt; &gt; _buffers</div><div class="ttdoc">The output buffers. </div><div class="ttdef"><b>Definition:</b> filternode.hh:219</div></div>
<div class="ttc" id="classsdr_1_1_source_html_afd4c7e3fb94a057ac40e9877167791ec"><div class="ttname"><a href="classsdr_1_1_source.html#afd4c7e3fb94a057ac40e9877167791ec">sdr::Source::setConfig</a></div><div class="ttdeci">virtual void setConfig(const Config &amp;config)</div><div class="ttdoc">Stores the configuration and propergates it if the configuration has been changed. </div><div class="ttdef"><b>Definition:</b> node.cc:98</div></div>
<div class="ttc" id="classsdr_1_1_filter_sink_html_ae48100343288c6f7eff25cd1462215ed"><div class="ttname"><a href="classsdr_1_1_filter_sink.html#ae48100343288c6f7eff25cd1462215ed">sdr::FilterSink::_out_buffer</a></div><div class="ttdeci">Buffer&lt; std::complex&lt; Scalar &gt; &gt; _out_buffer</div><div class="ttdoc">The output buffer (transformed). </div><div class="ttdef"><b>Definition:</b> filternode.hh:96</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_a3f6a037eef3366aaeb887fafd08cb6d8"><div class="ttname"><a href="classsdr_1_1_filter_source.html#a3f6a037eef3366aaeb887fafd08cb6d8">sdr::FilterSource::_last_trafo</a></div><div class="ttdeci">Buffer&lt; std::complex&lt; Scalar &gt; &gt; _last_trafo</div><div class="ttdoc">Holds a copy of the second-half of the last output signal. </div><div class="ttdef"><b>Definition:</b> filternode.hh:215</div></div>
<div class="ttc" id="classsdr_1_1_buffer_html_adc13d307ada394c5d72bff1b23c67e45"><div class="ttname"><a href="classsdr_1_1_buffer.html#adc13d307ada394c5d72bff1b23c67e45">sdr::Buffer::norm2</a></div><div class="ttdeci">double norm2() const </div><div class="ttdoc">Returns the norm of the buffer. </div><div class="ttdef"><b>Definition:</b> buffer.hh:182</div></div>
<div class="ttc" id="classsdr_1_1_source_html_ac7df1faefb31e72e135eec3ecf539132"><div class="ttname"><a href="classsdr_1_1_source.html#ac7df1faefb31e72e135eec3ecf539132">sdr::Source::connect</a></div><div class="ttdeci">void connect(SinkBase *sink, bool direct=false)</div><div class="ttdoc">Connect this source to a sink. </div><div class="ttdef"><b>Definition:</b> node.cc:87</div></div>
<div class="ttc" id="classsdr_1_1_filter_sink_html_a84f020c44d3affe66382e16df0db3ef8"><div class="ttname"><a href="classsdr_1_1_filter_sink.html#a84f020c44d3affe66382e16df0db3ef8">sdr::FilterSink::_plan</a></div><div class="ttdeci">FFTPlan&lt; Scalar &gt; _plan</div><div class="ttdoc">The plan for the FFT forward transform. </div><div class="ttdef"><b>Definition:</b> filternode.hh:98</div></div>
<div class="ttc" id="classsdr_1_1_f_f_t_plan_html"><div class="ttname"><a href="classsdr_1_1_f_f_t_plan.html">sdr::FFTPlan</a></div><div class="ttdoc">Trivial FFT implementation for buffer sizes of N=2**K. </div><div class="ttdef"><b>Definition:</b> fftplan.hh:11</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_afb6a987c3726d7559893e141afd342bc"><div class="ttname"><a href="classsdr_1_1_filter_source.html#afb6a987c3726d7559893e141afd342bc">sdr::FilterSource::_fmin</a></div><div class="ttdeci">double _fmin</div><div class="ttdoc">The lower frequency range. </div><div class="ttdef"><b>Definition:</b> filternode.hh:221</div></div>
<div class="ttc" id="classsdr_1_1_filter_node_html_a5fa231d790ab7f72e5f8dd13b1e92897"><div class="ttname"><a href="classsdr_1_1_filter_node.html#a5fa231d790ab7f72e5f8dd13b1e92897">sdr::FilterNode::_fft_fwd</a></div><div class="ttdeci">FilterSink&lt; Scalar &gt; * _fft_fwd</div><div class="ttdoc">The filter sink (forward FFT). </div><div class="ttdef"><b>Definition:</b> filternode.hh:280</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_a4bcb98c6b4146c8558e9de40b84dc318"><div class="ttname"><a href="classsdr_1_1_filter_source.html#a4bcb98c6b4146c8558e9de40b84dc318">sdr::FilterSource::process</a></div><div class="ttdeci">virtual void process(const Buffer&lt; std::complex&lt; Scalar &gt; &gt; &amp;buffer, bool allow_overwrite)</div><div class="ttdoc">Performs the FFT filtering and back-transform. </div><div class="ttdef"><b>Definition:</b> filternode.hh:164</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_ac4f73d688fdd6c2cf787c050d09b1d74"><div class="ttname"><a href="classsdr_1_1_filter_source.html#ac4f73d688fdd6c2cf787c050d09b1d74">sdr::FilterSource::_kern</a></div><div class="ttdeci">Buffer&lt; std::complex&lt; Scalar &gt; &gt; _kern</div><div class="ttdoc">Holds the current filter kernel. </div><div class="ttdef"><b>Definition:</b> filternode.hh:217</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_a171e2c01f2259b02be63170e0ea28033"><div class="ttname"><a href="classsdr_1_1_filter_source.html#a171e2c01f2259b02be63170e0ea28033">sdr::FilterSource::_sample_rate</a></div><div class="ttdeci">double _sample_rate</div><div class="ttdoc">The current sample-rate. </div><div class="ttdef"><b>Definition:</b> filternode.hh:209</div></div>
<div class="ttc" id="classsdr_1_1_logger_html_ab887e598a2c4dc1a3a3f1027d91e0e58"><div class="ttname"><a href="classsdr_1_1_logger.html#ab887e598a2c4dc1a3a3f1027d91e0e58">sdr::Logger::log</a></div><div class="ttdeci">void log(const LogMessage &amp;message)</div><div class="ttdoc">Logs a message. </div><div class="ttdef"><b>Definition:</b> logger.cc:100</div></div>
<div class="ttc" id="classsdr_1_1_filter_sink_html_a1331f69c193bfbbf7309347295c5661c"><div class="ttname"><a href="classsdr_1_1_filter_sink.html#a1331f69c193bfbbf7309347295c5661c">sdr::FilterSink::config</a></div><div class="ttdeci">virtual void config(const Config &amp;src_cfg)</div><div class="ttdoc">Configures the node. </div><div class="ttdef"><b>Definition:</b> filternode.hh:56</div></div>
<div class="ttc" id="classsdr_1_1_config_html_afebc90c2a5f54a8a3ab5b896cfe37724"><div class="ttname"><a href="classsdr_1_1_config.html#afebc90c2a5f54a8a3ab5b896cfe37724">sdr::Config::type</a></div><div class="ttdeci">Type type() const </div><div class="ttdoc">Returns the type. </div><div class="ttdef"><b>Definition:</b> node.hh:71</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_addfd0c3ab6775a252059e7aa1e7b61f7"><div class="ttname"><a href="classsdr_1_1_filter_source.html#addfd0c3ab6775a252059e7aa1e7b61f7">sdr::FilterSource::_in_buffer</a></div><div class="ttdeci">Buffer&lt; std::complex&lt; Scalar &gt; &gt; _in_buffer</div><div class="ttdoc">An input buffer. </div><div class="ttdef"><b>Definition:</b> filternode.hh:211</div></div>
<div class="ttc" id="classsdr_1_1_f_f_t_html_a8aaadbbb8ce1c61fd90c5b9842753d1c"><div class="ttname"><a href="classsdr_1_1_f_f_t.html#a8aaadbbb8ce1c61fd90c5b9842753d1c">sdr::FFT::exec</a></div><div class="ttdeci">static void exec(const Buffer&lt; std::complex&lt; Scalar &gt; &gt; &amp;in, const Buffer&lt; std::complex&lt; Scalar &gt; &gt; &amp;out, FFT::Direction dir)</div><div class="ttdoc">Performs a FFT transform. </div><div class="ttdef"><b>Definition:</b> fftplan.hh:23</div></div>
<div class="ttc" id="classsdr_1_1_config_html_a71df9feb586e1d33241dec5d6a5beae4"><div class="ttname"><a href="classsdr_1_1_config.html#a71df9feb586e1d33241dec5d6a5beae4">sdr::Config::typeId</a></div><div class="ttdeci">static Type typeId()</div><div class="ttdoc">Returns the type-id of the template type. </div></div>
<div class="ttc" id="classsdr_1_1_buffer_set_html_a2b492dc68f98a3b554790b04578a73b1"><div class="ttname"><a href="classsdr_1_1_buffer_set.html#a2b492dc68f98a3b554790b04578a73b1">sdr::BufferSet::resize</a></div><div class="ttdeci">void resize(size_t numBuffers)</div><div class="ttdoc">Resize the buffer set. </div><div class="ttdef"><b>Definition:</b> buffer.hh:332</div></div>
<div class="ttc" id="classsdr_1_1_logger_html_a9b12ce53593be134b7d7dea62607d22d"><div class="ttname"><a href="classsdr_1_1_logger.html#a9b12ce53593be134b7d7dea62607d22d">sdr::Logger::get</a></div><div class="ttdeci">static Logger &amp; get()</div><div class="ttdoc">Returns the singleton instance of the logger. </div><div class="ttdef"><b>Definition:</b> logger.cc:89</div></div>
<div class="ttc" id="classsdr_1_1_filter_node_html_ab0888f91626b189cf00f9ba01b8e3a3d"><div class="ttname"><a href="classsdr_1_1_filter_node.html#ab0888f91626b189cf00f9ba01b8e3a3d">sdr::FilterNode::_filters</a></div><div class="ttdeci">std::list&lt; FilterSource&lt; Scalar &gt; * &gt; _filters</div><div class="ttdoc">The filter bank. </div><div class="ttdef"><b>Definition:</b> filternode.hh:282</div></div>
<div class="ttc" id="classsdr_1_1_filter_sink_html_ac10eeb6b3184cc29bf99c73521bc1398"><div class="ttname"><a href="classsdr_1_1_filter_sink.html#ac10eeb6b3184cc29bf99c73521bc1398">sdr::FilterSink::~FilterSink</a></div><div class="ttdeci">virtual ~FilterSink()</div><div class="ttdoc">Destructor. </div><div class="ttdef"><b>Definition:</b> filternode.hh:50</div></div>
<div class="ttc" id="classsdr_1_1_filter_sink_html_a4b0a1b1eb672a3c7994feeb2c135dfb3"><div class="ttname"><a href="classsdr_1_1_filter_sink.html#a4b0a1b1eb672a3c7994feeb2c135dfb3">sdr::FilterSink::_in_buffer</a></div><div class="ttdeci">Buffer&lt; std::complex&lt; Scalar &gt; &gt; _in_buffer</div><div class="ttdoc">The input buffer. </div><div class="ttdef"><b>Definition:</b> filternode.hh:94</div></div>
<div class="ttc" id="classsdr_1_1_config_error_html"><div class="ttname"><a href="classsdr_1_1_config_error.html">sdr::ConfigError</a></div><div class="ttdoc">The configuration error class. </div><div class="ttdef"><b>Definition:</b> exception.hh:24</div></div>
<div class="ttc" id="classsdr_1_1_log_message_html"><div class="ttname"><a href="classsdr_1_1_log_message.html">sdr::LogMessage</a></div><div class="ttdoc">A log message. </div><div class="ttdef"><b>Definition:</b> logger.hh:22</div></div>
<div class="ttc" id="classsdr_1_1_config_html_a940f217ca5157e1a43c55fec08a22362"><div class="ttname"><a href="classsdr_1_1_config.html#a940f217ca5157e1a43c55fec08a22362">sdr::Config::bufferSize</a></div><div class="ttdeci">size_t bufferSize() const </div><div class="ttdoc">Returns the max. </div><div class="ttdef"><b>Definition:</b> node.hh:83</div></div>
<div class="ttc" id="classsdr_1_1_filter_node_html_af1ff1fbbbb23610f260fa19c2014f4c0"><div class="ttname"><a href="classsdr_1_1_filter_node.html#af1ff1fbbbb23610f260fa19c2014f4c0">sdr::FilterNode::addFilter</a></div><div class="ttdeci">FilterSource&lt; Scalar &gt; * addFilter(double fmin, double fmax)</div><div class="ttdoc">Adds a filter to the filter bank. </div><div class="ttdef"><b>Definition:</b> filternode.hh:262</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_a918cb8387d026ae922582d3f105cff76"><div class="ttname"><a href="classsdr_1_1_filter_source.html#a918cb8387d026ae922582d3f105cff76">sdr::FilterSource::_fmax</a></div><div class="ttdeci">double _fmax</div><div class="ttdoc">The upper frequency range. </div><div class="ttdef"><b>Definition:</b> filternode.hh:223</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_ae3e6822f0fa2be09a3361d8eebabacff"><div class="ttname"><a href="classsdr_1_1_filter_source.html#ae3e6822f0fa2be09a3361d8eebabacff">sdr::FilterSource::~FilterSource</a></div><div class="ttdeci">virtual ~FilterSource()</div><div class="ttdoc">Destructor. </div><div class="ttdef"><b>Definition:</b> filternode.hh:123</div></div>
<div class="ttc" id="classsdr_1_1_filter_node_html_a64dc3146d73aceb94bedac25e781b811"><div class="ttname"><a href="classsdr_1_1_filter_node.html#a64dc3146d73aceb94bedac25e781b811">sdr::FilterNode::~FilterNode</a></div><div class="ttdeci">virtual ~FilterNode()</div><div class="ttdoc">Destructor. </div><div class="ttdef"><b>Definition:</b> filternode.hh:248</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_a2221451fde11f6c5cd115f4edefeba51"><div class="ttname"><a href="classsdr_1_1_filter_source.html#a2221451fde11f6c5cd115f4edefeba51">sdr::FilterSource::FilterSource</a></div><div class="ttdeci">FilterSource(size_t block_size, double fmin, double fmax)</div><div class="ttdoc">Constructor. </div><div class="ttdef"><b>Definition:</b> filternode.hh:109</div></div>
<div class="ttc" id="classsdr_1_1_raw_buffer_html_a8ffd3cbf476c9036bfada9ae8c7c5e05"><div class="ttname"><a href="classsdr_1_1_raw_buffer.html#a8ffd3cbf476c9036bfada9ae8c7c5e05">sdr::RawBuffer::unref</a></div><div class="ttdeci">void unref()</div><div class="ttdoc">Dereferences the buffer. </div><div class="ttdef"><b>Definition:</b> buffer.cc:63</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_a967b9c6420c17c4a4c216ba7814c8230"><div class="ttname"><a href="classsdr_1_1_filter_source.html#a967b9c6420c17c4a4c216ba7814c8230">sdr::FilterSource::_trafo_buffer</a></div><div class="ttdeci">Buffer&lt; std::complex&lt; Scalar &gt; &gt; _trafo_buffer</div><div class="ttdoc">A compute buffer. </div><div class="ttdef"><b>Definition:</b> filternode.hh:213</div></div>
<div class="ttc" id="classsdr_1_1_filter_sink_html_aa5cc8d6c36634fef76a79440d52260ad"><div class="ttname"><a href="classsdr_1_1_filter_sink.html#aa5cc8d6c36634fef76a79440d52260ad">sdr::FilterSink::_block_size</a></div><div class="ttdeci">size_t _block_size</div><div class="ttdoc">The block size. </div><div class="ttdef"><b>Definition:</b> filternode.hh:92</div></div>
<div class="ttc" id="classsdr_1_1_buffer_set_html_aee221d7b71f5f0a5b0b30991c34a362f"><div class="ttname"><a href="classsdr_1_1_buffer_set.html#aee221d7b71f5f0a5b0b30991c34a362f">sdr::BufferSet::getBuffer</a></div><div class="ttdeci">Buffer&lt; Scalar &gt; getBuffer()</div><div class="ttdoc">Obtains a free buffer. </div><div class="ttdef"><b>Definition:</b> buffer.hh:318</div></div>
<div class="ttc" id="classsdr_1_1_f_f_t_html"><div class="ttname"><a href="classsdr_1_1_f_f_t.html">sdr::FFT</a></div><div class="ttdoc">FFT module class, provides static methods to perfrom a FFT directly. </div><div class="ttdef"><b>Definition:</b> fftplan.hh:14</div></div>
<div class="ttc" id="classsdr_1_1_filter_node_html_af6632c647ccb2726713df21603e662d9"><div class="ttname"><a href="classsdr_1_1_filter_node.html#af6632c647ccb2726713df21603e662d9">sdr::FilterNode::_buffer</a></div><div class="ttdeci">BufferNode&lt; std::complex&lt; Scalar &gt; &gt; * _buffer</div><div class="ttdoc">The input buffer (to ensure buffers of _block_size size. </div><div class="ttdef"><b>Definition:</b> filternode.hh:278</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_aedb6195cdaeadd83f18bd5c699aeb31a"><div class="ttname"><a href="classsdr_1_1_filter_source.html#aedb6195cdaeadd83f18bd5c699aeb31a">sdr::FilterSource::config</a></div><div class="ttdeci">virtual void config(const Config &amp;src_cfg)</div><div class="ttdoc">Configures the filter node. </div><div class="ttdef"><b>Definition:</b> filternode.hh:133</div></div>
<div class="ttc" id="classsdr_1_1_buffer_html"><div class="ttname"><a href="classsdr_1_1_buffer.html">sdr::Buffer</a></div><div class="ttdoc">A typed buffer. </div><div class="ttdef"><b>Definition:</b> buffer.hh:111</div></div>
<div class="ttc" id="classsdr_1_1_filter_node_html_a9ef6fadf38e94d3dac8ed61c170eca78"><div class="ttname"><a href="classsdr_1_1_filter_node.html#a9ef6fadf38e94d3dac8ed61c170eca78">sdr::FilterNode::FilterNode</a></div><div class="ttdeci">FilterNode(size_t block_size=1024)</div><div class="ttdoc">Constructor. </div><div class="ttdef"><b>Definition:</b> filternode.hh:236</div></div>
<div class="ttc" id="classsdr_1_1_config_html_a42cfb658302fd7de7729ce2c740e9275"><div class="ttname"><a href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sdr::Config::sampleRate</a></div><div class="ttdeci">double sampleRate() const </div><div class="ttdoc">Returns the sample rate. </div><div class="ttdef"><b>Definition:</b> node.hh:77</div></div>
<div class="ttc" id="classsdr_1_1_filter_node_html"><div class="ttname"><a href="classsdr_1_1_filter_node.html">sdr::FilterNode</a></div><div class="ttdoc">A FFT filter bank node wich consists of several filters. </div><div class="ttdef"><b>Definition:</b> filternode.hh:232</div></div>
<div class="ttc" id="classsdr_1_1_filter_source_html_ab0b14caa4e639acb94d0312f4635059e"><div class="ttname"><a href="classsdr_1_1_filter_source.html#ab0b14caa4e639acb94d0312f4635059e">sdr::FilterSource::_block_size</a></div><div class="ttdeci">size_t _block_size</div><div class="ttdoc">Holds the block size of the filter. </div><div class="ttdef"><b>Definition:</b> filternode.hh:207</div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jun 2 2015 18:28:36 for libsdr by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.9.1
</small></address>
</body>
</html>