2013-04-09 17 views
5

Arduino'ya bir electret microphone bağladım ve 1   kHz ve 4   kHz aralıkları arasında örnek almak istiyorum.Bir Arduino örnek ses 1-4 kHz için mikrosaniye içinde olabilir mi?

Makine koduna ve ADC ile sınırlı olduğunu anlıyorum, bu yüzden sketch'u basit tutmaya çalışıyorum.

Bu frekanslar arasında aşağıdaki çizim ile örnekleme yapılabilir mi?

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

Ne tür bir Arduino kullanıyorsunuz? – angelatlarge

cevap

0

Duydum, daha doğrusu ADC saniyede 10k-numunelerin kadar ele verebilir, bu nedenle 5   kHz'e kadar Tamam olması gerektiğini, okuma hatırlayın. Bununla birlikte, bunu denemedim ve şu anda destekleyecek bir bağlantım yok.

Sadece dene ve görün.

Şimdi, Arduino kütüphane fonksiyonlarının bir kısmının yavaş olduğunu, özellikle yüzlerce döngüden oluşan DigitalRead/Write olduğunu biliyorum. Bunların çoğu, insanların her şeyi ayarlama konusunda fazla düşünmeden sadece DigitalRead/Write yapabilmelerini sağlayan akıl sağlığı kontrolüdür. Bununla birlikte, maksimum performansı sıkmak için kullanım durumunuz için en uygun hale getirilmiş kendi AnalogDokuzunuzu yazabilirsiniz. konuda

en azından bir kısmı bağlantılar:

+0

Neurolecs FFT kütüphanesini http://neuroelec.com/2011/03/fft-library-for-arduino/ adresinden kontrol etmek için denedim ve laboratuar sessiz olduğunda şu sonuçlara ulaştım: http://i45.tinypic.com/ dfaqts.jpg. Ne olabileceği hakkında bir fikrin var mı? Mikrofonu bile fişten çektim ve hala en üstte sert. Devreden sadece gürültü olabilir mi? – user2119971

+0

Bu sivri hangi frekansta? Peki bu başak ... –

1

çaba isteyen bir dizi içeren bir prototip platformu donanım panoları artı bir yazılım soyutlama katmanı. Bunun gibi bir soru için, temel sınırlamaların sağlandığı gibi, temeldeki donanımın yeteneklerini göz önünde bulundurmak yararlıdır. Arduino Uno/Nano'yu kullandığınızı varsayacağım, hikaye Due için farklı.

Veri sayfasına göre, her bir ADC okuması (ilkinin ötesinde) 13 ADC saat döngüsü alır. ADC saati (MCU'dan farklı) saat, sistem saatini en az 2 faktöre bölerek elde edilir. Böylece 16Mhz kartında saniyede 0.6 milyon örnek bulunur. Çok uzak çok iyi. Ancak, bu hikayenin sonu değil, hala verileri okumanız gerekiyor. Kesintileri kullanırsanız, çok basit bir şey yapsanız bile, deneyim, işlemi kesmek için yaklaşık 100 saati kaybedeceğinizi gösterir. Şimdi 126K örnek/saniyeye düştünüz. Ancak bu teorik bir maksimumdur.

Veri sayfası ADC için maksimum kesinlik için 50kHz - 200kHz ADC saati gerektirdiğini belirtir. (wiring.c olarak) Arduino kodunda, 128 bir bölümü faktörü seçilir: Bu, her bir dönüşüm saniyede 10K numune teorik maksimum elde edilmesini, 128 * 13 = 1764 saatler sürüyor demektir

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

. readAnalog() işlevinin ADC dönüşümünü başlatmasının ve bitmesini beklemenin ötesinde bir şey yapması biraz daha kötüdür, ancak çok daha kötü olmamalıdır. Bu, sizin kodunuzu içermez: readAnalog() sonuçlarında yaptığınız herhangi bir işlem, daha fazla örnek yakalamayı daha zor hale getirecektir.Ama evet, 4Khz'de yakalamanız için kodunuzun 1.5k saat döngüsünden daha az zaman harcadığından emin olmanız gerekir. Yayınladığınız kodda yaptığınız gibi beş okuma yapıyorsanız, kodunuzun çok az olması durumunda maksimum çekim oranının 2kHz olacağını unutmayın.


Bildiğim kadarıyla verilerini yakalamak için nasıl gibi, sen büyütme yapılmadan mikrofonlar size analogRead() kullanıyorsanız beklediğinizden 0-5V okumaları vermeyecektir gerçeğiyle anlaşma yapmak gerekir. Aslında, mikrofon çıkış voltajları pozitifden negatif değerine doğru döner, ancak negatif voltajlar ADC tarafından alınmayacak ve mikrofonunuzu bir voltaj ofseti vermediğiniz sürece sadece sıfır olarak görünecektir.


Ben maksimum büyüklüğe kadar asgari genliği karşılaştırır kod yapıyor olması gerekiyordu tam olarak emin değilim. Sesi dijitalleştirmek mi istiyorsunuz? Bu durumda, analogRead()'dan toplanan tüm amplitüd okumalarını kaydetmeniz gerekir ve daha sonra başka bir bilgisayarda FFT'leri çalıştırabilirsiniz: Arduino büyük olasılıkla veriler üzerinde frekans analizi yapmak için yeterince hızlı olmayacaktır.

İlgili konular