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は、データの周波数分析を行うのに十分速くない可能性が最も高いです。
あなたはどのArduinoを使用していますか? – angelatlarge