Sida 1 av 2
Frekvensmätning med PIC18 ?
Postat: 16 december 2005, 20:54:18
av JimmyAndersson
*PIC18LF2320, 40MHz*
Ungefär som rubriken lyder:
Jag skulle vilja mäta frekvensen på en ton med en PIC.
Vill mäta frekvenser mellan 300Hz och 4kHz. Varje mätning får göras så snabbt det går, men max med 500ms mellanrum mellan mätningarna.
Är det möjligt?
Ungefär hur gör man?
Postat: 16 december 2005, 21:18:25
av lgrfbs
Tycker att det varkar vara ett jobb för AD ovandling.
Idé terori:
Kolla AD värdet 100 gånger
Räkna ut medelvärdet
klart
Postat: 16 december 2005, 22:59:18
av Kaggen
Tja! Du skulle ju även kunna använda de digitala ingångarna om man förutsätter att en period varierar mellan c.a. 0V och 5V.
När sinusvågen (eller vad du nu har för insignal) stiger över gränsvärdet för en 1:a på t.ex. RA1 på PORTA så sätter du det som en period i en variabel och plussar sedan på med 1 varje gång RA1 skiftar från 0 till 1.
Sedan är det bara räkna pulserna över en viss tidsperiod, säg 10ms, och sedan multiplicera resultatet med 100 (eftersom 10ms går 100 ggr i en sekund), så får du frekvensen i Hz.
Postat: 16 december 2005, 23:33:19
av sodjan
Kör en timer som "counter".
Det är det den är till för...
Postat: 17 december 2005, 01:08:20
av JimmyAndersson
Bra tips!
Nu har jag lite att jobba med. Tack!
Postat: 17 december 2005, 14:29:35
av Chribbe76
Om tonen är enkel som sinus eller fyrkantvåg så går det bra att göra som grabbarna ovan beskriver.
Men toner från div musikinstrumet svänger mer komplicerat och passerar ofta 0 fler än 2 gånger/period.
Värsta tänkbara är att mäta frekvensen på en röst (kan passera 0 typ 16gr/period).
Postat: 17 december 2005, 15:02:15
av jack
Hur skulle man då göra för att mäta en ton från tex en gitarr? Hur funkar en vanlig stämmapparat?
Två toner från min aukustiska gitarr, E och A:

Postat: 17 december 2005, 15:11:07
av Chribbe76
Ja, den övre ljudkurvan passerar 0 8gr/period.
Och den har 2 toppar/period som är lika höga.
Jag skulle åxo vilja veta hur en stämmapparat fungerar.
Postat: 17 december 2005, 17:18:46
av JimmyAndersson
Tanken är just att bygga en stämmapparat.
Sedan kan man använda samma frekvensmätning till att bygga en MIDI-gitarr.
Tänker högt:
Men om man komprimerar ljudet och låter det passera en schmitt-trigger så det blir mer fyrkantvåg? Den kurvan borde bli lik en pwm-signal...
Bara en tanke som sagt.
Postat: 17 december 2005, 17:28:50
av sodjan
Den har väll ett antal (6 t.ex) smala notch filter för de olika
tonerna (=strängarna). Andra frekvenser är ju helt ointressanta...
Om det är en (ren) sinus som Jimmy vill mäta så får man väll
förstärka och klippa.
Postat: 25 februari 2006, 13:42:43
av sm5uiu
Frekvensmätning utförs enkelt (vid låga frekvenser) med den inbyggda komparatorn. Annars får man använda en pic timer som klockas externt. Till denna krävs dock (om du inte har logiska nivåer) en liten förstärkare som driver insignalen till saturation.
73 de Sam
Postat: 25 februari 2006, 18:22:43
av Henrik
Hur vore det att sampla med a/d, för att sedan göra fft (fast fourier transform) på signalen?
Postat: 25 februari 2006, 19:45:11
av $tiff
FFT funkar ju faktist på en PIC18, men prestandan är begränsad. Frågan är om det går att göra det snabbt nog för att på ett spektrum runt kilohertzen.
http://www.microchip.com/stellent/idcpl ... e=en011084
Kolla in den här:
http://www.circuitcellar.com/library/pr ... oste98.pdf
Postat: 25 februari 2006, 20:27:38
av Marta
Skall Du stämma ett instrument är det enklaste att alstra rätt ton och sedan nollsväva strängen mot denna. Mycket enklare än att läsa av fladdrande siffror.
Postat: 25 februari 2006, 20:39:51
av RDX*
vanlig FFT ger väldigt dålig upplösning i dessa sammanhang.
Det du ska använda dig av är autokorrelation eller AMDF (average magnitude difference function).
Autokorrelationen beräknar du genom:
Ryy(l)=sum( r(k) *r(k+l) ) där k är vektorindex och l är en förskjutning
Ryy kommer ge en vekor med korreketionen mellen signalen och signalen själv med en förkjutning. Detta innebär att du kommer få ett maximum vid den förskjutning som motsvarar din pitch.
En troligtviss bättre metod är AMDF som jobbar med differenser i stället.
AMDF(l)=sum( r(k) - r(k+l) ) där k är vektorindex och l är en förskjutning
AMDF fungerar på nästan samma sätt men nu får du ett minimum istället för et max. AMDF är lite lättare att tänka hur den fungerar.
om du har en period på 20 sample så kommer du få AMDF(20) = r(k) -r(k+20). Efter som du är inne på en ny period nu så kommer du att få noll (idealt). Jag har själv testat AMDF i både matlab och i en DSP, och det fungerar bra. Säg bara till om du vill ha mer förklarat eller vill ha matlab-filer på AMDF/autokorr.