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/psk31_8hh_source.html

428 lines
83 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/psk31.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">psk31.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_PSK31_HH__</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="preprocessor">#define __SDR_PSK31_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 &quot;node.hh&quot;</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &quot;traits.hh&quot;</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#include &quot;interpolate.hh&quot;</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacesdr.html">sdr</a> {</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">class</span> Scalar&gt;</div>
<div class="line"><a name="l00017"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html"> 17</a></span>&#160;<span class="keyword">class </span><a class="code" href="classsdr_1_1_b_p_s_k31.html">BPSK31</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="l00018"></a><span class="lineno"> 18</span>&#160;{</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="keyword">public</span>:</div>
<div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a7862edf6d977ae6943047bd5c46036ec"> 35</a></span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a7862edf6d977ae6943047bd5c46036ec">BPSK31</a>(<span class="keywordtype">double</span> dF=0.1)</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</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="l00037"></a><span class="lineno"> 37</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a>(0), <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4e13fe56c1136046637e1ece07f35f89">_F</a>(0), <a class="code" href="classsdr_1_1_b_p_s_k31.html#a3cbb35d4aee991bf3be8137f2218f0dd">_Fmin</a>(-dF), <a class="code" href="classsdr_1_1_b_p_s_k31.html#a106fd36dcef5ebb97c70b2e7145a2f73">_Fmax</a>(dF)</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; {</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="comment">// Assemble carrier PLL gains:</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keywordtype">double</span> damping = std::sqrt(2)/2;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordtype">double</span> bw = M_PI/100;</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keywordtype">double</span> tmp = 1. + 2*damping*bw + bw*bw;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5840fa06ad5ab371d8cb720ebef3d283">_alpha</a> = 4*damping*bw/tmp;</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a0688ca26994611e997248184f585ac70">_beta</a> = 4*bw*bw/tmp;</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="comment">// Init delay line for the interpolating sub-sampler</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a99f0eb17cf4fedd7be540c213e3867aa">_dl</a> = <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt; std::complex&lt;float&gt;</a> &gt;(2*8); <a class="code" href="classsdr_1_1_b_p_s_k31.html#ac66bb680fd30fd4f135702605ae89757">_dl_idx</a> = 0;</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0; i&lt;16; i++) { <a class="code" href="classsdr_1_1_b_p_s_k31.html#a99f0eb17cf4fedd7be540c213e3867aa">_dl</a>[i] = 0; }</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4c54a851adee3e49f8d1bf377f78c220">_mu</a> = 0.25; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a40a278099c4100e6d04053f97fe310d8">_gain_mu</a> = 0.01;</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="comment">// constant phase shift of the signal</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#abba53fd1265a1e8d1286ea0fb45d2e94">_theta</a> = 0;</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; <span class="comment">// Phase detection:</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">_omega</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#aae86fc72e6e69cd5f3ec383c1c58dd36">_min_omega</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#aca8de3ffeaec1ef562d26b55447cc37c">_max_omega</a> = 0;</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a694edbdce37208b475d545c5be610161">_omega_rel</a> = 0.001; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a7365c27f5eb587af4a9a97731d2fdff8">_gain_omega</a> = 0.001;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a36a15215bd1ca9ff77ed24007026897c">_p_0T</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#a9176a05d6e8f1cd3f566df0e8710d0a3">_p_1T</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#aaff3323641cbe2ec6f6c821fc688df4d">_p_2T</a> = 0;</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4071742bae6cc43656d05dc375e309fc">_c_0T</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#a16efac49cb378741c6c9162012029355">_c_1T</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#a0b548185b5057602c3dbe975fbf7dc89">_c_2T</a> = 0;</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">// Super-sample (64 phase samples per symbol)</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a271efce529e564fe4255862f41137662">_superSample</a> = 64;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; }</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;</div>
<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a5f194008dae3fb4b4f004f77e03786dc"> 65</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5f194008dae3fb4b4f004f77e03786dc">~BPSK31</a>() {</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="comment">// unreference buffers</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a99f0eb17cf4fedd7be540c213e3867aa">_dl</a>.<a class="code" href="classsdr_1_1_raw_buffer.html#a8ffd3cbf476c9036bfada9ae8c7c5e05">unref</a>();</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">_hist</a>.<a class="code" href="classsdr_1_1_raw_buffer.html#a8ffd3cbf476c9036bfada9ae8c7c5e05">unref</a>();</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a612d180c1f6d289dd2f5a21fb15566d1">_buffer</a>.<a class="code" href="classsdr_1_1_raw_buffer.html#a8ffd3cbf476c9036bfada9ae8c7c5e05">unref</a>();</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; }</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;</div>
<div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a36da3163abca21c2dcd042139de0a36e"> 72</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a36da3163abca21c2dcd042139de0a36e">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="l00073"></a><span class="lineno"> 73</span>&#160; {</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">// Requires type, sample rate &amp; buffer size</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">if</span> (!src_cfg.<a class="code" href="classsdr_1_1_config.html#a7cdfc69aa8e3ab975db7251747343a20">hasType</a>() || !src_cfg.<a class="code" href="classsdr_1_1_config.html#a5df3f75dcd6e678bd5f029a7400b404e">hasSampleRate</a>() || !src_cfg.<a class="code" href="classsdr_1_1_config.html#a485e488e1411e52c722b22d1807be406">hasBufferSize</a>()) { <span class="keywordflow">return</span>; }</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="comment">// Check buffer type</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</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="l00079"></a><span class="lineno"> 79</span>&#160; <a class="code" href="classsdr_1_1_config_error.html">ConfigError</a> err;</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; err &lt;&lt; <span class="stringliteral">&quot;Can not configure BPSK31: 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="l00081"></a><span class="lineno"> 81</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="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">throw</span> err;</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="comment">// Check input sample rate</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordtype">double</span> Fs = src_cfg.<a class="code" href="classsdr_1_1_config.html#a42cfb658302fd7de7729ce2c740e9275">sampleRate</a>();</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keywordflow">if</span> (2000 &gt; Fs) {</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="classsdr_1_1_config_error.html">ConfigError</a> err;</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; err &lt;&lt; <span class="stringliteral">&quot;Can not configure BPSK31: Input sample rate too low! The BPSK31 node requires at &quot;</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; &lt;&lt; <span class="stringliteral">&quot;least a sample rate of 2000Hz, got &quot;</span> &lt;&lt; Fs &lt;&lt; <span class="stringliteral">&quot;Hz&quot;</span>;</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordflow">throw</span> err;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; }</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="comment">// Compute samples per symbol</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">_omega</a> = Fs/(<a class="code" href="classsdr_1_1_b_p_s_k31.html#a271efce529e564fe4255862f41137662">_superSample</a>*31.25);</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="comment">// Obtain limits for the sub-sample rate</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#aae86fc72e6e69cd5f3ec383c1c58dd36">_min_omega</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">_omega</a>*(1.0 - <a class="code" href="classsdr_1_1_b_p_s_k31.html#a694edbdce37208b475d545c5be610161">_omega_rel</a>);</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#aca8de3ffeaec1ef562d26b55447cc37c">_max_omega</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">_omega</a>*(1.0 + <a class="code" href="classsdr_1_1_b_p_s_k31.html#a694edbdce37208b475d545c5be610161">_omega_rel</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; <span class="comment">// Decoding history, contains up to 64 phases (if in sync)</span></div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">_hist</a> = <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt;float&gt;</a>(<a class="code" href="classsdr_1_1_b_p_s_k31.html#a271efce529e564fe4255862f41137662">_superSample</a>);</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a> = 0;</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#adaba010c7d0c74e28c719054d0c0f44f">_last_constellation</a> = 1;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="comment">// Output buffer</span></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordtype">size_t</span> bsize = 1 + int(Fs/31.25);</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a612d180c1f6d289dd2f5a21fb15566d1">_buffer</a> = <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt;uint8_t&gt;</a>(bsize);</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">// This node sends a bit-stream with 31.25 baud.</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; this-&gt;<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_traits.html">Traits&lt;uint8_t&gt;::scalarId</a>, 31.25, src_cfg.<a class="code" href="classsdr_1_1_config.html#a940f217ca5157e1a43c55fec08a22362">bufferSize</a>(), 1));</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; }</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div>
<div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#aab706f8a7b70b479213b7bbf9015643d"> 114</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#aab706f8a7b70b479213b7bbf9015643d">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="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordtype">size_t</span> i=0, o=0;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">while</span> (i&lt;buffer.size()) {</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="comment">// First, fill sampler...</span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordflow">while</span> ( (<a class="code" href="classsdr_1_1_b_p_s_k31.html#a4c54a851adee3e49f8d1bf377f78c220">_mu</a> &gt; 1) &amp;&amp; (i&lt;buffer.size()) ) {</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#af7ecee919d13d75c65be3541244aa124">_updateSampler</a>(buffer[i]); i++;</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; <span class="comment">// Then, ...</span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">if</span> (i&lt;buffer.size()) {</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="comment">// Subsample</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; std::complex&lt;float&gt; sample = interpolate(<a class="code" href="classsdr_1_1_b_p_s_k31.html#a99f0eb17cf4fedd7be540c213e3867aa">_dl</a>.<a class="code" href="classsdr_1_1_buffer.html#a8d8e0ca5402163ed7b9cd486c5236336">sub</a>(<a class="code" href="classsdr_1_1_b_p_s_k31.html#ac66bb680fd30fd4f135702605ae89757">_dl_idx</a>, 8), <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4c54a851adee3e49f8d1bf377f78c220">_mu</a>);</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="comment">// Update error tracking</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a89cddd31ec12ed1a731af8016ca2a54e">_errorTracking</a>(sample);</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="comment">// Update carrier PLL</span></div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a778802b1b78667db77a5b95f934d4cd2">_updatePLL</a>(sample);</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="comment">// done. real(sample) constains phase of symbol</span></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; <span class="comment">// Now fill history with phase constellation and try to decode a bit</span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">_hist</a>[<a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>] = std::real(sample);</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="comment">// Check if there is a constellation transition at the current time</span></div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keywordflow">if</span> ((<a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>&gt;1) &amp;&amp; (<a class="code" href="classsdr_1_1_b_p_s_k31.html#a19a7364e76d267ff1e6868f41ee3bbf2">_hasTransition</a>())) {</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>&lt;(<a class="code" href="classsdr_1_1_b_p_s_k31.html#a271efce529e564fe4255862f41137662">_superSample</a>/2)) {</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="comment">// If less than superSample values in hist -&gt; drop</span></div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a> = 0;</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="comment">// Otherwise decode</span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordtype">int</span> cconst = <a class="code" href="classsdr_1_1_b_p_s_k31.html#af151da88f45eb7c637a6e28006c88247">_currentContellation</a>();</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a612d180c1f6d289dd2f5a21fb15566d1">_buffer</a>[o++] = (<a class="code" href="classsdr_1_1_b_p_s_k31.html#adaba010c7d0c74e28c719054d0c0f44f">_last_constellation</a> == cconst);</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#adaba010c7d0c74e28c719054d0c0f44f">_last_constellation</a> = cconst;</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a> = 0;</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; }</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a> == (<a class="code" href="classsdr_1_1_b_p_s_k31.html#a271efce529e564fe4255862f41137662">_superSample</a>-1)) {</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="comment">// If the symbol is complete:</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordtype">int</span> cconst = <a class="code" href="classsdr_1_1_b_p_s_k31.html#af151da88f45eb7c637a6e28006c88247">_currentContellation</a>();</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a612d180c1f6d289dd2f5a21fb15566d1">_buffer</a>[o++] = (<a class="code" href="classsdr_1_1_b_p_s_k31.html#adaba010c7d0c74e28c719054d0c0f44f">_last_constellation</a> == cconst);</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#adaba010c7d0c74e28c719054d0c0f44f">_last_constellation</a> = cconst;</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a> = 0;</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="comment">// Next sample</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>++;</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; }</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; }</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; }</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="comment">// If at least 1 bit was decoded -&gt; send result</span></div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordflow">if</span> (o&gt;0) { this-&gt;<a class="code" href="classsdr_1_1_source.html#a13921d5daa00574e2057c1ae1fc28054">send</a>(<a class="code" href="classsdr_1_1_b_p_s_k31.html#a612d180c1f6d289dd2f5a21fb15566d1">_buffer</a>.<a class="code" href="classsdr_1_1_buffer.html#a3eca322ed118a7b5c4cc62b25ce5d119">head</a>(o)); }</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; }</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;</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;<span class="keyword">protected</span>:</div>
<div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a19a7364e76d267ff1e6868f41ee3bbf2"> 164</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a19a7364e76d267ff1e6868f41ee3bbf2">_hasTransition</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">return</span> ((<a class="code" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">_hist</a>[<a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>-1]&gt;=0) &amp;&amp; (<a class="code" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">_hist</a>[<a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>]&lt;=0)) ||</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; ((<a class="code" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">_hist</a>[<a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>-1]&lt;=0) &amp;&amp; (<a class="code" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">_hist</a>[<a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>]&gt;=0));</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; }</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;</div>
<div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#af151da88f45eb7c637a6e28006c88247"> 170</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#af151da88f45eb7c637a6e28006c88247">_currentContellation</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keywordtype">float</span> value = 0;</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0; i&lt;=<a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>; i++) { value += <a class="code" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">_hist</a>[i]; }</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keywordflow">return</span> (value &gt; 0) ? 1 : -1;</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; }</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;</div>
<div class="line"><a name="l00177"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#ac630b11ea9bced1aa085bbb5523d064f"> 177</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#ac630b11ea9bced1aa085bbb5523d064f">_phaseError</a>(<span class="keyword">const</span> std::complex&lt;float&gt; &amp;value)<span class="keyword"> const </span>{</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordtype">float</span> r2 = value.real()*value.real();</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keywordtype">float</span> i2 = value.imag()*value.imag();</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordtype">float</span> nrm2 = r2+i2;</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="keywordflow">if</span> (0 == nrm2) { <span class="keywordflow">return</span> 0; }</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">return</span> -value.real()*value.imag()/nrm2;</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;</div>
<div class="line"><a name="l00186"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a778802b1b78667db77a5b95f934d4cd2"> 186</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a778802b1b78667db77a5b95f934d4cd2">_updatePLL</a>(<span class="keyword">const</span> std::complex&lt;float&gt; &amp;sample) {</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordtype">float</span> phi = <a class="code" href="classsdr_1_1_b_p_s_k31.html#ac630b11ea9bced1aa085bbb5523d064f">_phaseError</a>(sample);</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4e13fe56c1136046637e1ece07f35f89">_F</a> += <a class="code" href="classsdr_1_1_b_p_s_k31.html#a0688ca26994611e997248184f585ac70">_beta</a>*phi;</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a> += <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4e13fe56c1136046637e1ece07f35f89">_F</a> + <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5840fa06ad5ab371d8cb720ebef3d283">_alpha</a>*phi;</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordflow">while</span> (<a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a>&gt;( 2*M_PI)) { <a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a> -= 2*M_PI; }</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">while</span> (<a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a>&lt;(-2*M_PI)) { <a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a> += 2*M_PI; }</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4e13fe56c1136046637e1ece07f35f89">_F</a> = std::min(<a class="code" href="classsdr_1_1_b_p_s_k31.html#a106fd36dcef5ebb97c70b2e7145a2f73">_Fmax</a>, std::max(<a class="code" href="classsdr_1_1_b_p_s_k31.html#a3cbb35d4aee991bf3be8137f2218f0dd">_Fmin</a>, <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4e13fe56c1136046637e1ece07f35f89">_F</a>));</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="comment">//std::cerr &lt;&lt; &quot;Update PLL: P=&quot; &lt;&lt; _P &lt;&lt; &quot;; F=&quot; &lt;&lt; _F &lt;&lt; &quot;, err= &quot; &lt;&lt; phi &lt;&lt; std::endl;</span></div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; }</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;</div>
<div class="line"><a name="l00197"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#af7ecee919d13d75c65be3541244aa124"> 197</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#af7ecee919d13d75c65be3541244aa124">_updateSampler</a>(<span class="keyword">const</span> std::complex&lt;Scalar&gt; &amp;value) {</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="comment">// decrease fractional sub-sample counter</span></div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4c54a851adee3e49f8d1bf377f78c220">_mu</a>-=1;</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="comment">// Update phase</span></div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a> += <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4e13fe56c1136046637e1ece07f35f89">_F</a>;</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="comment">// Limit phase</span></div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">while</span> (<a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a>&gt;( 2*M_PI)) { <a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a> -= 2*M_PI; }</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="keywordflow">while</span> (<a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a>&lt;(-2*M_PI)) { <a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a> += 2*M_PI; }</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="comment">// Calc down-conversion factor (consider look-up table)</span></div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; std::complex&lt;float&gt; fac = std::exp(std::complex&lt;float&gt;(0, <a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a>+<a class="code" href="classsdr_1_1_b_p_s_k31.html#abba53fd1265a1e8d1286ea0fb45d2e94">_theta</a>));</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="comment">// Down-convert singal</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; std::complex&lt;float&gt; sample = fac * std::complex&lt;float&gt;(value.real(), value.imag());</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="comment">// store sample into delay line</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a99f0eb17cf4fedd7be540c213e3867aa">_dl</a>[<a class="code" href="classsdr_1_1_b_p_s_k31.html#ac66bb680fd30fd4f135702605ae89757">_dl_idx</a>] = sample;</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; _dl[<a class="code" href="classsdr_1_1_b_p_s_k31.html#ac66bb680fd30fd4f135702605ae89757">_dl_idx</a>+8] = sample;</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#ac66bb680fd30fd4f135702605ae89757">_dl_idx</a> = (<a class="code" href="classsdr_1_1_b_p_s_k31.html#ac66bb680fd30fd4f135702605ae89757">_dl_idx</a> + 1) % 8;</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; }</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;</div>
<div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a89cddd31ec12ed1a731af8016ca2a54e"> 216</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a89cddd31ec12ed1a731af8016ca2a54e">_errorTracking</a>(<span class="keyword">const</span> std::complex&lt;float&gt; &amp;sample) {</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="comment">// Update last 2 constellation and phases</span></div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#aaff3323641cbe2ec6f6c821fc688df4d">_p_2T</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#a9176a05d6e8f1cd3f566df0e8710d0a3">_p_1T</a>; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a9176a05d6e8f1cd3f566df0e8710d0a3">_p_1T</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#a36a15215bd1ca9ff77ed24007026897c">_p_0T</a>; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a36a15215bd1ca9ff77ed24007026897c">_p_0T</a> = sample;</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a0b548185b5057602c3dbe975fbf7dc89">_c_2T</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#a16efac49cb378741c6c9162012029355">_c_1T</a>; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a16efac49cb378741c6c9162012029355">_c_1T</a> = <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4071742bae6cc43656d05dc375e309fc">_c_0T</a>; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4071742bae6cc43656d05dc375e309fc">_c_0T</a> = (sample.real() &gt; 0) ? -1 : 1;</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <span class="comment">// Compute difference between phase and constellation</span></div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; std::complex&lt;float&gt; x = (<a class="code" href="classsdr_1_1_b_p_s_k31.html#a4071742bae6cc43656d05dc375e309fc">_c_0T</a> - <a class="code" href="classsdr_1_1_b_p_s_k31.html#a0b548185b5057602c3dbe975fbf7dc89">_c_2T</a>) * std::conj(<a class="code" href="classsdr_1_1_b_p_s_k31.html#a9176a05d6e8f1cd3f566df0e8710d0a3">_p_1T</a>);</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; std::complex&lt;float&gt; y = (<a class="code" href="classsdr_1_1_b_p_s_k31.html#a36a15215bd1ca9ff77ed24007026897c">_p_0T</a> - <a class="code" href="classsdr_1_1_b_p_s_k31.html#aaff3323641cbe2ec6f6c821fc688df4d">_p_2T</a>) * std::conj(<a class="code" href="classsdr_1_1_b_p_s_k31.html#a16efac49cb378741c6c9162012029355">_c_1T</a>);</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="comment">// Get phase error</span></div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordtype">float</span> err = std::real(y-x);</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordflow">if</span> (err &gt; 1.0) { err = 1.0; }</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">if</span> (err &lt; -1.0) { err = -1.0; }</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="comment">// Update symbol rate (approx 31.25*64)</span></div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">_omega</a> += <a class="code" href="classsdr_1_1_b_p_s_k31.html#a7365c27f5eb587af4a9a97731d2fdff8">_gain_omega</a> * err;</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="comment">// Limit omega on _omega_mid +/- _omega*_omega_rel</span></div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">_omega</a> = std::max(<a class="code" href="classsdr_1_1_b_p_s_k31.html#aae86fc72e6e69cd5f3ec383c1c58dd36">_min_omega</a>, std::min(<a class="code" href="classsdr_1_1_b_p_s_k31.html#aca8de3ffeaec1ef562d26b55447cc37c">_max_omega</a>, <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">_omega</a>));</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="comment">// Update mu as +_omega (samples per symbol) and a small correction term</span></div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4c54a851adee3e49f8d1bf377f78c220">_mu</a> += <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">_omega</a> + <a class="code" href="classsdr_1_1_b_p_s_k31.html#a40a278099c4100e6d04053f97fe310d8">_gain_mu</a> * err;</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;</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;<span class="keyword">protected</span>:</div>
<div class="line"><a name="l00238"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a271efce529e564fe4255862f41137662"> 238</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a271efce529e564fe4255862f41137662">_superSample</a>;</div>
<div class="line"><a name="l00240"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3"> 240</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">_P</a>;</div>
<div class="line"><a name="l00242"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a4e13fe56c1136046637e1ece07f35f89"> 242</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4e13fe56c1136046637e1ece07f35f89">_F</a>;</div>
<div class="line"><a name="l00244"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a3cbb35d4aee991bf3be8137f2218f0dd"> 244</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a3cbb35d4aee991bf3be8137f2218f0dd">_Fmin</a>;</div>
<div class="line"><a name="l00246"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a106fd36dcef5ebb97c70b2e7145a2f73"> 246</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a106fd36dcef5ebb97c70b2e7145a2f73">_Fmax</a>;</div>
<div class="line"><a name="l00248"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a5840fa06ad5ab371d8cb720ebef3d283"> 248</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5840fa06ad5ab371d8cb720ebef3d283">_alpha</a>;</div>
<div class="line"><a name="l00250"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a0688ca26994611e997248184f585ac70"> 250</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a0688ca26994611e997248184f585ac70">_beta</a>;</div>
<div class="line"><a name="l00252"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a99f0eb17cf4fedd7be540c213e3867aa"> 252</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt; std::complex&lt;float&gt;</a> &gt; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a99f0eb17cf4fedd7be540c213e3867aa">_dl</a>;</div>
<div class="line"><a name="l00254"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#ac66bb680fd30fd4f135702605ae89757"> 254</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#ac66bb680fd30fd4f135702605ae89757">_dl_idx</a>;</div>
<div class="line"><a name="l00256"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a4c54a851adee3e49f8d1bf377f78c220"> 256</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4c54a851adee3e49f8d1bf377f78c220">_mu</a>;</div>
<div class="line"><a name="l00258"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a40a278099c4100e6d04053f97fe310d8"> 258</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a40a278099c4100e6d04053f97fe310d8">_gain_mu</a>;</div>
<div class="line"><a name="l00260"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#abba53fd1265a1e8d1286ea0fb45d2e94"> 260</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#abba53fd1265a1e8d1286ea0fb45d2e94">_theta</a>;</div>
<div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64"> 262</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">_omega</a>;</div>
<div class="line"><a name="l00264"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a694edbdce37208b475d545c5be610161"> 264</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a694edbdce37208b475d545c5be610161">_omega_rel</a>;</div>
<div class="line"><a name="l00266"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#aae86fc72e6e69cd5f3ec383c1c58dd36"> 266</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#aae86fc72e6e69cd5f3ec383c1c58dd36">_min_omega</a>;</div>
<div class="line"><a name="l00268"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#aca8de3ffeaec1ef562d26b55447cc37c"> 268</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#aca8de3ffeaec1ef562d26b55447cc37c">_max_omega</a>;</div>
<div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a7365c27f5eb587af4a9a97731d2fdff8"> 270</a></span>&#160; <span class="keywordtype">float</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a7365c27f5eb587af4a9a97731d2fdff8">_gain_omega</a>;</div>
<div class="line"><a name="l00272"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a36a15215bd1ca9ff77ed24007026897c"> 272</a></span>&#160; std::complex&lt;float&gt; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a36a15215bd1ca9ff77ed24007026897c">_p_0T</a>;</div>
<div class="line"><a name="l00274"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a9176a05d6e8f1cd3f566df0e8710d0a3"> 274</a></span>&#160; std::complex&lt;float&gt; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a9176a05d6e8f1cd3f566df0e8710d0a3">_p_1T</a>;</div>
<div class="line"><a name="l00276"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#aaff3323641cbe2ec6f6c821fc688df4d"> 276</a></span>&#160; std::complex&lt;float&gt; <a class="code" href="classsdr_1_1_b_p_s_k31.html#aaff3323641cbe2ec6f6c821fc688df4d">_p_2T</a>;</div>
<div class="line"><a name="l00278"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a4071742bae6cc43656d05dc375e309fc"> 278</a></span>&#160; std::complex&lt;float&gt; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a4071742bae6cc43656d05dc375e309fc">_c_0T</a>;</div>
<div class="line"><a name="l00280"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a16efac49cb378741c6c9162012029355"> 280</a></span>&#160; std::complex&lt;float&gt; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a16efac49cb378741c6c9162012029355">_c_1T</a>;</div>
<div class="line"><a name="l00282"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a0b548185b5057602c3dbe975fbf7dc89"> 282</a></span>&#160; std::complex&lt;float&gt; <a class="code" href="classsdr_1_1_b_p_s_k31.html#a0b548185b5057602c3dbe975fbf7dc89">_c_2T</a>;</div>
<div class="line"><a name="l00284"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da"> 284</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt;float&gt;</a> <a class="code" href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">_hist</a>;</div>
<div class="line"><a name="l00286"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10"> 286</a></span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">_hist_idx</a>;</div>
<div class="line"><a name="l00288"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#adaba010c7d0c74e28c719054d0c0f44f"> 288</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classsdr_1_1_b_p_s_k31.html#adaba010c7d0c74e28c719054d0c0f44f">_last_constellation</a>;</div>
<div class="line"><a name="l00290"></a><span class="lineno"><a class="line" href="classsdr_1_1_b_p_s_k31.html#a612d180c1f6d289dd2f5a21fb15566d1"> 290</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt;uint8_t&gt;</a> <a class="code" href="classsdr_1_1_b_p_s_k31.html#a612d180c1f6d289dd2f5a21fb15566d1">_buffer</a>;</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;};</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160;</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160;</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160;</div>
<div class="line"><a name="l00299"></a><span class="lineno"><a class="line" href="classsdr_1_1_varicode.html"> 299</a></span>&#160;<span class="keyword">class </span><a class="code" href="classsdr_1_1_varicode.html">Varicode</a>: <span class="keyword">public</span> <a class="code" href="classsdr_1_1_sink.html">Sink</a>&lt;uint8_t&gt;, <span class="keyword">public</span> <a class="code" href="classsdr_1_1_source.html">Source</a></div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;{</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160;<span class="keyword">public</span>:</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <a class="code" href="classsdr_1_1_varicode.html#a62e59e14876da3cda7f241ba49a51a0e">Varicode</a>();</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keyword">virtual</span> <a class="code" href="classsdr_1_1_varicode.html#a68fecb7c98722029c8ee4e634101f43e">~Varicode</a>();</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_varicode.html#adf7cb0e1e1603a8c3ab6432932e4d21f">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="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classsdr_1_1_varicode.html#a8a6bb2547fe48e8994ae9d34afac375a">process</a>(<span class="keyword">const</span> <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt;uint8_t&gt;</a> &amp;buffer, <span class="keywordtype">bool</span> allow_overwrite);</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160;<span class="keyword">protected</span>:</div>
<div class="line"><a name="l00313"></a><span class="lineno"><a class="line" href="classsdr_1_1_varicode.html#a162dfe8dd1ae552e64ca87ac3dee6edc"> 313</a></span>&#160; uint16_t <a class="code" href="classsdr_1_1_varicode.html#a162dfe8dd1ae552e64ca87ac3dee6edc">_value</a>;</div>
<div class="line"><a name="l00315"></a><span class="lineno"><a class="line" href="classsdr_1_1_varicode.html#aa0477054e352fe806e1b6f80a27a2549"> 315</a></span>&#160; <a class="code" href="classsdr_1_1_buffer.html">Buffer&lt;uint8_t&gt;</a> <a class="code" href="classsdr_1_1_varicode.html#aa0477054e352fe806e1b6f80a27a2549">_buffer</a>;</div>
<div class="line"><a name="l00317"></a><span class="lineno"><a class="line" href="classsdr_1_1_varicode.html#ab5116289591398976643bb79baadfcf6"> 317</a></span>&#160; std::map&lt;uint16_t, char&gt; <a class="code" href="classsdr_1_1_varicode.html#ab5116289591398976643bb79baadfcf6">_code_table</a>;</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;};</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160;</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160;}</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160;</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160;</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160;<span class="preprocessor">#endif // __SDR_PSK31_HH__</span></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_abba53fd1265a1e8d1286ea0fb45d2e94"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#abba53fd1265a1e8d1286ea0fb45d2e94">sdr::BPSK31::_theta</a></div><div class="ttdeci">float _theta</div><div class="ttdoc">Constant phase shift between real axis and first constellation. </div><div class="ttdef"><b>Definition:</b> psk31.hh:260</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_b_p_s_k31_html_aab684b2c77f69551f81e6134ee4ca7da"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#aab684b2c77f69551f81e6134ee4ca7da">sdr::BPSK31::_hist</a></div><div class="ttdeci">Buffer&lt; float &gt; _hist</div><div class="ttdoc">The last _superSample phases. </div><div class="ttdef"><b>Definition:</b> psk31.hh:284</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a271efce529e564fe4255862f41137662"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a271efce529e564fe4255862f41137662">sdr::BPSK31::_superSample</a></div><div class="ttdeci">size_t _superSample</div><div class="ttdoc">Holds the number of phase constellations per bit. </div><div class="ttdef"><b>Definition:</b> psk31.hh:238</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a0b548185b5057602c3dbe975fbf7dc89"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a0b548185b5057602c3dbe975fbf7dc89">sdr::BPSK31::_c_2T</a></div><div class="ttdeci">std::complex&lt; float &gt; _c_2T</div><div class="ttdoc">Constellation at T=-2 (samples). </div><div class="ttdef"><b>Definition:</b> psk31.hh:282</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a36a15215bd1ca9ff77ed24007026897c"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a36a15215bd1ca9ff77ed24007026897c">sdr::BPSK31::_p_0T</a></div><div class="ttdeci">std::complex&lt; float &gt; _p_0T</div><div class="ttdoc">Phase at T = 0 (samples). </div><div class="ttdef"><b>Definition:</b> psk31.hh:272</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_ac630b11ea9bced1aa085bbb5523d064f"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#ac630b11ea9bced1aa085bbb5523d064f">sdr::BPSK31::_phaseError</a></div><div class="ttdeci">float _phaseError(const std::complex&lt; float &gt; &amp;value) const </div><div class="ttdoc">Computes the phase error. </div><div class="ttdef"><b>Definition:</b> psk31.hh:177</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a40a278099c4100e6d04053f97fe310d8"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a40a278099c4100e6d04053f97fe310d8">sdr::BPSK31::_gain_mu</a></div><div class="ttdeci">float _gain_mu</div><div class="ttdoc">Gain factor of the sub-sampler. </div><div class="ttdef"><b>Definition:</b> psk31.hh:258</div></div>
<div class="ttc" id="classsdr_1_1_varicode_html_ab5116289591398976643bb79baadfcf6"><div class="ttname"><a href="classsdr_1_1_varicode.html#ab5116289591398976643bb79baadfcf6">sdr::Varicode::_code_table</a></div><div class="ttdeci">std::map&lt; uint16_t, char &gt; _code_table</div><div class="ttdoc">The conversion table. </div><div class="ttdef"><b>Definition:</b> psk31.hh:317</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a4071742bae6cc43656d05dc375e309fc"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a4071742bae6cc43656d05dc375e309fc">sdr::BPSK31::_c_0T</a></div><div class="ttdeci">std::complex&lt; float &gt; _c_0T</div><div class="ttdoc">Constellation at T=0 (samples). </div><div class="ttdef"><b>Definition:</b> psk31.hh:278</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_af151da88f45eb7c637a6e28006c88247"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#af151da88f45eb7c637a6e28006c88247">sdr::BPSK31::_currentContellation</a></div><div class="ttdeci">int _currentContellation() const </div><div class="ttdoc">Returns the current constellation. </div><div class="ttdef"><b>Definition:</b> psk31.hh:170</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a36da3163abca21c2dcd042139de0a36e"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a36da3163abca21c2dcd042139de0a36e">sdr::BPSK31::config</a></div><div class="ttdeci">virtual void config(const Config &amp;src_cfg)</div><div class="ttdoc">Needs to be implemented by any sub-type to check and perform the configuration of the node...</div><div class="ttdef"><b>Definition:</b> psk31.hh:72</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_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="classsdr_1_1_b_p_s_k31_html_a9176a05d6e8f1cd3f566df0e8710d0a3"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a9176a05d6e8f1cd3f566df0e8710d0a3">sdr::BPSK31::_p_1T</a></div><div class="ttdeci">std::complex&lt; float &gt; _p_1T</div><div class="ttdoc">Phase at T=-1 (samples). </div><div class="ttdef"><b>Definition:</b> psk31.hh:274</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="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_config_html_a5df3f75dcd6e678bd5f029a7400b404e"><div class="ttname"><a href="classsdr_1_1_config.html#a5df3f75dcd6e678bd5f029a7400b404e">sdr::Config::hasSampleRate</a></div><div class="ttdeci">bool hasSampleRate() const </div><div class="ttdoc">If true, the configuration has a sample rate. </div><div class="ttdef"><b>Definition:</b> node.hh:75</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_b_p_s_k31_html_a694edbdce37208b475d545c5be610161"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a694edbdce37208b475d545c5be610161">sdr::BPSK31::_omega_rel</a></div><div class="ttdeci">float _omega_rel</div><div class="ttdoc">Relative error of the subsample rate. </div><div class="ttdef"><b>Definition:</b> psk31.hh:264</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html">sdr::BPSK31</a></div><div class="ttdoc">A simple BPSK31 "demodulator". </div><div class="ttdef"><b>Definition:</b> psk31.hh:17</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a5470329484c6ffb1b3d2a084d7a7fc64"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a5470329484c6ffb1b3d2a084d7a7fc64">sdr::BPSK31::_omega</a></div><div class="ttdeci">float _omega</div><div class="ttdoc">Current sub-sample rate. </div><div class="ttdef"><b>Definition:</b> psk31.hh:262</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a106fd36dcef5ebb97c70b2e7145a2f73"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a106fd36dcef5ebb97c70b2e7145a2f73">sdr::BPSK31::_Fmax</a></div><div class="ttdeci">float _Fmax</div><div class="ttdoc">Upper frequency limit of the carrier PLL. </div><div class="ttdef"><b>Definition:</b> psk31.hh:246</div></div>
<div class="ttc" id="classsdr_1_1_varicode_html_aa0477054e352fe806e1b6f80a27a2549"><div class="ttname"><a href="classsdr_1_1_varicode.html#aa0477054e352fe806e1b6f80a27a2549">sdr::Varicode::_buffer</a></div><div class="ttdeci">Buffer&lt; uint8_t &gt; _buffer</div><div class="ttdoc">The output buffer. </div><div class="ttdef"><b>Definition:</b> psk31.hh:315</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a99f0eb17cf4fedd7be540c213e3867aa"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a99f0eb17cf4fedd7be540c213e3867aa">sdr::BPSK31::_dl</a></div><div class="ttdeci">Buffer&lt; std::complex&lt; float &gt; &gt; _dl</div><div class="ttdoc">The delay line for the interpolating sub-sampler. </div><div class="ttdef"><b>Definition:</b> psk31.hh:252</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_adaba010c7d0c74e28c719054d0c0f44f"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#adaba010c7d0c74e28c719054d0c0f44f">sdr::BPSK31::_last_constellation</a></div><div class="ttdeci">int _last_constellation</div><div class="ttdoc">The last output constellation. </div><div class="ttdef"><b>Definition:</b> psk31.hh:288</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a778802b1b78667db77a5b95f934d4cd2"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a778802b1b78667db77a5b95f934d4cd2">sdr::BPSK31::_updatePLL</a></div><div class="ttdeci">void _updatePLL(const std::complex&lt; float &gt; &amp;sample)</div><div class="ttdoc">Updates the PLL (_F and _P). </div><div class="ttdef"><b>Definition:</b> psk31.hh:186</div></div>
<div class="ttc" id="classsdr_1_1_config_html_a7cdfc69aa8e3ab975db7251747343a20"><div class="ttname"><a href="classsdr_1_1_config.html#a7cdfc69aa8e3ab975db7251747343a20">sdr::Config::hasType</a></div><div class="ttdeci">bool hasType() const </div><div class="ttdoc">If true, the configuration has a type. </div><div class="ttdef"><b>Definition:</b> node.hh:69</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a3cbb35d4aee991bf3be8137f2218f0dd"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a3cbb35d4aee991bf3be8137f2218f0dd">sdr::BPSK31::_Fmin</a></div><div class="ttdeci">float _Fmin</div><div class="ttdoc">Lower frequency limit of the carrier PLL. </div><div class="ttdef"><b>Definition:</b> psk31.hh:244</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_aca8de3ffeaec1ef562d26b55447cc37c"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#aca8de3ffeaec1ef562d26b55447cc37c">sdr::BPSK31::_max_omega</a></div><div class="ttdeci">float _max_omega</div><div class="ttdoc">Maximum of the sub-sample rate. </div><div class="ttdef"><b>Definition:</b> psk31.hh:268</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a16efac49cb378741c6c9162012029355"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a16efac49cb378741c6c9162012029355">sdr::BPSK31::_c_1T</a></div><div class="ttdeci">std::complex&lt; float &gt; _c_1T</div><div class="ttdoc">Constellation at T=-1 (samples). </div><div class="ttdef"><b>Definition:</b> psk31.hh:280</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_varicode_html_a68fecb7c98722029c8ee4e634101f43e"><div class="ttname"><a href="classsdr_1_1_varicode.html#a68fecb7c98722029c8ee4e634101f43e">sdr::Varicode::~Varicode</a></div><div class="ttdeci">virtual ~Varicode()</div><div class="ttdoc">Destructor. </div><div class="ttdef"><b>Definition:</b> psk31.cc:47</div></div>
<div class="ttc" id="classsdr_1_1_varicode_html_adf7cb0e1e1603a8c3ab6432932e4d21f"><div class="ttname"><a href="classsdr_1_1_varicode.html#adf7cb0e1e1603a8c3ab6432932e4d21f">sdr::Varicode::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> psk31.cc:52</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a612d180c1f6d289dd2f5a21fb15566d1"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a612d180c1f6d289dd2f5a21fb15566d1">sdr::BPSK31::_buffer</a></div><div class="ttdeci">Buffer&lt; uint8_t &gt; _buffer</div><div class="ttdoc">Output buffer. </div><div class="ttdef"><b>Definition:</b> psk31.hh:290</div></div>
<div class="ttc" id="classsdr_1_1_buffer_html_a3eca322ed118a7b5c4cc62b25ce5d119"><div class="ttname"><a href="classsdr_1_1_buffer.html#a3eca322ed118a7b5c4cc62b25ce5d119">sdr::Buffer::head</a></div><div class="ttdeci">Buffer&lt; T &gt; head(size_t n) const </div><div class="ttdoc">Returns a new view on this buffer. </div><div class="ttdef"><b>Definition:</b> buffer.hh:237</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a4c54a851adee3e49f8d1bf377f78c220"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a4c54a851adee3e49f8d1bf377f78c220">sdr::BPSK31::_mu</a></div><div class="ttdeci">float _mu</div><div class="ttdoc">Holds the fractional sub-sampling counter. </div><div class="ttdef"><b>Definition:</b> psk31.hh:256</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a5f194008dae3fb4b4f004f77e03786dc"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a5f194008dae3fb4b4f004f77e03786dc">sdr::BPSK31::~BPSK31</a></div><div class="ttdeci">virtual ~BPSK31()</div><div class="ttdoc">Destructor. </div><div class="ttdef"><b>Definition:</b> psk31.hh:65</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a4e13fe56c1136046637e1ece07f35f89"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a4e13fe56c1136046637e1ece07f35f89">sdr::BPSK31::_F</a></div><div class="ttdeci">float _F</div><div class="ttdoc">Frequency of the carrier PLL. </div><div class="ttdef"><b>Definition:</b> psk31.hh:242</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_aae86fc72e6e69cd5f3ec383c1c58dd36"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#aae86fc72e6e69cd5f3ec383c1c58dd36">sdr::BPSK31::_min_omega</a></div><div class="ttdeci">float _min_omega</div><div class="ttdoc">Minimum of the sub-sample rate. </div><div class="ttdef"><b>Definition:</b> psk31.hh:266</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a89cddd31ec12ed1a731af8016ca2a54e"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a89cddd31ec12ed1a731af8016ca2a54e">sdr::BPSK31::_errorTracking</a></div><div class="ttdeci">void _errorTracking(const std::complex&lt; float &gt; &amp;sample)</div><div class="ttdoc">Updates the PPL state (_mu and _omega). </div><div class="ttdef"><b>Definition:</b> psk31.hh:216</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_b_p_s_k31_html_a0688ca26994611e997248184f585ac70"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a0688ca26994611e997248184f585ac70">sdr::BPSK31::_beta</a></div><div class="ttdeci">float _beta</div><div class="ttdoc">Gain factor of the carrier PLL. </div><div class="ttdef"><b>Definition:</b> psk31.hh:250</div></div>
<div class="ttc" id="classsdr_1_1_varicode_html_a162dfe8dd1ae552e64ca87ac3dee6edc"><div class="ttname"><a href="classsdr_1_1_varicode.html#a162dfe8dd1ae552e64ca87ac3dee6edc">sdr::Varicode::_value</a></div><div class="ttdeci">uint16_t _value</div><div class="ttdoc">The shift register of the last received bits. </div><div class="ttdef"><b>Definition:</b> psk31.hh:313</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_b_p_s_k31_html_af7ecee919d13d75c65be3541244aa124"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#af7ecee919d13d75c65be3541244aa124">sdr::BPSK31::_updateSampler</a></div><div class="ttdeci">void _updateSampler(const std::complex&lt; Scalar &gt; &amp;value)</div><div class="ttdoc">Updates the sub-sampler. </div><div class="ttdef"><b>Definition:</b> psk31.hh:197</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a5840fa06ad5ab371d8cb720ebef3d283"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a5840fa06ad5ab371d8cb720ebef3d283">sdr::BPSK31::_alpha</a></div><div class="ttdeci">float _alpha</div><div class="ttdoc">Gain factor of the carrier PLL. </div><div class="ttdef"><b>Definition:</b> psk31.hh:248</div></div>
<div class="ttc" id="classsdr_1_1_buffer_html_a8d8e0ca5402163ed7b9cd486c5236336"><div class="ttname"><a href="classsdr_1_1_buffer.html#a8d8e0ca5402163ed7b9cd486c5236336">sdr::Buffer::sub</a></div><div class="ttdeci">Buffer&lt; T &gt; sub(size_t offset, size_t len) const </div><div class="ttdoc">Returns a new view on this buffer. </div><div class="ttdef"><b>Definition:</b> buffer.hh:231</div></div>
<div class="ttc" id="classsdr_1_1_varicode_html_a8a6bb2547fe48e8994ae9d34afac375a"><div class="ttname"><a href="classsdr_1_1_varicode.html#a8a6bb2547fe48e8994ae9d34afac375a">sdr::Varicode::process</a></div><div class="ttdeci">virtual void process(const Buffer&lt; uint8_t &gt; &amp;buffer, bool allow_overwrite)</div><div class="ttdoc">Converts the input bit stream to ASCII chars. </div><div class="ttdef"><b>Definition:</b> psk31.cc:69</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_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_varicode_html"><div class="ttname"><a href="classsdr_1_1_varicode.html">sdr::Varicode</a></div><div class="ttdoc">Simple varicode (Huffman code) decoder node. </div><div class="ttdef"><b>Definition:</b> psk31.hh:299</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_abc76ab3fa3638e4d0b1f29eadd2b1e10"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#abc76ab3fa3638e4d0b1f29eadd2b1e10">sdr::BPSK31::_hist_idx</a></div><div class="ttdeci">size_t _hist_idx</div><div class="ttdoc">Current phase history index. </div><div class="ttdef"><b>Definition:</b> psk31.hh:286</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a19a7364e76d267ff1e6868f41ee3bbf2"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a19a7364e76d267ff1e6868f41ee3bbf2">sdr::BPSK31::_hasTransition</a></div><div class="ttdeci">bool _hasTransition() const </div><div class="ttdoc">Returns true if there is a phase transition at the current sample. </div><div class="ttdef"><b>Definition:</b> psk31.hh:164</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a7365c27f5eb587af4a9a97731d2fdff8"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a7365c27f5eb587af4a9a97731d2fdff8">sdr::BPSK31::_gain_omega</a></div><div class="ttdeci">float _gain_omega</div><div class="ttdoc">Gain of the sub-sample rate correction. </div><div class="ttdef"><b>Definition:</b> psk31.hh:270</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_ade59846cb15dbe988a7238ed598df9a3"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#ade59846cb15dbe988a7238ed598df9a3">sdr::BPSK31::_P</a></div><div class="ttdeci">float _P</div><div class="ttdoc">Phase of the carrier PLL. </div><div class="ttdef"><b>Definition:</b> psk31.hh:240</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_aaff3323641cbe2ec6f6c821fc688df4d"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#aaff3323641cbe2ec6f6c821fc688df4d">sdr::BPSK31::_p_2T</a></div><div class="ttdeci">std::complex&lt; float &gt; _p_2T</div><div class="ttdoc">Phase at T=-2 (samples). </div><div class="ttdef"><b>Definition:</b> psk31.hh:276</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_traits_html"><div class="ttname"><a href="classsdr_1_1_traits.html">sdr::Traits</a></div><div class="ttdoc">Forward declaration of type tratis template. </div><div class="ttdef"><b>Definition:</b> traits.hh:20</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_a7862edf6d977ae6943047bd5c46036ec"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#a7862edf6d977ae6943047bd5c46036ec">sdr::BPSK31::BPSK31</a></div><div class="ttdeci">BPSK31(double dF=0.1)</div><div class="ttdoc">Constructs a new BPSK31 demodulator. </div><div class="ttdef"><b>Definition:</b> psk31.hh:35</div></div>
<div class="ttc" id="classsdr_1_1_b_p_s_k31_html_aab706f8a7b70b479213b7bbf9015643d"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#aab706f8a7b70b479213b7bbf9015643d">sdr::BPSK31::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">Needs to be implemented by any sub-type to process the received data. </div><div class="ttdef"><b>Definition:</b> psk31.hh:114</div></div>
<div class="ttc" id="classsdr_1_1_varicode_html_a62e59e14876da3cda7f241ba49a51a0e"><div class="ttname"><a href="classsdr_1_1_varicode.html#a62e59e14876da3cda7f241ba49a51a0e">sdr::Varicode::Varicode</a></div><div class="ttdeci">Varicode()</div><div class="ttdoc">Constructor. </div><div class="ttdef"><b>Definition:</b> psk31.cc:7</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_config_html_a485e488e1411e52c722b22d1807be406"><div class="ttname"><a href="classsdr_1_1_config.html#a485e488e1411e52c722b22d1807be406">sdr::Config::hasBufferSize</a></div><div class="ttdeci">bool hasBufferSize() const </div><div class="ttdoc">If true, the configuration has a buffer size. </div><div class="ttdef"><b>Definition:</b> node.hh:81</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_b_p_s_k31_html_ac66bb680fd30fd4f135702605ae89757"><div class="ttname"><a href="classsdr_1_1_b_p_s_k31.html#ac66bb680fd30fd4f135702605ae89757">sdr::BPSK31::_dl_idx</a></div><div class="ttdeci">size_t _dl_idx</div><div class="ttdoc">The current index of the delay line. </div><div class="ttdef"><b>Definition:</b> psk31.hh:254</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>