-
Notifications
You must be signed in to change notification settings - Fork 1
/
channel__estimation_8md_source.html
99 lines (97 loc) · 10.7 KB
/
channel__estimation_8md_source.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<!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.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>free5GRAN: channel_estimation.md 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="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</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>
<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 id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">free5GRAN
 <span id="projectnumber">V1.0</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('channel__estimation_8md.html','');});
</script>
<div id="doc-content">
<!-- 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 class="header">
<div class="headertitle">
<div class="title">channel_estimation.md</div> </div>
</div><!--header-->
<div class="contents">
<a href="channel__estimation_8md.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> # Channel estimation and equalization</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> ## Concept</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> </div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> Over the air channel, the signal is modified by interference and noise, and cannot be decoded as-is. Equalization aims at correcting the received signal in order to recover the sent signal before decoding. This is done by estimating channel modifications for each RE grid point, based on pilot signals reception, and by applying inverse modification to received samples. The following Figure shows PDCCH samples before and after channel equalization:</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> ![PDCCH before equalization](https://raw.githubusercontent.com/free5G/free5GRAN-documentation/master/doc_images/no_est.png) </div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> ![PDCCH after equalization](https://raw.githubusercontent.com/free5G/free5GRAN-documentation/master/doc_images/est.png)</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> Channel estimation is a vast research topic, and different methods are proposed. Some of those methods are theoretical and cannot be implemented in concrete systems. Some other methods have high computational complexities. Least Square Estimator (LSE) is implemented in the current release which does not take into account channel noise. Noise mitigating estimation methods are planned to be added in future releases.</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> Channel estimation aims at computing, for each RE, a channel coefficient that represents channel perturbation effects. Correction `X`, called channel equalization, can be obtained by `X = H . Y` where `Y` are received samples and `H` are channel coefficients.</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> LSE consists of analysing pilots channel coefficients and propagating values by linear interpolation for non-pilot RE. Different pilots, called DMRS, are used according to the type of the physical channel. The first step is to compute pilots values. Then, channel coefficients are computed, for each `i,j` (symbol and sub-carrier index) in pilots position indexes:</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> ```</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> h(i,j) = x(i,j) / y(i,j)</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> ```</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> Linear interpolation is performed in the frequency domain first and then, if needed, in the time domain for recovering channel coefficients at every RE grid position.</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> ## Implementation</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> Channel estimation is defined in `lib/phy/libphy/libphy.cpp` and can be used like this:</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> ```</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> free5GRAN::phy::signal_processing::channelEstimation(dmrs_samples_only, dmrs_sequence, channel_indexes[1],coefficients, snr, 12 * lrb, L, 6 * lrb * num_symbols_dmrs);</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> ```</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> First, pilot coefficients are computed:</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> ```</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> // Computing pilots transport_channel coefficients</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> for (int i = 0; i < pilot_size; i ++){</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  coefficients[pilot_indexes[0][i]][pilot_indexes[1][i]] = pilots[i] * conj(reference_pilot[i]) / (float) pow(abs(reference_pilot[i]),2);</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> }</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> ```</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> Then, the function loops over all symbols and subcarriers, and perofrm linear interpolation:</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> ```</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> re_int = step * (real(coefficients[symbol][upper_index]) - real(coefficients[symbol][lower_index])) / step_width + real(coefficients[symbol][lower_index]);</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> im_int = step * (imag(coefficients[symbol][upper_index]) - imag(coefficients[symbol][lower_index])) / step_width + imag(coefficients[symbol][lower_index]);</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> coefficients[symbol][sc] = complex<float>(re_int,im_int);</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> ```</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> Where `step` is the number of subcarriers between studied RE and closest pilot. `symbol` is the studied symbol, `lower_index` is the highest lower pilot index and `upper_index` is the lowest higher pilot index. `step_width` is the number of subcarriers between two pilots.</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> </div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> If needed, a similar approach is used for time-domain interpolation.</div></div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="channel__estimation_8md.html">channel_estimation.md</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
</ul>
</div>
</body>
</html>