====== 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.