Spørgsmål:
Maksimal prøvehastighed for Arduino Duemilanove?
Sketchy Fletchy
2009-11-30 09:03:54 UTC
view on stackexchange narkive permalink

G'day all!

Jeg har en Arduino Duemilanove hængende rundt i øjeblikket og tænkte, at jeg måske kunne prøve nogle få lydgrænsefladesprojekter. Jeg spekulerer bare på, hvilken slags samplingsfrekvens jeg kan opnå ved hjælp af en enkelt analog indgang og anvende nogle enkle algoritmer på chip og derefter rapportere ved hjælp af et par digitale udgange bundet til lysdioder.

Jeg vil gerne prøve ind ved ~ 44,1 kHz, hvis det er muligt.

Til reference er det første, jeg vil prøve, en simpel guitar tuner.

Ups - det er ATMega168-versionen.
@Sketchy kan du redigere dit spørgsmål, hvis du har brug for det, snarere end at tilføje detaljer i en kommentar.
For guitar tunere er der en række spørgsmål om stackoverflow om frekvensestimering. http://stackoverflow.com/questions/65268/music-how-do-you-analyse-the-fundamental-frequency-of-a-pcm-or-wac-sample/ Jeg har svaret en masse af dem og sendt eksempelkode for nogle metoder her: http://gist.github.com/255291
Otte svar:
#1
+15
Clint Lawrence
2009-11-30 09:48:32 UTC
view on stackexchange narkive permalink

Jeg tror ikke, du kan prøve så hurtigt i fuld opløsning. ATMega168 kan kun prøve ved 15 ksps ved sin fulde opløsning.

Når det er sagt, skal du være i stand til at få en passende samplingsrate for at få en fungerende guitar tuner. 44,1 kHz er sandsynligvis en smule hurtigere, end du har brug for i betragtning af at fundamentet for den høje E-streng og en guitar er omkring 330 Hz.

Strålende - det besvarer mit spørgsmål let. Jeg troede ikke, at 168 ville være i stand til fuld menneskelig lydspektrumsampling, men hvis jeg kan få en samplingshastighed på mindst 660 Hz, skulle jeg være i stand til at identificere den høje e-streng uden aliasing. Jeg støder dog lidt op for sikkerhed og følsomhed. Tak!
Telefonsystemet prøver ved 8000 Hz.
#2
+8
robzy
2009-11-30 11:03:26 UTC
view on stackexchange narkive permalink

Det tager cirka 100 os (0,0001 s) at læse en analog indgang, så den maksimale læsehastighed er cirka 10.000 gange i sekundet.

http: / /arduino.cc/da/Reference/AnalogRead

Rob.

#3
+4
davr
2009-12-01 08:41:23 UTC
view on stackexchange narkive permalink

Google til 'AVR guitar tuner', der er et par projekter derude, der allerede gør dette, og de ser ud til at være i stand til at gøre det uden alt for mange problemer med AVR'ens hastighed.

#4
+3
todbot
2009-11-30 12:11:54 UTC
view on stackexchange narkive permalink

Hvis du bruger en analog komparator (enten den interne i AVR'en eller en ekstern opamp), der omdanner den analoge indgang til en firkantbølge, kan du prøve svingninger ved meget højere hastigheder. Selvom dette ikke er sandt lydsampling, er det ofte alt hvad du behøver for at opbygge en guitar tuner, da al din kode alligevel ville tælle nul gennemgange pr. Tidsenhed.

Min bekymring tror jeg er, at du virkelig har brug for at køre en FFT for at vælge det grundlæggende. Guitarer producerer alle mulige frekvenser, når en streng plukkes, og tælling af nulkrydsninger giver dig kun nok information til at konstruere en firkantbølge, hvilket gør en FFT temmelig ubrugelig.
Single-note guitaroutput (især elektrisk) er en tæt tilnærmelse af en sinusbølge, når du først er kommet forbi den oprindelige forbigående. Ingen underlige harmoniske steder i nærheden af ​​fundamentets amplitude. Alle billige digitale guitar tunere gør bare nul-krydsning timing og gør ikke noget i frekvensområdet. Her er et eksempel på teknikken på en AVR 2323 (tæt på Arduino) http://www.myplace.nu/avr/gtuner/index.htm, og her er en anden, der bruger Arduino med MIDI ud http://www.youtube. com / watch? v = oGKE1vmAWCA
Jeg tror ikke, at guitar tunere tæller nul krydsninger, og dette er bestemt ikke en god metode. Det er ikke engang tæt på en sinusbølge, og der kan være mange nulkrydsninger pr. Cyklus: http://flic.kr/p/7ns9nu
De tunere, jeg har set, havde et lavpasfilter, der gjorde indgangssignalet så meget til en sinusbølge som muligt.
#5
+3
wackyvorlon
2009-11-30 21:40:27 UTC
view on stackexchange narkive permalink

Der er et antal ADC'er til rådighed, der er serielle, I2S er NXPs standard baseret på I2C. De giver dig mulighed for ret nemt at trække i analog, selv ved meget højere hastigheder. Dette link skal føre dig til en NXP-del, der er designet til lyd: UDA1361TS

Gratis eksempler er din ven :)

Mange tak! Det bliver lidt mere, end jeg har brug for for at få en simpel tuner i gang, men den chip ser perfekt ud til nogle af mine fremtidige projekter. Jeg vil til sidst gerne få et simpelt inline DSP-dæk, der vil eksperimentere med effektbehandling. Tak!
#6
+1
endolith
2010-07-15 01:10:35 UTC
view on stackexchange narkive permalink

For det første har du kun brug for 1 kHz eller deromkring til din specifikke applikation, forudsat at du indstiller den grundlæggende frekvens og ikke en af ​​de inharmoniske partialer...

Under alle omstændigheder, hvad angår den maksimale mulige samplingsfrekvens, siger Arduino-manualen:

Det tager cirka 100 mikrosekunder (0,0001 s) at læse en analog indgang, så den maksimale læsehastighed er ca. 10.000 gange i sekundet.

Dette ville antyde, at 10 kHz samplingsfrekvens er den maksimale. Dog. Du kan få højere samplingsfrekvenser ved at få direkte adgang til ADC-registre. Siden Arduino Realtime Audio Processing bruger f.eks. To kanaler ved 15 kHz. Så 10 kHz max er kun, når du bruger den indbyggede AnalogRead () -funktion, fordi den har meget overhead.

ADC er optimeret til den bedste drift med en klokkehastighed på mellem 50 kHz og 200 kHz:

Som standard kræver det på hinanden følgende tilnærmelseskredsløb en indgangsfrekvens [ADC-ur] mellem 50 kHz og 200 kHz for at få maksimal opløsning.

Da en ADC-konvertering tager 13 urcyklusser, ville dette være en samplingsfrekvens på 4 kHz til 15 kHz. Ifølge AVR120: Karakterisering og kalibrering af ADC på en AVR:

For optimal ydeevne bør ADC-uret ikke overstige 200 kHz. Imidlertid reducerer frekvenser op til 1 MHz ikke ADC-opløsningen væsentligt.

Drift af ADC med frekvenser større end 1 MHz er ikke karakteriseret.

1 MHz urfrekvens = 77 kHz samplingsfrekvens, så det er den realistiske maks.

Forumtråden Hurtigere analog læsning? har mere om dette.

#7
  0
Kevin Vermeer
2010-07-15 06:38:31 UTC
view on stackexchange narkive permalink

On-chip-konverteren fungerer til denne applikation, som andre har påpeget, men du bør virkelig undersøge brugen af ​​en ekstern ADC. Dette vil spare dig for mange problemer og frigøre din mikro til at prøve over SPI eller I2C med meget, meget højere datahastigheder, med mindre støj fra mikrouret og med større præcision end ved brug af den interne ADC. Hvis du vil have mere opløsning og / eller en højere datahastighed, skal du bruge noget som LTC1867, som giver dig mulighed for at prøve på op til 175 kHz (Selvom du kan uret det dog hurtigt, du vil) og derefter læse 24-bit data ud ved op til 20 MHz over SPI. Se hvad en ægte ADC kan gøre? :) Med den slags magt (og en 24- eller 32-bit DSP) kan du komprimere og gemme din lyd, filtrere den, modulere den, afspille den ... mulighederne er uendelige.

#8
  0
user3057
2011-02-17 14:14:29 UTC
view on stackexchange narkive permalink

Er du interesseret i en samplingsfrekvens på 64K? Se her

Nu hævet til 150 kHz, 10 bit, ingen yderligere komponenter!

Se der



Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 2.0-licens, den distribueres under.
Loading...