Stap 4: Gegeneraliseerde toonhoogte detectie
In principe was wat ik deed kiezen een spanning die ik heb altijd geweten zou in de grenzen van mijn Golf (2.5V). Dan bekeek ik elke keer de Golf gekruist dit niveau met een opwaartse helling, laten we noemen deze "drempel gebeurtenissen". Als dit meerdere keren in één cyclus dat ik koos de drempel evenement met de grootste helling gebeurde naar het begin van mijn cyclus. Vergelijkbaar met de laatste stap, gebruikte ik een variabele met de naam "tijd" (verhoogd met een snelheid van 38,5 kHz) voor het meten van de tijd tussen gebeurtenissen drempel en opgeslagen is dit een matrix genoemd timer []. Ik ben ook opgenomen de helling op elk van de gebeurtenissen van de drempel in een array genaamd helling []. Toen ik vergeleek de elementen van de timer [] en helling [] om erachter te komen waar er was een match. Zodra een overeenkomst is gevonden, ik de elementen van de timer [] om de duur van de cyclus te bepalen bij elkaar opgeteld en stuurde deze waarde naar een globale variabele met de naam "periode." Dan in de functie van de belangrijkste loop (alle stappen die heb ik zojuist beschreven gebeuren in de ADC interrupt routine) gebruikte ik de waarde van de periode wordt berekend van de frequentie en uitprinten. Ik moet hieraan toevoegen dat ik een variabele in de code genaamd "noMatch" die me geholpen om te beslissen dat het te lang was geweest aangezien ik een goede match had en dat ik moet alleen het heropnemen van de elementen van timer [] en helling [].
Bij het schrijven van dit dacht ik over een heleboel mogelijke scenario's die kunnen breken het algoritme. De lastigste Golf in mijn gedachten is een welke passeert de 2.5V drempel vele malen in één cyclus op soortgelijke hellingen en ook langs de cyclus wordt gespreid. Ik heb je een golf als dit, moet je slopeTol zeer laag (0-3) en misschien vindt u dat verlagen timerTol (tot 5 misschien) bijhouden helpt de Golf correct. Ook, als u wilt meten van golven met zeer steile hellingen (zoals pulse golven) moet stelt u de waarde van slopeTol tot 100 of zelfs helemaal tot 256 om bij te houden van hen beter.
Over het algemeen dit stukje code lijkt zeer goed om veel shapes, kunt u enkele van mijn resultaten in de bovenstaande foto's. Het inkomend signaal wordt weergegeven in het geel en de drempel-evenement dat is het bijhouden van de Arduino wordt aangegeven door een puls van pin 12 (blauw).
//generalized wave freq detection with 38.5kHz sampling rate and interrupts //by Amanda Ghassaei
Ook voegde ik een beetje van code om te stoppen met het berekenen en frequentiegegevens afdrukken wanneer de amplitude van de Golf onder een bepaald niveau valt. (Als er weinig of geen signaal vervolgens de bovenstaande code soms spuugt een bos van vuilnis). Hier is het:
//generalized wave freq detection with 38.5kHz sampling rate and interrupts //by Amanda Ghassaei