Étape 4: décoder l’audio
Donc, maintenant nous avons un tas d’audio sur notre dispositif. Comment nous décoder ? J’ai basé mon code sur un Android tutoriel qui montre comment enregistrer des données et puis il lit. Dans mon cas, j’ai fait en sorte d’enregistrer que l’audio 16 bits PCM encoded. J’ai goûté à 44100hz. Sur Android (et d’ailleurs, je suppose) données PCM 16 bits signifie que chaque échantillon est une valeur signé 16 bits. Puisque nous nous préoccupons seulement la fréquence, nous avons seulement besoin de soin sur combien de temps il y a entre "passages à zéro". Un passage à zéro est lorsque le signal passe de positif à négatif ou vice versa. Un bit 0 sera représentée par l’espace entre 2 passages, et un 1 aura un passage supplémentaire à peu près la même période.Données de la carte dans chaque piste commencent avec un nombre (variable) de 0, pour établir la fréquence de base. Ce que je faisais était écoutez pour le premier échantillon dépassant un certain seuil « calme », puis comptez le nombre d’échantillons entre les passages à zéro. Ce nombre devient la valeur de base pour un 0. Ces cartes étant glissée à la main, les fréquences réelles quelque peu changera dès le début de l’analyse à la fin. Alors, j’ai fait une méthode simple qui détermine si le nombre d’échantillons depuis le dernier passage à zéro est plus proche de la fréquence de base ou de deux fois la fréquence de base (la base moitié des échantillons). Il ajuste alors la fréquence de base prévue en conséquence. Cela fonctionne bien, tant que les changements entre les deux bits logiques sont assez faibles. Et ils seront presque certainement.
Pour détecter un passage à zéro, il faut regarder le signe de chaque échantillon et de le comparer au signe de l’exemple précédent. S’ils diffèrent (une positive, une négative) puis le signal traverse 0 entre ces échantillons.
L’algorithme de base est de parcourir le tableau d’octets, extraction des échantillons. Compter le nombre d’échantillons entre les passages à zéro et comparez le nombre le nombre prévu pour un 0 ou 1.
Bon, après quelques main-ondulation, nous avons maintenant une séquence binaire des données, que nous voulons faire demi-tour en ASCII. L’encodage plus courantes (et le seul que j’ai écrit un gestionnaire pour) encode chaque caractère comme un certain nombre de bits, plus un bit de parité. Dans le cas de la piste 2, c'est-à-dire 4 bits pour le personnage et 1 pour la parité, faire des groupes de 5 bits. Les morceaux sont lus dans moins significatif pour la plupart, avec le bit de parité dernière. Le bit de parité est placée pour faire le nombre de 1 dans le groupe impair. Dans mon implémentation, j’ai juste ignorer le bit de parité, mais il serait utile de déterminer si la lecture était bonne ou pas. En piste 1, c’est 6 bits pour le personnage, ainsi que la parité.
Le jeu de caractères des titres diffèrent trop, mais les deux sont des sous-ensembles d’ASCII avec un décalage. Dans le cas de la piste 2, qui n’encode certains symboles et des chiffres, le jeu de caractères commence à 48, qui est le code ASCII pour "0". Donc si nous obtenons 0,0,0,0,1 comme notre caractère, nous transformer qui en 0, ajouter 48 et obtenir 48. De même, 1,0,0,0,0 est 1. 1 + 48 = 49 = ASCII « 1 ».
Pour la voie 1, le jeu de caractères commence par "" (espace) qui est ASCII 32. Alors nous avons ajouter 32 à la valeur numérique décodée et obtenir notre caractère ASCII. Après cela, nous avons les données, donc tous que le reste est accrocher la colle de l’interface utilisateur.