Stap 4: decoderen de audio
Dus, nu hebben we een bos van audio op ons apparaat. Hoe we het decoderen? Ik mijn code gebaseerd op een Android tutorial die laat zien hoe gegevens vastleggen en vervolgens afspelen. In mijn geval zorgde ik ervoor dat de audio opslaan als 16-bits PCM gecodeerd. Ik bemonsterd op 44100hz. Op Android (en elders, die ik veronderstel) 16-bits PCM gegevens betekent dat elk monster een ondertekende 16 bit-waarde is. Aangezien wij alleen de zorg over de frequentie, moeten we alleen zorg over hoeveel tijd er is tussen "nul-kruisingen". Een nul-kruising is wanneer het signaal van postive naar gaat negatief of omgekeerd. Een 0-bit zal vertegenwoordigd worden door de ruimte tussen 2 kruisingen, en een 1 krijgen een extra Overstekende in ongeveer dezelfde periode.Kaartgegevens in elk nummer begint met een (variabel) aantal 0s, om de basisfrequentie. Wat ik deed was luisteren voor de eerste steekproef boven een bepaalde drempel van de "stille", dan tellen het aantal monsters tussen nul-kruisingen. Dit nummer wordt de basiswaarde voor een 0. Aangezien deze kaarten hand-gejat, verandert de werkelijke frequenties enigszins vanaf het begin van de scan tot het einde. Dus maakte ik een eenvoudige methode die bepaalt of het aantal monsters sinds de laatste nul-kruising dichter bij de basisfrequentie of tweemaal de Basisfrequentie (halve basis hetaantal monsters is). Het past dan de verwachte basisfrequentie dienovereenkomstig. Dit werkt prima, zo lang als de veranderingen tussen elke twee logische bits vrij klein zijn. En zij zullen bijna zeker.
U wilt het opsporen van een nul-kruising, moeten we kijken naar het teken van elk monster en te vergelijken met het teken van het vorige voorbeeld. Als ze verschillen (één positief, een negatief) stak het signaal 0 tussen deze monsters.
Het fundamentele algoritme is doorlopen van de byte-array, winning van monsters. Tellen van het aantal monsters tussen nul-kruisingen en vergelijken van de telling aan het verwachte aantal voor een 0 of 1.
Oke, na enkele hand-golft hebben we nu een binaire reeks van gegevens, die we willen terug te zetten in ASCII. De meest voorkomende codering (en de enige die ik schreef een handler voor) codeert elk teken als een aantal bits, plus een pariteitsbit. In het geval van spoor 2, dat is 4 bits voor het teken, en 1 voor pariteit, 5 bit groepen te maken. De bits worden gelezen uit minst significante voor de meeste, met het pariteitsbit laatst. De pariteitsbit wordt ingesteld op het aantal 1s maken in de groep oneven. In mijn uitvoering, ik gewoon negeren de pariteitsbit, maar het zou helpen bepalen of het lezen of niet goed was. In nummer 1 is het 6 beetjes voor het teken, plus de pariteit.
De tekenset van de tracks te verschillen, maar beide zijn deelverzamelingen van ASCII met sommige offset. In het geval van spoor 2, waarin alleen worden gecodeerd sommige symbolen en cijfers, begint de tekenset op 48, wat de ASCII-code voor "0". Dus als we 0,0,0,0,1 als ons karakter krijgen, we dat omzetten van 0, voeg 48, en 48. Ook is 1,0,0,0,0 1. 1 + 48 = 49 = ASCII "1".
Nummer 1, de tekenset die begint met "" (spatie) die is ASCII 32. Dus we 32 aan de gedecodeerde numerieke waarde toevoegen en krijgen onze ASCII-teken. Na dat hebben we de gegevens, zodat alle dat blijft de UI lijm is aansluiten.