2013-04-09 8 views
5

私はちょうどArduinoにelectret microphoneを接続しました。私は1   kHzと4   kHzの範囲でサンプルを作りたいと思います。Arduinoサンプルオーディオは1〜4 kHzでマイクロ秒でサンプリングできますか?

私はこれがマシンコードとADCに限られていることを理解していますので、私はsketchをシンプルにしています。

以下のスケッチでこれらの周波数の間でサンプリングすることは可能ですか?

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

あなたはどのArduinoを使用していますか? – angelatlarge

答えて

0

私は聞いたことがある、というかむしろ読書を覚えて、ADCは毎秒10K-サンプルを扱うことができること、それは5   kHzまでOKでなければなりません。しかし、私はこれを試していないし、私は現時点でそれをバックアップするためのリンクを持っていない。

ただ試してみてください。

Arduinoのライブラリ関数の中には、遅いもの、特に数百サイクルのオーバーヘッドを持つDigitalRead/Writeがあることがわかっています。これの大半は、人々がすべてを設定することについて多くを考えずにDigitalRead/Writeを実行できるようにする健全性チェックです。

しかし、パフォーマンスを最大限に引き出すには、使用するケースに合わせて最適化された独自のAnalogReadを書くことができます。

被験者に少なくともいくつかのリンク:

+0

私はNeurolecs FFTライブラリを試しました。http://neuroelec.com/2011/03/fft-library-for-arduino/をチェックしてください。実験室が静かだったとき、次の結果が得られました:http://i45.tinypic.com/ dfaqts.jpg。どのようなアイデアがありますか?私はマイクのプラグを抜いただけで、まだトップエンドには荒いです。それは回路からのノイズだけかもしれませんか? – user2119971

+0

これらのスパイクはどのくらいの頻度で表示されますか?まあスパイク... –

1

Arduinoの番号からなるプロトタイピングプラットフォームでありますハードウェアボードとソフトウェア抽象レイヤーの組み合わせこのような質問のために、根底にあるハードウェアの能力を考慮することは有益です。私はArduino Uno/Nanoを使っていると仮定しますが、その話はDueのために異なります。

データシートによれば、各ADCの読み出し(最初のADCの読み出しを超える)は13 ADCクロックサイクルを要します。 ADCクロック(MCUとは異なる)のクロックは、システムクロックを少なくとも2倍に分周して得られます。したがって、16MHzボードでは、1秒間に600万サンプルになります。ここまでは順調ですね。しかし、それはストーリーの終わりではない、あなたはまだデータを読む必要があります。割り込みを使用する場合は、非常にシンプルな処理を行っても、処理を中断するのに約100クロックを失うことがあります。今は126Kサンプル/秒に下がっています。しかしこれは理論上の最大値です。

ADCの最大精度には、50kHz〜200kHzのADCクロックが必要であることがデータシートに記載されています。 (wiring.cで)Arduinoのコードで、128の分周比を選択した:

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

これは、各変換は、毎秒10Kサンプルの理論上の最大値が得られる128×13 = 1764クロックを要することを意味します。 readAnalog()関数は、ADC変換を開始して終了を待っているだけではありませんが、それほど悪くはありません。これにはあなたのコードは含まれません。readAnalog()の結果に対して処理を行うと、より多くのサンプルをキャプチャすることが難しくなります。しかし、確かに、4Khzでキャプチャするには、コードが1.5kクロックサイクル/サンプル未満であることを確認する必要があります。これは実行可能でなければなりません。あなたが掲示したコードのように5回の読書をしている場合、あなたのコードがごくわずかであれば、最大の捕捉率は2kHzになります。


限りデータをキャプチャする方法として、あなたは増幅なしのマイクはあなたがanalogRead()を使用している場合、あなたが期待するかもしれない0-5V測定値が得られていないという事実と契約をする必要があります。実際には、マイクの出力電圧は正から負に変化しますが、負の電圧はADCによって検出されず、マイクに電圧オフセットを与えない限り、ちょうどゼロとして表示されます。


最小振幅から最大振幅までを比較するコードが何をしているのか正確にはわかりません。あなたは、オーディオをデジタル化したいですか?この場合、analogRead()から収集されたすべての振幅読み取り値を保存し、別のコンピュータでFFTを実行する必要があります。Arduinoは、データの周波数分析を行うのに十分速くない可能性が最も高いです。

関連する問題