Apprendre la radio GNU avec un microphone



Un article précédent sur SDR et GNU Radio a montré que le sujet est intéressant pour la communauté. Étant donné qu'il n'y a presque aucune information sur le paquet GNU Radio en russe, et que tout n'est pas clair en anglais, j'ai décidé de décrire mes expériences avec GNU Radio.

À propos de SDR et GNU Radio, j'ai déjà écrit dans un article précédent . Permettez-moi de vous rappeler que mon objectif est de montrer comment intercepter et même émettre un signal radio pour contrôler les appareils domestiques intelligents (et en fait l'IoT). Je considère qu'il est important d'attirer l'attention sur la sécurité dans l'IoT. Mais c'est encore loin ... Pour commencer, il faudrait que je traite avec GNU Radio!

Tout le monde n'a pas de récepteur SDR, et il me semble qu'il serait utile de montrer ce qui peut être fait avec GNU Radio avec ce que tout le monde a - à savoir le microphone et les écouteurs de votre PC.

Sous la coupe, quelques exercices intéressants avec le son.

Sons autour


Commençons donc par un simple: étudier le spectre des sons autour. Nous supposons que vous avez installé le paquet GNU Radio ou lancé l'image Ubuntu / Windows préparée avec GNU Radio. Sinon, téléchargez une image basée sur Ubuntu depuis le site Web de GNU Radio .

Commençons par créer un projet de capture de microphone simple. Pour ce faire, ajoutez le bloc Audio Source, définissez samp_rate 48000 (de nombreuses cartes fonctionnent à 44100 Hz et non à 48000 Hz).

Vous pouvez connaître la limite de votre carte sous Linux comme ceci:
$ pactl list short sinks
0	alsa_output.pci-0000_00_03.0.hdmi-stereo	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED
1	alsa_output.pci-0000_00_1b.0.analog-stereo	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED

La question se pose immédiatement: pourquoi 48 kHz? Après tout, disent-ils, nous entendons des détails jusqu'à 20 kHz, et ce n'est pas tout.
--, , 2 . , 24 — . .

48 44.1 — . , CD. .

Revenons à notre programme GNU Radio. Connectez la source audio WX FFT. N'oubliez pas de remplacer l'interface graphique QT par l'interface graphique WX dans top_block, ainsi que de changer le type d'entrée sur Float. Et maintenant, nous allons courir dans l'appartement, en faisant des sons différents. La physique scolaire nous a beaucoup dit sur ce que nous allons voir, mais tout cela est oublié, et c'est toujours plus intéressant de voir de ses propres yeux que de lire dans un manuel.

La première chose que nous verrons, c'est que rien n'est visible! Toute la partie significative du spectre est concentrée dans les 2 ou 3 premiers kHz. Eh bien, ok, ajoutons un nouveau bloc entre la source et WX FFT: Rational Resampler - il vous permettra de changer la fréquence d'échantillonnage, ne laissant que la bonne partie du spectre. Pour plus de commodité, nous allons créer un nouveau bloc variable (variable), appeler resamp et définir la valeur, par exemple, 15. Dans le bloc rééchantillonneur dans le champ Décimation, entrez le nom de cette variable. Maintenant, un signal avec un taux d'échantillonnage égal à samp_rate / resamp, c'est-à-dire dans ce bloc, dans le champ Sample Rate, vous devez insérer cette expression. Maintenant, notre signal s'étendra à 1,5 kHz, ce qui est déjà mieux. Eh bien, maintenant tout est visible!

Alors, commencez par une note pour 440 Hz. Vérifiez la fréquence de votre voixpropreté. Immédiatement une découverte intéressante (je vous rappelle, nous devons le savoir de l'école): nous publions non pas une fréquence, mais un ensemble de fréquences multiples - tonalité et harmoniques. Quiconque a un piano ou un autre instrument à la maison, vous pouvez les essayer. C'est ainsi que la note de la première octave ressemble à un piano.



Mais pour la petite octave. Tout est comme dans le manuel - il y a 2 fois plus de pics, le plus bas pic est devenu 2 fois plus bas (220 Hz)



Les fréquences multiples ne sont pas présentes au hasard. En effet, dans le cas d'un piano / guitare / ... (cordes) le son est extrait par la vibration de la corde. Et la chaîne a deux extrémités fixes, c'est-à-dire seuls les modes avec une grande longueur d'onde λ / 2 = L * n peuvent être émis, où n = 1,2,3 ...

De même avec la voix. Les ligaments vous permettent de modifier les caractéristiques du larynx, qui agit comme un résonateur (pardonnez-moi les amateurs d'anatomie pour les noms inexacts). Encore une fois, les murs sont fixes, il y a des points nodaux aux vibrations, c'est-à-dire encore une fois la même formule pour les modes excités.

Et maintenant, applaudissons:


(bleu - le spectre du "silence", vert - le spectre du coton)

Oh, ici toutes les fréquences sont visibles (faites attention à l'échelle de fréquence et au niveau du signal par rapport aux graphiques ci-dessus!). C'est logique, car le coton est une augmentation de pression à court terme (très forte), c'est-à-dire presque δ-fonction, et son spectre contient toutes les fréquences.

Il peut être utilisé d'ailleurs. Qui se souvient des années 90 de ces porte-clés pour trouver des clés qui ont commencé à faire du bruit quand ils ont sifflé? C'était une chose pratique. Ils ont donc également réagi au coton, car dans le son du coton, il y a aussi une fréquence correspondant au sifflement.

Spectre alphabétique


Écoutons-nous maintenant. Dites différentes lettres de l'alphabet et regardez le spectre (de préférence sans rééchantillonnage, pour voir quelles fréquences sont utilisées dans la plage de 0 à 20 kHz). Une personne utilise plusieurs types de génération sonore: labiale (à commencer par l'ouverture des lèvres, ce qui crée de nombreuses fréquences à la fois), larynx, dentaire, lingual et nasal. Les sifflements et les sifflements sont particulièrement intéressants (ce sont le larynx et la dent) - leur spectre est très large et se situe principalement dans le spectre> 2,5 kHz (pour le son "c" même> 5 kHz). Cela explique pourquoi les mots avec ce son sont difficiles à entendre sur le téléphone (dans le passé, la bande passante était à 3 kHz ou même plus bas - essayez d'ajouter un filtre passe-bas et envoyez le résultat à Audio Sink avec un casque - le résultat ressemblera à un bon vieux téléphone filaire).

Qui a des enfants, écoutez-les - ils sont beaucoup plus forts, leur voix contient de nombreuses hautes fréquences. C'est pourquoi leur voix au téléphone est toujours étrange, et il est souvent tout simplement impossible de les comprendre (la distorsion de la voix est beaucoup plus grande que celle d'un adulte).

Au fait, j'ai essayé de tirer la note la plus haute de moi. Eh bien, je ne l'ai pas pris au-dessus de 700 Hz. Le fils a pris 1200 Hz! Je ne m'attendais pas à une telle limitation de ma part - c'est moins de 5% du spectre que j'entends. Je me sentais défectueux ...

Parlez aux dauphins


Bon, ok, on ne peut pas sonner si haut, alors utilisez ce groupe pour un autre. Essayons maintenant de faire une transmission vocale par ultrasons. Nous mettons un filtre passe-bas (passe-bas) après le bloc Audio Source, multiplions par le cosinus de 15 kHz (transférant ainsi notre signal 15 kHz plus haut) et l'envoyons au haut-parleur (il s'en sort comme ça). Mais un tel fichier peut être écrit à l'aide de File Sink. Après avoir perdu un tel fichier, un auditeur tiers ne pourra pas analyser ce qui y est dit. Jeu d'espionnage au niveau 2.



Maintenant, faisons le contraire - nous allons restaurer le signal codé. Un microphone d'ordinateur portable ordinaire n'accepte pas bien les hautes fréquences, mais à partir d'un fichier, c'est facile (pour nos tests, c'est suffisant). La voix après la récupération est très bien reçue.



De cette façon, vous pouvez même transférer des données: iciUn exemple d'interface réseau basée sur la transmission ultrasonore .

Cet exemple montre que vous pouvez faire beaucoup avec GNU Radio et une carte son!

Présentation des unités radio GNU


GNU Radio a beaucoup de blocs différents, et les trier n'est pas facile. Et le plus difficile est de comprendre ce qu'il y a du tout. Ci-dessous, je ne donnerai que les blocs les plus populaires utilisés "dans la vie quotidienne".

Opérations mathématiques:

Ajouter - addition de deux signaux
Mulitly - multiplication de deux signaux (par exemple, pour AM)
Ajouter Const - ajouter (soustraire) une constante (par exemple, lors de la démodulation de AM supprimer la composante DC)
Multiply Const - multiplier un signal par une constante (pour l'amplification, par exemple)
Char / Integer / Float / Complex to Char / Integer / Float / Complex - conversion de type de données

Sources:

Source constante - une source qui produit toujours la même valeur
Source de signal - une source qui produit un signal sinusoïdal (pour un signal synthétique)
Source / récepteur audio - capture à partir d'une carte son ou sortie vers elle
Source / récepteur de fichier - lu à partir d'un fichier (utilisez restrictions sur la vitesse de lecture à la fréquence d'échantillonnage souhaitée) et écrire dans le
fichier Wav File Source / Sink - lire / écrire le fichier WAV
TCP / UDP; Source / Sink - la possibilité d'ancrer le projet avec un logiciel réseau via TCP ou UDP
osmocom Source / Sink sockets - recevoir des données de RTL-SDR ou HackRF One ou transmission (pour HackRF One)
Source vectorielle - source d'une séquence de nombres

Filtres et modulation:

Filtre passe-bas / haut / passe-bande - filtres basse fréquence / haute fréquence / passe-bande
Filtre FIR de fréquence Xlating - combine le décalage de fréquence et le filtre passe-bas pour sélectionner la bande de fréquence souhaitée
AM / FM / GFSK / ... Mod / Demod - divers modulateurs et démodulateurs

Échantillonnage:

Rational Resampler - vous permet de convertir la séquence entrante d'échantillons d'une fréquence d'échantillonnage à une autre par décimation et interpolation (utilisée pour «s'adapter» à la fréquence d'échantillonnage souhaitée)
Throttle - limite la vitesse de soumission des échantillons à la fréquence d'échantillonnage souhaitée (s'il n'y a pas de blocs dans le projet qui limitent la vitesse traitement)
Retard - retarde le flux au nombre désiré de comptes

UI:

WX GUI FFT Sink - sortie graphique du spectre du signal
WX GUI Waterfall Sink - sortie de la puissance spectrale en mode "cascade" (le long de l'axe X - fréquence, le long du temps Y, Z (couleur) - amplitude). Utile pour trouver la fréquence de rayonnement d'une source rarement émettrice dans une plage donnée
WX GUI Constellation Sink - affiche le diagramme de phase du signal (différence de phase entre les oscillations des parties réelle et imaginaire du signal)
WX GUI Scope Sink - oscilloscope

Divers:

Variable - une variable qui vous permet d'utiliser des variables au lieu de nombres dans une variété de blocs de
sélection - un multiplexeur, en combinaison avec WX Slider vous permet de "mettre en
/ hors " les entrées et sorties Pack / Unpack K bits - convertit de 0/1 octets en une séquence de K bits et vice versa à partir de octets dans une séquence d'octets 0/1, correspondant à des bits (pratique pour le codage / décodage de paquets - les octets 0/1 peuvent être multipliés par la porteuse, par exemple)

Que devez-vous savoir d'autre sur le GNU Radio Companion (GRC)?


Tous les blocs du GRC qui ont des entrées ou des sorties nécessitent une définition de type de données. Le type de sortie d'un bloc doit être le même que le type d'entrée du bloc qui lui est associé. La sortie d'un bloc peut être transférée vers plusieurs blocs (c'est-à-dire dessiner plusieurs liens). Mais un seul flux peut entrer une entrée!

La plupart des blocs ont une documentation minimale dans l'onglet de la fenêtre des paramètres, ainsi que dans les notes de bas de page des paramètres. Bien que ce ne soit généralement pas suffisant. Un quai un peu dépassé est ici .

Tous les paramètres de bloc peuvent être des expressions Python. C'est-à-dire au lieu d'un nombre, vous pouvez remplacer une formule par la participation de variables définies par des blocs de variables.

Souvent, vous souhaitez «tordre» les paramètres du projet en modifiant les valeurs des variables. Pour ce faire, utilisez le curseur WX ou un composant d'interface utilisateur similaire, en utilisant son nom au lieu de la variable souhaitée. Après le démarrage du projet, un curseur apparaîtra dans l'interface utilisateur. Ceci est pratique pour régler les paramètres de fréquence ou de filtre.

Les erreurs dans le type de liens ou dans les paramètres de bloc sont surlignées en rouge. Ils bloquent également le lancement du projet (dans les paramètres du bloc surligné en rouge, vous pouvez lire le problème). Il y a des erreurs d'exécution qui apparaissent même lorsque le projet démarre - le journal en bas de la fenêtre GRC vous dira quel est le problème.

Certains blocs nécessitent un entier comme paramètre. La substitution de formule peut entraîner une incompatibilité de type. Utilisez la fonction Python int () pour convertir en un entier.

Pour désactiver le blocage, utilisez Désactiver / Activer. Cela permettra de ne pas supprimer le bloc, mais simplement de l'exclure du projet pendant un certain temps en enregistrant tous les paramètres saisis.

Tous les schémas de GRC sont convertis en scripts Python, ce qui vous permet de les modifier plus tard, ainsi que d'automatiser certains processus en contournant GRC.

Il est souvent pratique d'enregistrer un signal sonore / radio dans un fichier pour une analyse plus approfondie. Pour ce faire, utilisez le bloc récepteur de fichiers. Veuillez noter que lors de la lecture d'un fichier, vous devez vous souvenir du format de données utilisé lors de l'écriture (type de nombre), ainsi que de la fréquence d'échantillonnage. Je recommande d'inclure ces valeurs dans le nom du fichier en plus de la description du signal enregistré lui-même - cela vous permettra de vous rappeler comment le lire plus tard.

Lors de la lecture à partir d'un fichier, veillez à utiliser le bloc Throttle pour limiter la vitesse de lecture. Cela n'est pas nécessaire s'il existe un autre bloc dans le circuit qui limite physiquement la vitesse de lecture des données. Par exemple, le bloc Audio Sink limite la vitesse des données qui lui sont fournies, comme spécifié dans ses paramètres de fréquence d'échantillonnage.

Utilisez l'icône de la loupe dans la barre d'outils pour trouver le bloc dont vous avez besoin. Double-cliquez sur le nom dans la liste des blocs disponibles pour ajouter le bloc au projet. Au lieu de cela, vous pouvez le faire glisser de la liste vers l'emplacement souhaité dans le projet.

Essayez de placer facilement des blocs dans le projet. Cela n'affecte rien d'autre que la lisibilité.

J'espère que cet article encourage quelqu'un à expérimenter le son.

Source: https://habr.com/ru/post/fr393713/


All Articles