-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathszoftverradios_gyak.tex
276 lines (214 loc) · 10.5 KB
/
szoftverradios_gyak.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{color}
\usepackage[magyar]{babel}
\usepackage{listings}
\usepackage{float}
\usepackage{enumerate}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\usetikzlibrary{positioning}
\usetikzlibrary{arrows.meta}
\tikzset{
block/.style = {draw, fill=white, rectangle, minimum height=3em, minimum width=3em},
tmp/.style = {coordinate},
input/.style = {coordinate},
output/.style= {coordinate},
pinstyle/.style = {pin edge={to-,thin,black}
}
}
\usepackage[siunitx]{circuitikz}
\renewcommand{\lstlistingname}{Lista}
\usepackage{hyperref}
\hypersetup{
pdftitle={HA5KFU tanfolyam - Szoftverrádió gyakorlat},
pdfauthor={HA5KFU Rádióamatőr Klub},
pdfsubject={HA5KFU tanfolyam},
pdfcreator={latex},
pdfkeywords={ },
pdfpagemode=UseOutlines,
pdfdisplaydoctitle=true,
pdflang=hu,
unicode
}
\usepackage{color} %red, green, blue, yellow, cyan, magenta, black, white
\usepackage{xcolor}
\usepackage{textcomp}
\definecolor{comment}{RGB}{0,128,0} % dark green
\definecolor{string}{RGB}{255,0,0} % red
\definecolor{keyword}{RGB}{0,0,255} % blue
\usepackage{accsupp}
\newcommand{\noncopynumber}[1]{%
\BeginAccSupp{method=escape,ActualText={}}%
#1%
\EndAccSupp{}%
}
\lstset{
basicstyle=\footnotesize\ttfamily\color{black},
commentstyle=\color{comment},
stringstyle=\color{string},
keywordstyle=\color{keyword},
basicstyle=\footnotesize\ttfamily,
numbers=left,
numberstyle=\tiny\noncopynumber,
numbersep=5pt,
frame=lines,
upquote=true,
breaklines=true,
prebreak=\raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}},
showstringspaces=false,
tabsize=2,
columns=flexible,
keepspaces=true,
}
\pagestyle{plain}
\sloppy
\begin{document}
\begin{center}
\includegraphics[width=300pt,keepaspectratio]{figures/ha5kfu.eps}
\\[0.5cm]
Rádióamatőr tanfolyamot segítő jegyzet, egyelőre kidolgozás alatt \\
Szabó Áron HA1FLX, Mérő László HA1CNT, Bazsó Márton HA7BM % Feel free to add yourself
\\
Retzler András HA7ILM szoftverrádiós vevője alapján
\\[1cm]
{\huge \bfseries Szoftverrádió gyakorlat \\[2cm]}
\end{center}
\renewcommand{\contentsname}{Tartalom}\tableofcontents
\newpage
\newpage
\section{Bevezető}
A gyakorlat célja a szoftverrádió lehetőségeinek megismerése, és bemutatása egy C nyelven megírt FM demodulátoron keresztül.
\section{Előkészületek}
A gyakorlathoz Linux operációs rendszerre lesz szükség.
\paragraph{Szükséges csomagok:}
\begin{itemize}
\item netcat
\item rtl-sdr \textit{(saját Realtek alapú szoftverrádiós eszköz esetén)}
\item tcc
\item sox
\item aplay
\item git \textit{(A kezdőkészlet letöltéséhez)}
\item \textit{ízlés szerinti szövegszerkesztő program }
\end{itemize}
Fontos, hogy működjön az internetelérés (vagy saját hardver esetén annak a drivere), illetve legyen működő hangkártya kimenet, és hangszóró/fülhallgató.
\section{Elméleti összefoglaló}
\subsection{IQ demodulátor}
Az IQ demodulátor egy szoftverrádiós eszközöben gyakran használt demodulátor.
Ilyen hardver található a gyakorlaton használt RTL-SDR USB stickben is.
Az IQ demodulátorban a bejövő jelet két azonos frekvenciájú, de 90°-kal eltolt jellel keverjük le (\ref{fig:iq}. ábra).
A felső keverési termékekeket egy low-pass filterrel kiszűrjük, íg kapjuk az I (in phase) és a Q (quadrature) jeleket.
Ezen jeleknek a frekvenciája a helyi oszicillátor és a vett jel frekvenciájának különbsége lesz.
Az I és Q jelet lehet külön-külön digitalizálni, ezen a ponton már nem szükséges nagyon gyors analóg-digitális átalakítás, hiszen alacsony frekvenciájú jelekkel dolgozunk.
Az I és Q jelet együtt, mint $I + jQ$ komplex jelet értelmezzük.
Ez már digitálisan feldolgozható, elvégezhető a demoduláció.
\begin{figure}[H]
\label{fig:iq}
\centering
\begin{tikzpicture}
\draw
(-1,-2) node[label={[font=\footnotesize]above:Antenna}] {}
(1,-4.5) node[label={[font=\footnotesize]above:Előerősítő}] {}
(4,-1.5) node[label={[font=\footnotesize]below:Oszcillátor ($f_o$)}] {}
(4,-3.5) node[label={[font=\footnotesize]below:$\frac{\pi}{2}$ fázisforgatás}] {}
(8.5,-1.5) node[label={[font=\footnotesize]above:Aluláteresztő szűrő}] {}
(10,0) node[label={[font=\footnotesize]above:I (In-phase)}] {}
(10,-7) node[label={[font=\footnotesize]above:Q (Quadrature)}] {}
%(0, -3) to [short] ++(1,0)
(2,-3) to [short] ++(0,3) to [short, i=\phantom{}] ++(3.5,0)
(2,-3) to [short] ++(0,-3) to [short, i=\phantom{}] ++(3.5,0)
(6,-1.5) to [short, i=\footnotesize $\cos(2\pi \cdot f_o \cdot t)$] (6,-0.5)
(6,-2.5) to [short, i=\phantom{}] (6,-3.5)
(6,-4.5) to [short, i>_=\footnotesize $-\sin(2\pi \cdot f_o \cdot t)$] (6,-5.5)
(6.5,0) to [short] ++(1,0) to [lowpass] ++(1,0) to [short, i=\phantom{}] ++(2,0)
(6.5,-6) to [short] ++(1,0) to [lowpass] ++(1,0) to [short, i=\phantom{}] ++(2,0)
(0, -3) to [amp] ++(2,0)
(6,0)[mixer] node(mixa){}
(6,-6)[mixer] node(mixb){}
(0,-3)[antenna]node(ant){}
(6.5,-2)[oscillator] node(osc){}
(6,-4)[phaseshiftershape] node(phas){}
;
\end{tikzpicture}
\caption{
Az IQ demodulátor egyszerűsített blokkvázlata}
\end{figure}
\subsection{Komplex jelek}
A komplex jelek szoftveres feldolgozása gyakran könnyebb, mint a csak valós számokból állóké.
Az eredeti vett jel szinuszos komponensei komplex szinuszoidként jelennek meg.
A komplex szinuszoidok a következő alakot veszik fel:
\[
A e^{j(\phi + 2 \pi f t)} = A ( \cos (\phi + 2 \pi f t) + j \sin (\phi + 2 \pi f t))
\]
Az IQ vektorokat ábrázolva ezeket $A$ hosszúságú $f$ frekvenciával az origó körül körbeforgó vektorokként fogjuk látni.
$A$ arányos a jel amplitudójával, $f$ pedig a helyi oszcillátor és a vett komponens frekvenciája közötti eltérés.
Amennyiben a vizsgált komponens frekvenciája nagyobb volt, mint a helyi oszcillátoré, $f$ pozitív lesz, tehát az IQ vektor
az óramutató járásával ellentétesen forog.
Ha a vizsgált komponens frekvenciája kisebb volt, mint a helyi oszcillátoré, $f$ negatív lesz, tehát az IQ vektor
az óramutató járásával megegyezően forog.
Ha az LO és a vett komponens frekvenciája megegyezik, $f = 0$ lesz, így a demodulált IQ vektor konstans.
Ilyenkor $\phi$ az LO és a vett jel közötti fáziseltérés.
(Általánosságban a $\phi + 2\pi ft$ kifejezés értelmezhető a két jel fáziseltéréseként, azonban ez időben változó, ha azok nem azonos frekvenciájúak.)
\begin{figure}[htp]
\centering
\includegraphics[width=300pt,keepaspectratio]{figures/modulaciok_workshop_fm.eps}
\caption{Komplex forgó vektor szinuszos jel esetén}
\label{fig:comp_vector}
\end{figure}
\subsection{Frekvencia moduláció}
Frekvencia modulációnál egy vivő jel frekvenciájába kódoljuk az $x_m(t)$ moduláló jel által hordozott információt. Az $y(t)$ modulált jelünket a következő képpen számolhatjuk ki:
\[
y(t) = A \cos(2 \pi t ( f_c + f_{\Delta} x(t) ) )
\]
Itt $A$ az amplitúdónk, $f_c$ a középfrekvenciánk, ez a "vivő eredeti frekvenciája", illetve az állomás névleges frekvenciája (pl. 97.1 MHz).
$f_{\Delta}$ a frekvencialöket, $\pm 1$ közé normált moduláló jelnél az kimeneti jel energiájának nagy része $f_c \pm f_{\Delta}$ közé esik.
\clearpage
\section{Feladatok}
\subsection{FM demoduláció}
A feladathoz egy RTL-SDR hardvert fogunk felhasználni.
Az USB stick a digitalizált IQ jelet egy bytestreamként küldi: egy 1 byte-os I majd egy 1 byte-os Q mintát küld felváltva.
A 8 bites minták offszettel ábrázolják a negatív értékeket (így például a jel $0$ értékét valójában a $127$-es bináris érték jelenti).
A bytestreamet a demoduláló programunk a standard inputon fogja megkapni, majd a standard outra kell, hogy kiadja az abból kiszámolt hangmintát.
Segítségképpen a minta beolvasás, illetve kiírás már szerepel a kiinduló kódban.
A fogadott IQ jel magasabb mintavételi rátával fog jönni, mint amit a hangkártya kezelni tud, azonban ezt egy külső programmal a demoduláció után fogjuk csökkenteni.
Ezért minden fogadott IQ mintára pontosan egy hangmintát kell a programnak kiadni.
\begin{lstlisting}[frame=single,language=c,caption=Kiinduló kód]
#include <math.h>
#include <stdio.h>
int main()
{
double i, q, s;
for(;;) //vegtelen ciklus
{
// beolvassuk az I mintat, az offszetet levonjuk, hogy a 0 tenyleg 0 legyen
i=((unsigned char)getchar()-127);
// Q-val ugyan ez
q=((unsigned char)getchar()-127); //bolvassuk
// s-be kell kiszamolni a demodulalt hangot
// a kiiras miatt s-t ugy kell skalazni hogy kb. -127 es 128 koze essen.
// s = ??;
// s-t visszaalakitjuk offszetese majd kiirjuk
putchar((unsigned char)(s+127));
}
}
\end{lstlisting}
\clearpage
A programot saját hardverrel a következő parancssorral lehet futtatni:
\begin{lstlisting}[frame=single,language=bash]
rtl_sdr -s 300000 -f 103300000 -g 20 - | tcc -lm -run minidemod-wfm.c | sox -t raw -r 300000 -e unsigned -b 8 -c 1 - -t raw - rate 48000 sinc -15k | aplay -f U8 -c1 -r 48000 --buffer-size=200000
\end{lstlisting}
Ha nincs saját hardvered, használhatod a Kafu \texttt{rtl\_mus} szerverét ezzel a paranccsal:
\begin{lstlisting}[frame=single,language=bash]
nc teto.sch.bme.hu 7373 -4 | tcc -lm -run minidemod-wfm.c | sox -t raw -r 300000 -e unsigned -b 8 -c 1 - -t raw - rate 48000 sinc -15k | aplay -f U8 -c1 -r 48000 --buffer-size=200000
\end{lstlisting}
Mindkét parancssorban az egyes programokat a \texttt{|} (pipe) karakter választja el, ami azt jelzi a shellnek,
hogy a balra lévő program standard outját adja át a jobbra lévő program standard injére.
Az \texttt{rtl\_sdr} program az USB stickről olvas mintákat, amiket a standard outra ír. A -s kapcsoló a mintavételi rátát, a -f a helyi oszcillátor frekvenciáját, a -g pedig az erősítést állítja.
Az \texttt{nc} (netcat) egy TCP kapcsolatot hoz létre a megadott szerverrel a megadott porton, és az onnan jövő adatot a standard outra írja.
A megadott gépen és porton egy \texttt{rtl\_mus} nevű program fut, ami a szerverbe dugott RTL-SDRből jövő mintákat fogja továbbítani.
A \texttt{tcc} lefordítja a C kódunkat, és egyből futtatja is az elkészült programot.
A \texttt{sox} az újramintavételezést végzi el, a 240 kHz-s jelből 48 kHz-eset csinál.
Az \texttt{aplay} pedig kijátsza a kapott mintákat a hangkártyán.
A gyakorlat kiinduló anyagai, illetve megoldásai elérhetőek a \href{https://github.com/simonyiszk/ha5kfu-SDR-gyak} címen.
\end{document}