Arduino Pitch upptäckt algoritm (med AMDF) (1 / 8 steg)
Steg 1: Algoritmen
Credit:
Jag vet inte vem som uppfann algoritmen, men från vad google säger mig en brittisk statistiker av känt av George Udny Yule hade publicerat ett papper i sena 1800-talet med hänvisning till partiell autokorrelation algoritm. Dessutom där ett gäng publicerats av IEEE start i de tidiga 1900-tal med hänvisning till förbättringarna för bruk i elektronik.
AMDF - här är mager:
AMDF (N) = 1/N * summan (jag = 0 -> Nilsson) av (| x(i) - x(i+N) |)
AMDF (autokorrelation magnitud skillnaden funktion) är i grunden spårning överlappande linjer på ett visst fönster av prover. Här är vad som egentligen händer:
1.) samla data att bilda ett fönster av N * 2 prover wide.
2.) snitt fönstret i hälften.
3.) overlay första halvan över toppen av den andra halvan.
4.) ta det absoluta värdet av skillnaden i området mellan de två vågformerna och summera.
5.) dividera summan med antalet prover.
6.) upprepa steg 2 till och med 6 för en full svep av alla förseningar N som du förväntar dig att uppstå eller finnas i en vågform.
7.) om en kvasi harmonisk ton är närvarande, kommer AMDF utgång ett lågt nummer på eller nära 0 på viss försening N.
8.) klyfta prov frekvens av din försening N, och du har den mest troliga frekvensen av kvasi harmoniska tonen.
Ett stort notera dock! AMDF fungerar inte på mer än en ton i taget. Du kommer inte att kunna skilja mellan dubbla hållplatser, flera strummed anteckningar, etc.
Andra algoritmer:
Enligt min forskning har tagit mig, finns det ett par andra pitch upptäckt algoritmer där ute. Givetvis mer, men jag inte söka alltför stor utsträckning. Jag kommer inte att täcka dem men jag kommer att nämna dem höra för ytterligare forskning om du så önskar.
Naturligtvis, är den ursprungliga autokorrelation metoden ute som är grunden för AMDF. Fördelen med AMDF jämfört med grundläggande autokorrelation är att AMDF har en massa subtraktioner och tillägg med en division (som kan kodas in i en multiplikation). För Arduino Uno som infödda 8 bitars arkitekturen och inte har maskinvara division och multiplikation, är detta ett absolut plus.
En annan pitch upptäckt algoritm är Yin algoritmen. Denna algoritm har en mycket liten andel felfrekvens med varje steg i algoritmen beskriver dess effektivitet så att du kan implementera så mycket eller så lite du vill. Från omdömen läst jag om det inte är mycket arbetsintensivt vilket är bra! Så ja... Varför jag inte fick det finns eftersom Yin algoritmen har tydligen ett patent för dess användning. Dessutom, om du söker runt, har någon redan sammanställt källkoden för dig i C så att du kan leka med den. Det finns en publicerad papper på Yin algoritmen också, mycket intressanta saker.
Här är källkoden Yin, om du vill ta en titt!: http://mroy.chez-alice.fr/yin/index.html
Här är publicerade tidningen på algoritmen: http://recherche.ircam.fr/equipes/pcm/cheveign/pss/2002_JASA_YIN.pdf