====== GNU Radio ======
Eine Software um im PC Datensignale zu verarbeiten und zu erzeugen
* Audioausgabe: [[gnuradio:audio]]
===== Code-Schnippsel =====
==== Aus USRP2 Daten in eine Pipe einlesen ====
Ich habe einen Empfänger mit ZF Ausgang (bei 10,7 MHz). Dieser Ausgang in an das USRP2 angeschlossen (RF1). Das Netzwerkkabel geht zu einer zusätzlichen Gigabit Netzwerkkarte im PC.
Falls es Fehler gibt die darauf hinweisen, dass keine Hardware da ist, mit dem Befehl
''ifconfig''
prüfen, ob die entsprechende Karte angezeigt wird (und "up" ist). Wenn nicht, dann anschalten. Bei mir:
''sudo ifconfig eth0 up''
Jetzt ist die Netzwerkkarte verfügbar.
Eine Datei die keine Daten enthält, sondern quasi eine Leitung von Ein- zu Ausgang darstellt, ist eine "pipe". Sie wird (einmalig) angelegt mit
''mkfifo pipe''
Jetzt gibt es Aufgaben:
* Daten aus dem Radio einlesen
* Daten mit GNU Radio verarbeiten
Und ich kenne min. 2 Arten das zu tun.
Entweder ich öffne 2 Terminalfenster um einmal in die Pipe zu streamen und daraus zu lesen, oder ich starte das streamen im Hintergrund und verarbeite im selben Termina.
Variante a:
2 Fenster
Fenster a:
usrp2_rx_cfile.py -f 10700000 -s -d 250 pipe
und später mit Strg+C beenden
Fenster b:
''cat pipe | ../../../../baudline/baudline -reset -samplerate 400000 -channels 2 -quadrature -format le16 -stdin''
Oder in einem Terminal:
durch Anhängen des Zeichen ''&'' wird das Terminal nicht blockiert bis das Programm beendet ist. Jedoch werden alle Ausgaben die das Programm an Stdout schickt angezigt. Zusätzlich erfährt man die ID des Programms. Diese ist wichtig um das Programm mit dem Befehl ''kill'' zu beenden. ''kill 5123'' beendet den Prozess 5123. Prozesse können mit ''top'' angezeigt werden und sind z.B. nach Rechenleitung sortiert.
=== Netzwerkschnittstelle aktivieren ===
sudo ifconfig eth0 up
im Verzeichnis gnuradio/gr-utils/src/python:
die FIFO Datei pipe erzeugen (einmalig)
mkfifo pipe
usrp2 in diese Pipe streamen lassen
usrp2_rx_cfile.py -f 10700000 -d 125 pipe
usrp2_rx_cfile.py -f 10700000 -s -d 250 pipe
(mit Strg + C abbrechen) - es wird in den FIFO geschrieben!
cat pipe | ../../../../baudline/baudline -reset -samplerate 400000 -channels 2 -quadrature -format le16 -stdin
cat pipe | ../../../../baudline/baudline -reset -samplerate 800000 -channels 2 -quadrature -format le16 -stdin
=== multimon: ===
make
cd multimon/bin-i686
./multimon
== Frequenzen ==
http://linuxreviews.org/man/fflush/
465,97MHz
466,23MHz
mitte auf 466,09 MHz stellen und mit 400000 sps (250er Decimation)
131,9MHz service channels aircrafts
392,775 MHz FSK Moduliert, hohe Bitrate, kleiner Hub
391,325MHz, 391,95MHz FSK
187,75MHz lokale Werbung?
182,25 MHZ ASK?
172,25MHz FM digital
168,725MHz digital 164,15
151,95MHz Digital
mit angehängtem Zeichen "&" das Terminal freigeben, und mit kill [pid] beenden
Anzeigen der pid mit ps
phyton und baudline sind die gestarteten Prozesse
FM Spektrum bei Sprache 3 Träger (oder Seitenbänder?)
99,2 MHz
99,49 MHz
12.629MHz: TAH
14.070 CW und Digimodes
Divider samplerate
250 400000
125 800000
100 1000000
50 2000000
sudo aptitude install gnuradio gnuradio-companion gnuradio-utils usrp python-usrp libgnuradio-usrp python-gnuradio-usrp
python-gnuradio-usrp
libgnuradio-usrp
python-usrp
FM-Demodulator (fm2.grc):
Die Abtastraten müssen vom USRP übers Filter und den FM-Demodulator (WBFM Receive) bis zur Soundkarte stimmen. Im Beispiel heißt das:
USRP2 bietet 100Msamples/s geteilt durch die Dezimierung an, also
100e6 / 125 = 800e3
Tiefpass dezimiert dieses Eingangssignal mit 5:
800e3 / 5 = 160e3
FM-Demodulator nimmt 160k als Quadraturrate und dezimiert die Audio-Ausgabe mit 5:
160e3 / 5 = 32e3
Die Soundkarte wird mit 32kHz angesprochen.
Hinweis: Bei "Device Name" im Audio Sink muss plughw:0,0 eingetragen werden, da sonst nur eine Sample Rate von 48kHz möglich ist, was ausgehend von 100Msamples/s nicht einfach zu erreichen ist.
Zur USRP2-Quelle:
"Frequency" wird auf die gewünschte Eingangsfrequenz eingestellt. Der FPGA im USRP mischt diese Frequenz herunter ins Basisband. Dort wird sie mit 100Msamples/s abgetastet, was auch fürs Gbit-Ethernet Interface zu viel ist. Daher wird noch einmal die Dezimierung verwendet, die einen Tiefpass-Charakter hat und das Signal auf einen übers Gbit-Ethernet transportablen Strom wandelt. Dieser kann dann weiterverwendet werden.
http://www.gnu.org/software/gnuradio/doc/howto-write-a-block.html
https://radioware.nd.edu/documentation
187,75 MHz (Oberwelle Radio FM?), Spiegelempfang (AM/FM Durchschlag!)
192,24 TV Bild
136 digitales Spektrum
195,7 abwechselnd analog und digitale modulation?
197,5 FM auslänisch
197,75FM auslänisch
221,75
233,55 digital
Pfeifen, 50Hz und ähnlihe Sachen
125
150
196,6
200
206,4
223,52
==== UHD ====
Einlesen: uhd_rx_cfile.py -f 10700000 -s pipe &
Baudline starten: cat pipe | ./baudline -reset -samplerate 1000000 -channels 2 -quadrature -format le16 -stdin
====== USRP2 ======
Um auszulesen, welche Hardware verfügbar ist:
* ''find_usrps''
* ''uhd_find_devices''
===== Umstieg auf UHD Treiber =====
Um auf die neuen UHD Treiber umzustellen, ist es nötig die SD-Karte mit den neuen Dateien zu beschreiben. Diese enthalten das Image für den FPGA und die Firmware. Der alte Treiber wird hier beschrieben: [[http://gnuradio.org/redmine/projects/gnuradio/wiki/USRP2UserFAQ]]. Infos zu dem neuen UHD Treiber: [[http://files.ettus.com/uhd_docs/manual/html/usrp2.html]], Beispielprogramme [[http://gnuradio.org/redmine/projects/gnuradio/wiki/HowToUse]]
Als Vorbereitung benötigt man:
* Die Dateien: [[http://files.ettus.com/uhd_releases/003_003_002/images-only/]] oder eine andere aktuelle Ausgabe von [[http://files.ettus.com/uhd_releases/]]
* ein SD-Laufwerk, prüfen, welche Bezeichnung die SD Karte hat: ''sudo fdisk -l'', in meinem Fall ''/dev/sdb''
* die GNURADIO Companion Umgebung mit UHD, damit folgender Befehl funktioniert:
cd /usr/local/share/uhd/utils
sudo ./usrp2_card_burner_gui.py
* Zunächst den Inhalt der originalen Karte sichern: ''sudo dd if=/dev/sdb of=~/sdcardusrp2_org.img''
* (Mit dem Befehl ''sudo dd if=~/sdcardusrp2_org.img of=/dev/sdb'' könnte der alte Inhalt wiederhergestellt werden.)
* Die Datei [[http://files.ettus.com/uhd_releases/003_003_002/images-only/UHD-images-003.003.002-release.zip]] oder eine neuere entpacken und im Verzeichnis ''/UHD-images-003.003.002-release/share/uhd/images/'' die Dateien ''usrp2_fpga.bin'' und ''usrp2_fw.bin'' extrahieren.
* Jetzt ''sudo /usr/local/share/uhd/utils/usrp2_card_burner_gui.py'' aufrufen
* Die 2 Dateien wählen und los gehts!
* Achtung hier könnte auch eine Festplatte oder Speicher überschrieben werden!
* {{:bildschirmfoto-usrp2_sd_card_burner.png|}}
* {{:bildschirmfoto-verbose.png|http://example.com|Externer Link}}
* Ups, hier gabe es einen Fehler, irgenwas mit der Unicode-Unterstürtzung, es gibt im SVN/GIT eine Änderung [[http://code.ettus.com/redmine/ettus/projects/uhd/repository/diff/host?rev=529297b97df9b9d928c30bb7cdb51f14f3fb3ab0&rev_to=60669a28d8862fd2a8ea324f947580485585b317&type=inline|1]], die mich inspirierte in Zeile 53 folgendes zu ändern [[http://docs.python.org/howto/unicode.html|1]] [[http://pastebin.com/9xF0Tazm|2]]:
# Zeile 53 in /usr/local/share/uhd/utils/usrp2_card_burner.py
# verbose = p.stdout.read().decode()
verbose = p.stdout.read().decode('utf-8')
* Jetzt klappt es:
$ sudo ./usrp2_card_burner.py --fw=/home/student/usrp2_fw.bin --dev=/dev/sdb
Burn firmware image:
32+0 Datensätze ein
32+0 Datensätze aus
16384 Bytes (16 kB) kopiert, 0,00756297 s, 2,2 MB/s
Verification Passed:
32+0 Datensätze ein
32+0 Datensätze aus
16384 Bytes (16 kB) kopiert, 0,0058502 s, 2,8 MB/s
$ sudo ./usrp2_card_burner.py --fpga=/home/student/usrp2_fpga.bin --dev=/dev/sdb
Burn fpga image:
1685+0 Datensätze ein
1685+0 Datensätze aus
862720 Bytes (863 kB) kopiert, 0,647275 s, 1,3 MB/s
{{:erfolg-verbose.png|}}
Verification Passed:
1685+0 Datensätze ein
1685+0 Datensätze aus
862720 Bytes (863 kB) kopiert, 0,0873257 s, 9,9 MB/s
* {{:erfolg-verbose.png|}}
==== Test ====
Zum Testen wird die SD Karte eingelegt, das USRP2 wieder mit Spannung versorgt. Die Netzwerkverbindung zum PC endet im PC an einer Gigabitkarte die auf eine IP-Adresse im Subnetz 255.255.255.0 eingerichtet ist. z.B. 192.168.10.1. Das USRP2 hat im UHD Treiber im Normalfall die 192.168.10.2. Nun sollte der Befehl ''uhd_find_devices'' eine erfreuliche Antwort liefern:
$ uhd_find_devices
linux; GNU C++ version 4.4.3; Boost_104000; UHD_003.004.000-287958b
--------------------------------------------------
-- UHD Device 0
--------------------------------------------------
Device Address:
type: usrp2
addr: 192.168.10.2
name:
serial: 252
Jetzt sollte das Beispielprogramm uhd_fft.py [[http://gnuradio.org/redmine/projects/gnuradio/wiki/HowToUse|1]] laufen, aber leider nicht:
RuntimeError: RuntimeError:
Please update the firmware and FPGA images for your device.
See the application notes for USRP2/N-Series for instructions.
Expected FPGA compatibility number 8, but got 7:
The FPGA build is not compatible with the host code build.
Also wiederholen! Ich hatte eine Datei vom November 2011 ausgewählt, nochmal mit den Dateien aus ''UHD-images-003.004.000-322fb97.zig'' dann, klappt es.