2013-04-09 23 views
5

Właśnie podłączyłem electret microphone do Arduino, a ja chciałbym próbkować pomiędzy zakresami 1   kHz i 4   kHz.Czy można próbkować dźwięku Arduino w mikrosekundach dla 1-4 kHz?

Rozumiem, że ogranicza się to do kodu maszynowego i ADC, więc staram się zachować prosty kod sketch.

Czy można próbkować między tymi częstotliwościami z poniższym szkicem?

const int analogPin = 0; 
int ledPin = 13; 

void setup() { 
    pinMode(ledPin, OUTPUT); 
} 

void loop() { 
    int mn = 1024; 
    int mx = 0; 
    for (int i = 0; i < 5; ++i) { 
     int val = analogRead(analogPin); 
     mn = min(mn, val); 
     mx = max(mx, val); 
    } 
    if (mx-mn >= 50) { 
     digitalWrite(ledPin, HIGH); 
    } 
    else { 
     digitalWrite(ledPin, LOW); 
    } 
} 
+0

Jakiego rodzaju Arduino używasz? – angelatlarge

Odpowiedz

0

Słyszałem, lub raczej pamiętać czytania, że ​​ADC może obsłużyć maksymalnie 10k-próbek na sekundę, więc powinno być OK do 5   kHz. Jednak nie próbowałem tego, ani nie mam linku do jego kopii zapasowej w tej chwili.

Po prostu spróbuj i zobacz.

Teraz wiem, że niektóre funkcje biblioteki Arduino są powolne, zwłaszcza DigitalRead/Write, który ma narzut setek cykli. Większość to sprawdzanie poprawności, które pozwala ludziom po prostu wykonywać DigitalRead/Write bez zastanawiania się nad ustawieniem wszystkiego.

Jednak, aby wycisnąć maksymalną wydajność, można popatrzeć na pisanie własnego AnalogRead, który jest zoptymalizowany dla twojego przypadku użycia.

Przynajmniej niektóre linki na temat:

+0

Próbowałem biblioteki Neurolecs FFT tylko po to, aby sprawdzić http://neuroelec.com/2011/03/fft-library-for-arduino/ i kiedy laboratorium było cicho, miałem następujące wyniki http://i45.tinypic.com/ dfaqts.jpg. Jakieś pomysły, jakie to może być? Nawet wyłączyłem mikrofon i nadal jest on szorstki na samym końcu. Czy to może być szum z obwodu? – user2119971

+0

Na jakiej częstotliwości występują te skoki? Cóż, ten spike ... –

1

Arduino to platforma prototypowania składa się z szeregu z kartami sprzętowymi plus warstwa abstrakcji oprogramowania. W przypadku takich pytań warto wziąć pod uwagę możliwości podstawowego sprzętu, ponieważ zapewniają one ostateczne ograniczenia. Zakładam, że używasz Arduino Uno/Nano, historia jest inna dla Due.

Zgodnie z arkuszem danych każdy odczyt ADC (poza pierwszym) zajmuje 13 cykli zegara ADC. Zegar ADC (inny niż MCU) otrzymuje się dzieląc zegar systemowy przez jakiś czynnik, co najmniej 2. Tak więc na płytce 16MHz ilość ta wynosi 0,6 miliona próbek na sekundę. Jak na razie dobrze. Jednak to nie koniec historii, nadal musisz przeczytać dane. Jeśli używasz przerwań, nawet jeśli zrobisz coś bardzo prostego, doświadczenie sugeruje, że stracisz około 100 zegarów, aby przerwać przetwarzanie. Teraz jesteś do 126K próbek/sekundę. Ale to jest teoretyczne maksimum.

Arkusz informacyjny podaje, że dla maksymalnej dokładności ADC wymagany jest zegar ADC 50kHz - 200kHz. W kodzie Arduino (w wiring.c), czynnik podział 128 jest wybrana:

sbi(ADCSRA, ADPS2); 
sbi(ADCSRA, ADPS1); 
sbi(ADCSRA, ADPS0); 

Oznacza to, że każda konwersja odbywa 128 * 13 = 1764 zegary, co daje teoretyczną maksymalną 10K próbek na sekundę. Jest nieco gorszy od tego, biorąc pod uwagę, że funkcja readAnalog() robi coś więcej niż tylko rozpoczęcie konwersji ADC i czekanie na jej zakończenie, ale nie powinno być gorzej. Nie dotyczy to oczywiście Twojego kodu: każde przetwarzanie, które wykonujesz na wynikach readAnalog(), utrudni przechwycenie większej ilości próbek.Ale tak, aby uchwycić 4Khz, musisz upewnić się, że kod wydaje mniej niż 1,5 tys. Cykli/próbki, co powinno być wykonalne. Zauważ, że jeśli wykonujesz pięć odczytów, tak jak robisz w opublikowanym przez ciebie kodzie, maksymalna szybkość przechwytywania będzie wynosić 2 kHz, jeśli twój kod będzie bardzo mały.


W miarę jak do przechwytywania danych, czego potrzebujesz, aby poradzić sobie z faktem, że mikrofony bez wzmocnienia nie daje 0-5V odczyty że można się spodziewać, jeśli używasz analogRead(). W rzeczywistości napięcie wyjściowe mikrofonu zmienia się z dodatniej na ujemną, jednak napięcia ujemne nie będą odbierane przez ADC i będą wyświetlane jako same zera, chyba że podasz mikrofonowi napięcie.


Nie jestem dokładnie pewien, co powinien robić twój kod, który porównuje minimalną amplitudę do maksymalnej amplitudy. Czy chcesz zdigitalizować dźwięk? W tym przypadku musisz zapisać wszystkie odczyty amplitudy zebrane z analogRead(), a następnie możesz uruchomić na nich FFT na innym komputerze: Arduino najprawdopodobniej nie będzie wystarczająco szybki, aby przeprowadzić analizę częstotliwości danych.