Maksymalna częstotliwość próbkowania Arduino Duemilanove?

11

Dzień dobry!

W tej chwili mam Arduino Duemilanove w zapasie i pomyślałem, że mogę wypróbować kilka projektów interfejsów audio. Zastanawiam się tylko, jaką częstotliwość próbkowania mogę osiągnąć za pomocą pojedynczego wejścia analogowego i zastosowania kilku prostych algorytmów na chipie, a następnie raportowania za pomocą kilku cyfrowych wyjść związanych z diodami LED.

Jeśli to możliwe, chciałbym próbkować przy ~ 44,1 kHz.

Dla porównania, pierwszą rzeczą, którą chcę wypróbować, jest prosty tuner gitarowy.

Sketchy Fletchy
źródło
Ups - to jest wersja ATMega168.
Sketchy Fletchy
4
@ Szkic możesz w razie potrzeby edytować swoje pytanie, zamiast dodawać szczegółów w komentarzu.
Clint Lawrence
1
W przypadku tunerów gitarowych istnieje szereg pytań dotyczących przepływu stosu na temat szacowania częstotliwości. stackoverflow.com/questions/65268/... Mam odpowiedział na kilka z nich i wysłane przykładowy kod dla niektórych metod tutaj: gist.github.com/255291
endolit

Odpowiedzi:

15

Nie sądzę, że można tak szybko próbkować w pełnej rozdzielczości. ATMega168 może próbkować tylko przy 15 ksps w pełnej rozdzielczości.

Powiedziawszy to, powinieneś być w stanie uzyskać odpowiednią częstotliwość próbkowania, aby uzyskać działający tuner gitarowy. 44,1 kHz jest najprawdopodobniej nieco szybsze niż potrzebujesz, biorąc pod uwagę, że podstawa wysokiej struny E gitary wynosi około 330 Hz.

Clint Lawrence
źródło
Genialne - to odpowiada na moje pytanie. Nie sądziłem, że 168 będzie w stanie próbkować pełne spektrum ludzkiego dźwięku, ale jeśli uda mi się uzyskać częstotliwość próbkowania wynoszącą co najmniej 660 Hz, powinienem być w stanie zidentyfikować wysoki ciąg e bez aliasingu. Podkreślę to trochę dla bezpieczeństwa i wrażliwości. Dzięki!
Sketchy Fletchy
System telefoniczny pobiera próbki przy częstotliwości 8000 Hz.
współpracownik
8

Odczytywanie wejścia analogowego zajmuje około 100 us (0,0001 s), więc maksymalna szybkość odczytu wynosi około 10 000 razy na sekundę.

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

Obrabować.

robzy
źródło
4

Google dla „tunera gitarowego AVR”, istnieje kilka projektów, które już to robią, i wydaje się, że są w stanie to zrobić bez większych problemów z prędkością AVR.

davr
źródło
3

Jeśli używasz komparatora analogowego (wewnętrznego w AVR lub zewnętrznego opampa), który zamienia wejście analogowe w falę kwadratową, możesz próbkować oscylacje przy znacznie wyższych prędkościach. Chociaż nie jest to prawdziwe próbkowanie dźwięku, do zbudowania tunera gitarowego często jest to wszystko, czego potrzebujesz, ponieważ wszystko, co robiłby kod, i tak liczyłoby zero przejść na jednostkę czasu.

todbot
źródło
1
Myślę, że moim zmartwieniem jest to, że naprawdę musisz uruchomić FFT, aby wybrać fundament. Gitary wytwarzają wszelkiego rodzaju częstotliwości, gdy szarpana jest struna, a liczenie przejść przez zero daje tylko wystarczającą ilość informacji do skonstruowania fali prostokątnej, dzięki czemu FFT jest całkowicie bezużyteczne.
wackyvorlon
Wyjście gitary z jedną nutą (szczególnie elektryczną) jest zbliżonym przybliżeniem fali sinusoidalnej po przekroczeniu początkowego stanu przejściowego. Żadnych dziwnych harmonicznych w pobliżu amplitudy podstawy. Wszystkie tanie tunery gitarowe cyfrowe wykonują taktowanie z zerowym przejściem i nie robią nic w dziedzinie częstotliwości. Oto jeden przykład techniki na AVR 2323 (bliski krewny Arduino) myplace.nu/avr/gtuner/index.htm, a oto inny przy użyciu Arduino z MIDI na youtube.com/watch?v=oGKE1vmAWCA
todbot
Nie sądzę, żeby tunery gitarowe liczyły zero przejść i to z pewnością nie jest dobra metoda. To nie jest nawet zbliżony do sinusoidy, i nie może być wiele przejścia przez zero na cykl: flic.kr/p/7ns9nu
endolit
Tunery, które widziałem, miały filtr dolnoprzepustowy, który zamienia sygnał wejściowy jak najbardziej w falę sinusoidalną.
todbot
3

Dostępnych jest szereg ADC, które są szeregowe, I2S to standard NXP oparty na I2C. Pozwalają dość łatwo wciągnąć analog nawet przy znacznie wyższych prędkościach. Ten link powinien przejść do części NXP, która jest przeznaczona dla dźwięku: UDA1361TS

Darmowe próbki są twoim przyjacielem :)

wackyvorlon
źródło
1
Dziękuję bardzo! To będzie trochę więcej niż potrzebuję, aby uruchomić prosty tuner, ale ten układ wygląda idealnie dla niektórych moich przyszłych projektów. W końcu chciałbym, aby prosta, wbudowana talia DSP eksperymentowała z przetwarzaniem efektów. Dzięki!
Sketchy Fletchy
1

Po pierwsze, dla konkretnego zastosowania naprawdę potrzebujesz tylko częstotliwości próbkowania około 1 kHz, zakładając, że dostrajasz częstotliwość podstawową, a nie jedną z części nieharmonicznych ...

W każdym razie, jeśli chodzi o maksymalną możliwą częstotliwość próbkowania, instrukcja Arduino mówi:

Odczytanie wejścia analogowego zajmuje około 100 mikrosekund (0,0001 s), więc maksymalna szybkość odczytu wynosi około 10 000 razy na sekundę.

Oznaczałoby to, że częstotliwość próbkowania 10 kHz jest maksymalna. Jednak. Wyższe częstotliwości próbkowania można uzyskać, uzyskując bezpośredni dostęp do rejestrów ADC . Na przykład strona przetwarzania audio Arduino w czasie rzeczywistym wykorzystuje dwa kanały o częstotliwości 15 kHz. Tak więc maks. 10 kHz występuje tylko podczas korzystania z wbudowanej funkcji AnalogRead (), ponieważ ma duży narzut.

ADC jest zoptymalizowany pod kątem najlepszej pracy z częstotliwością taktowania od 50 kHz do 200 kHz:

Domyślnie kolejne obwody aproksymacyjne wymagają częstotliwości zegara wejściowego [zegara ADC] między 50 kHz a 200 kHz, aby uzyskać maksymalną rozdzielczość.

Ponieważ konwersja ADC zajmuje 13 cykli zegara, byłaby to częstotliwość próbkowania od 4 kHz do 15 kHz. Zgodnie z AVR120: Charakterystyka i kalibracja ADC na AVR :

Aby uzyskać optymalną wydajność, zegar ADC nie powinien przekraczać 200 kHz. Jednak częstotliwości do 1 MHz nie zmniejszają znacząco rozdzielczości ADC.

Obsługa ADC przy częstotliwościach większych niż 1 MHz nie jest charakteryzowana.

Częstotliwość taktowania 1 MHz = częstotliwość próbkowania 77 kHz, więc to jest realistyczne maks.

Wątek na forum Faster Analog Read? ma o tym więcej.

endolit
źródło
0

Konwerter na chipie będzie działał dla tej aplikacji, jak zauważyli inni, ale naprawdę powinieneś rozważyć użycie zewnętrznego ADC. Pozwoli ci to zaoszczędzić wiele kłopotów i uwolni twój mikro do próbkowania przez SPI lub I2C przy znacznie, znacznie wyższych szybkościach transmisji danych, przy mniejszym hałasie z zegara mikro i z większą precyzją niż przy użyciu wewnętrznego ADC. Jeśli chcesz uzyskać większą rozdzielczość i / lub wyższą szybkość transmisji danych, użyj czegoś takiego jak LTC1867, który pozwoli Ci próbkować z częstotliwością do 175 kHz (chociaż możesz tak szybko ustawić taktowanie, jak chcesz), a następnie odczytać dane 24-bitowe do 20 MHz przez SPI. Zobacz, co potrafi prawdziwy ADC? :) Dzięki tego rodzaju mocy (i 24- lub 32-bitowemu procesorowi DSP) możesz kompresować i przechowywać dźwięk, filtrować go, modulować, odtwarzać ... możliwości są nieograniczone.

Kevin Vermeer
źródło
0

Czy jesteś zainteresowany częstotliwością próbkowania 64K? Spójrz tutaj

Teraz podniesiony do 150 kHz, 10 bitów, bez dodatkowych komponentów!

Spójrz tam

Społeczność
źródło