TP : Réalisation d'un désobfuscateur audio

Le but de ce TD est de réaliser dans un FPGA le décodage d'un flux audio encodé selon une méthode bien connue des chaînes de télévision françaises : le retournement de spectre. La méthode "d'obfuscation" du son employée dans le système de codage correspond à une inversion du spectre autour d'une fréquence porteuse par modulation d'amplitude (en multipliant le signal temporel par une sinusoïde).

Le décodage s'obtient en renouvelant l'opération de modulation et en filtrant les fréquences indésirables. Dans la pratique, il s'agit simplement de multiplier le signal entrant par une sinusoide de la fréquence de référence.

 

Inversion de spéctre

 

Pour ce TP nous manipulerons des signaux audio numériques échantillonnés à la fréquence de 48KHz. Chaque échantillon est codé sur la forme d'un nombre signés sur 16 bits.

Nous procéderons en deux temps : 

  1. réalisation d'un décodeur avec une fréquence d'inversion de 12kHz
  2. réalisation d'un décodeur avec une fréquence d'inversion de 12.8kHz (toute ressemblance avec une chaîne réelle ne serait que pure coïncidence)

Le flux audio

Sur la carte DE2 se trouve un circuit appelé CODEC. Il est en charge de :

  • numériser un flux audio analogique qui arriverait sur la carte par la prise jack LINE_IN (bleue) ou MIC (ROSE),
  • produire un signal audio analogique sur la prise LINE_OUT (verte, sur laquelle on pourra brancher un casque de baladeur) à partir d'échantillons numériques.

La première étape est faite par un ADC (Analog to Digital Converter), la deuxième est faite par un DAC (Digital to Analog Converter). En plus de l'ADC et du DAC, le circuit intégré contient pas mal de filtres et un bus permettant de régler les volumes, choisir la source d'entrée, etc..

Nous vous fournissons (voir pièce jointe) un module qui se charge de configurer le CODEC de la façon suivante :

  • Le son d'entrée est sur LINE_IN (prise bleue), avec un gain de 1 (0dB).
  • Le gain de la sortie (le volume) est de 0dB.
  • L'ADC produit deux flux de données, un pour la voie gauche l'autre pour la droite, à un rythme de 48k échantillons par seconde (48kHz).
  • Le DAC attend qu'on lui fournisse deux flux (un par voie) au même rythme (48kHz).
  • Chaque flux est codé en CA2 sur 16 bits :
    • les données sont donc de type logic signed [15:0] et
    • les entrées sont de type  input logic signed [15:0] 
    • les sorties sont de type  output logic signed [15:0]
  • Un signal (audio_data_enable) passe à 1 pendant 1 cycle de l'horloge aud_mclk  pour indiquer qu'un nouvel échantillon est disponible sur l'entrée adc_data_r/l et que l'échantillon présent sur dac_data_r/l vient d'être envoyé au DAC.

La seule horloge qu'on utilisera est aud_mclk (à l'intérieur du module descrambler, elle est appelée clk), qui est une horloge à 12MHz.

 

horloge et enable du flux audio

 

Préparation des maquettes

  1. Mettez en marche la maquette avec le contenu du FPGA par défaut.
  2. Branchez votre casque sur la prise verte de la maquette (LINE_OUT). Important : NE POSEZ PAS  TOUT DE SUITE LE CASQUE SUR VOTRE TÊTE !
  3. Appuyez sur le bouton n°1 (key1) : vous devez entendre un gros sifflement dans le casque. C'est pour cette raison qu'il ne faut pas l'avoir sur les oreilles à ce moment là. 
  4. Lâchez le bouton, le sifflement doit s'arrêter.
  5. Synthétisez le projet que nous avons préparé, puis téléchargez le FPGA
  6. Reliez par le cordon jack-jack la prise bleue de la maquette (LINE_IN) à la sortie son de votre PC (en façade, la prise avec l'icône de casque)
  7. Faites jouer un fichier son par le PC (youtube, mp3, ...)
  8. Vérifiez que vous entendez dans le casque le son prévu. Si ce n'est pas le cas, cliquez sur l'icône haut-parleur en haut à droite du bureau, et vérifiez que "sourdine" n'est pas coché et que le volume est au maximum.

C'est bon, vous pouvez commencer à travailler.

Première étape

  1. Réalisez la multiplication du flux d'entrée par une sinusoïde à 12kHz. Vous pouvez tester votre décodeur avec l'un des fichiers disponibles en attachement à cette page (prendre ceux à 12kHz...)

Deuxième étape

En fait, nous avons  un peu triché : la vraie fréquence utilisée d'habitude est 12.8kHz. Nous avons commencé par 12kHz car c'était beaucoup plus simple.

Réalisez maintenant une inversion de spectre par rapport à une fréquence de 12.8kHz (on prendra le même filtre de sortie qu'à l'étape précédente). Si vous avez besoin de générer des tables de constantes, vous pouvez utiliser tout langage ou outil à votre convenance (Java, C, Matlab, Excel...). Vous pourrez tester votre décodeur avec l'un des fichiers disponibles en attachement à cette page (prendre ceux à 12.8kHz...).

Bravo, vous avez maintenant un décodeur audio D+ fonctionnel. Reste l'image, mais c'est une autre histoire...

 

SystemVerilog et les nombres signés

Les échantillons venant du codec son signés (en CA2), ceci doit être pris en compte dans la déclaration des signaux permettant des les manipuler

Par défaut, les vecteurs de bits déclaré comme logic[i:0] sont considérés comme des nombres non signés. Les opérations arithmétiques ainsi que les opérations de comparaison arithmétique les interpréteront comme des nombres non signés.

Pour pouvoir faire de l'arithmétique sur des nombres signés il faut utiliser le mot clé signed au moment de la déclaration.

logic signed [3:0] A,B;
logic c;
always@(*) A <= 4'b1111;
always@(*) B <= 4'b0000;
always@(*) c <= ( A > B );  // c vaut 0 car A est interprété comme un nombre signé
                            // c-à-d A vaut -1 et B vaut 0