Tingkat sampel maksimum Arduino Duemilanove?


11

Semua hari ini!

Saya memiliki Arduino Duemilanove yang berkeliaran saat ini dan berpikir saya mungkin akan mencoba beberapa proyek penghubung audio. Saya hanya ingin tahu seperti apa frekuensi sampling yang dapat saya capai dengan menggunakan input analog tunggal dan menerapkan beberapa algoritma sederhana pada chip, kemudian melaporkan menggunakan beberapa output digital yang terkait dengan LED.

Saya ingin sampel di ~ 44,1 kHz jika memungkinkan.

Sebagai referensi, hal pertama yang ingin saya coba adalah tuner gitar sederhana.


Ups - ini versi ATMega168.
Sketchy Fletchy

4
@ Skket Anda dapat mengedit pertanyaan Anda jika perlu, alih-alih menambahkan detail dalam komentar.
Clint Lawrence

1
Untuk tuner gitar, ada sejumlah pertanyaan tentang stackoverflow tentang estimasi frekuensi. stackoverflow.com/questions/65268/… Saya telah menjawab banyak dari mereka dan memposting kode sampel untuk beberapa metode di sini: gist.github.com/255291
endolith

Jawaban:


15

Saya tidak berpikir Anda dapat mencicipi secepat itu dengan resolusi penuh. ATMega168 hanya dapat sampel pada 15 ksp pada resolusi penuhnya.

Karena itu, Anda harus bisa mendapatkan sampel rate yang cocok untuk mendapatkan tuner gitar yang berfungsi. 44.1 kHz kemungkinan besar agak lebih cepat daripada yang Anda perlukan mengingat bahwa dasar dari senar E tinggi sebuah gitar adalah sekitar 330 Hz.


Cemerlang - yang menjawab pertanyaan saya dengan mudah. Saya tidak berpikir 168 akan mampu pengambilan sampel spektrum audio manusia penuh, tetapi jika saya bisa mendapatkan tingkat sampel minimal 660 Hz saya harus dapat mengidentifikasi string e tinggi tanpa alias. Saya akan bertemu sedikit untuk keamanan dan kepekaan. Terima kasih!
Sketchy Fletchy

Sampel sistem telepon pada 8000 Hz.
joeforker


4

Google untuk 'AVR guitar tuner', ada beberapa proyek di luar sana yang sudah melakukan ini, dan mereka tampaknya dapat melakukannya tanpa terlalu banyak kesulitan dengan kecepatan AVR.


3

Jika Anda menggunakan komparator analog (baik yang internal AVR atau opamp eksternal) yang mengubah input analog menjadi gelombang persegi, Anda dapat mencicipi osilasi pada kecepatan yang jauh lebih tinggi. Walaupun ini bukan pengambilan sampel audio yang benar, untuk membuat tuner gitar, sering kali hanya itu yang Anda butuhkan karena semua kode Anda tetap akan menghitung nol penyeberangan per satuan waktu.


1
Kekhawatiran saya, saya pikir, adalah Anda benar-benar perlu menjalankan FFT untuk memilih yang mendasar. Gitar menghasilkan semua jenis frekuensi ketika string dipetik, dan menghitung nol penyeberangan hanya memberi Anda informasi yang cukup untuk membangun gelombang persegi, membuat FFT sangat tidak berguna sama sekali.
wackyvorlon

Output gitar single-note (terutama listrik) adalah perkiraan dekat dari gelombang sinus, setelah Anda melewati transien awal. Tidak ada harmonik aneh di dekat amplitudo fundamental. Semua tuner gitar digital cheapie hanya melakukan timing zero-crossing dan tidak melakukan apa pun dalam domain frekuensi. Inilah salah satu contoh teknik pada AVR 2323 (relatif dekat dengan Arduino) myplace.nu/avr/gtuner/index.htm dan berikut ini menggunakan Arduino dengan MIDI di youtube.com/watch?v=oGKE1vmAWCA
todbot

Saya tidak berpikir penyetem gitar menghitung penyilangan nol, dan ini jelas bukan metode yang baik. Itu bahkan tidak dekat dengan gelombang sinus, dan mungkin ada banyak penyeberangan nol per siklus: flic.kr/p/7ns9nu
endolith

Tuner yang saya lihat memiliki filter low-pass untuk mengubah sinyal input sebanyak mungkin menjadi gelombang sinus.
todbot

3

Ada sejumlah ADC yang tersedia bersifat serial, I2S adalah standar NXP berdasarkan I2C. Mereka memungkinkan Anda untuk dengan mudah menarik analog bahkan pada kecepatan yang lebih tinggi. Tautan ini akan membawa Anda ke bagian NXP yang dirancang untuk audio: UDA1361TS

Sampel gratis adalah teman Anda :)


1
Terima kasih banyak! Itu akan menjadi sedikit lebih dari yang saya butuhkan untuk mendapatkan tuner sederhana, tetapi chip itu terlihat sempurna untuk beberapa proyek masa depan saya. Saya akhirnya ingin mendapatkan dek DSP inline sederhana yang akan bereksperimen dengan pemrosesan efek. Terima kasih!
Sketchy Fletchy

1

Pertama, untuk aplikasi khusus Anda, Anda benar-benar hanya perlu 1 kHz atau lebih laju pengambilan sampel, dengan asumsi Anda menyetel frekuensi dasar dan bukan salah satu parsial inharmonik ...

Bagaimanapun, untuk tingkat pengambilan sampel maksimum yang mungkin, manual Arduino mengatakan:

Dibutuhkan sekitar 100 mikrodetik (0,0001 detik) untuk membaca input analog, sehingga kecepatan membaca maksimum sekitar 10.000 kali per detik.

Ini akan berarti frekuensi pengambilan sampel 10 kHz adalah maks. Namun. Anda bisa mendapatkan tingkat pengambilan sampel yang lebih tinggi dengan mengakses register ADC secara langsung . The Arduino Realtime Audio Processing halaman menggunakan dua saluran di 15 kHz, misalnya. Jadi maks 10 kHz hanya ketika menggunakan fungsi AnalogRead () bawaan, karena memiliki banyak overhead.

ADC dioptimalkan untuk operasi terbaik dengan kecepatan clock antara 50 kHz dan 200 kHz:

Secara default, sirkuit aproksimasi berturut-turut membutuhkan frekuensi clock input [ADC clock] antara 50 kHz dan 200 kHz untuk mendapatkan resolusi maksimum.

Karena konversi ADC membutuhkan 13 siklus clock, ini akan menjadi laju sampling dari 4 kHz hingga 15 kHz. Menurut AVR120: Karakterisasi dan Kalibrasi ADC pada AVR :

Untuk kinerja optimal, jam ADC tidak boleh melebihi 200 kHz. Namun, frekuensi hingga 1 MHz tidak mengurangi resolusi ADC secara signifikan.

Mengoperasikan ADC dengan frekuensi lebih besar dari 1 MHz tidak dicirikan.

Frekuensi clock 1 MHz = frekuensi sampling 77 kHz, jadi itulah maks yang realistis.

Utas forum Baca Analog Lebih Cepat? memiliki lebih banyak tentang ini.


0

Konverter on-chip akan berfungsi untuk aplikasi ini seperti yang ditunjukkan orang lain, tetapi Anda harus benar-benar melihat menggunakan ADC eksternal. Ini akan menghemat banyak masalah, dan membebaskan mikro Anda untuk mengambil sampel melalui SPI atau I2C, dengan kecepatan data yang lebih tinggi, dengan lebih sedikit noise dari jam mikro, dan dengan presisi lebih besar daripada menggunakan ADC internal. Jika Anda ingin lebih banyak resolusi dan / atau kecepatan data yang lebih tinggi, maka gunakan sesuatu seperti LTC1867, yang akan memungkinkan Anda sampel hingga 175kHz (Meskipun Anda dapat clock itu bagaimanapun cepat yang Anda inginkan) dan kemudian baca data 24-bit hingga 20MHz lebih dari SPI. Lihat apa yang dapat dilakukan ADC nyata? :) Dengan kekuatan seperti itu (Dan DSP 24-atau 32-bit), Anda dapat mengompres dan menyimpan audio Anda, memfilternya, memodulasinya, memainkannya kembali ... kemungkinannya tidak terbatas.


0

Apakah Anda tertarik dengan laju pengambilan sampel 64 ribu? Silahkan lihat di sini

Sekarang dinaikkan menjadi 150 kHz, 10 bit, tanpa komponen tambahan!

Silahkan lihat di sana

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.