Daftar Isi:
Video: QuickFFT: FFT Kecepatan Tinggi untuk Arduino: 3 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:54
Arduino tipikal memiliki RAM dan kekuatan pemrosesan yang terbatas, dan FFT adalah proses yang intensif secara komputasi. Untuk banyak aplikasi waktu nyata, satu-satunya persyaratan adalah mendapatkan frekuensi dengan amplitudo maksimum atau diperlukan untuk mendeteksi puncak frekuensi.
Dalam salah satu instruksi saya, saya menyiapkan kode untuk FFT yang dapat ditemukan di sini: EasyFFT
Kode ini mampu melakukan FFT hingga 128 sampel pada Arduino nano. Jumlah sampel yang lebih tinggi dari ini tidak dimungkinkan karena memori Arduino yang terbatas. Saya telah memodifikasi fungsi sedikit untuk meningkatkan kecepatan dan mengurangi konsumsi memori. Modifikasi ini memungkinkan Arduino untuk melakukan FFT lima kali lebih cepat dan menghabiskan hampir setengah memori. Instruksi ini tidak mencakup Cara Kerja FFT, referensi untuk itu dapat ditemukan di EasyFFT.
Langkah 1: Bekerja
Fungsi FFT tipikal dimodifikasi untuk meningkatkan kecepatan dengan akurasi yang lebih rendah. Seperti yang ditunjukkan pada gambar, sinyal uji perlu dikalikan dengan bentuk gelombang sinus atau kosinus. Nilai-nilai ini bisa antara 0 hingga 1, jadi membuat perkalian mengambang adalah suatu keharusan. di Arduino, perkalian Floating lambat dibandingkan dengan operasi integer.
Dalam fungsi ini, gelombang sinus/cosinus digantikan oleh gelombang persegi. Karena kita harus mengalikan sinyal uji dengan gelombang persegi yang mungkin memiliki nilai 0, 1 atau -1. Karena itu, kita dapat mengganti perkalian mengambang menjadi penjumlahan atau pengurangan bilangan bulat. Untuk penambahan atau pengurangan bilangan bulat Arduino sekitar 5 kali lebih cepat. Ini membuat penyelesaian sekitar 5 kali lebih cepat.
Karena modifikasi ini sekarang nilai bin frekuensi dapat disimpan sebagai bilangan bulat (yang sebelumnya mengambang) dan kami mendapatkan keuntungan lain dari konsumsi memori yang lebih rendah. Di Arduino Nano, int menghabiskan 2 byte memori sementara float menghabiskan 4 byte memori. Karena keunggulan dalam kode baru ini, kami dapat melakukan FFT untuk hampir 256 sampel (sebelumnya 128 sampel).
Dalam FFT Normal kami perlu menyimpan nilai sinus untuk membuat solusi lebih cepat. Dalam fungsi baru, karena kami tidak lagi membutuhkan nilai sinus/cosinus, kami dapat menghilangkannya dan menghemat beberapa memori.
Penerapan:
Menerapkan fungsi ini lurus ke depan. Kita cukup menyalin fungsi di ens kode. Fungsi ini dapat dijalankan dengan menggunakan perintah di bawah ini:
float f= Q_FFT(data, 256, 100);Dalam fungsi Q_FFT, data: istilah ini adalah larik yang memiliki nilai sinyal, ukuran sampel yang disarankan adalah 2, 4, 8, 32, 64, 128, 256, 512, … dan seterusnya. jika ukuran sampel tidak termasuk dalam nilai-nilai ini, itu akan dipotong ke sisi bawah terdekat dari nilai-nilai. misalnya, jika ukuran sampel 75 maka FFT akan dilakukan untuk 64 jumlah sampel. Jumlah maksimum ukuran sampel dibatasi oleh RAM yang tersedia di Arduino.
Istilah kedua menentukan jumlah sampel dalam array dan istilah terakhir adalah frekuensi sampling dalam Hz.
Langkah 2: Kode
Bagian ini menjelaskan modifikasi yang dilakukan pada kode EasyFFT yang perlu diperhatikan saat melakukan modifikasi pada kode, 1. Seperti yang telah dijelaskan sebelumnya, di sini bilangan bulat digunakan untuk melakukan FFT. Int di Arduino adalah angka 16-bit dan dapat berisi nilai dari -32768 hingga 32768. setiap kali nilai int ini melebihi kisaran ini, itu menyebabkan masalah. untuk menghilangkan masalah ini setelah perhitungan level. jika salah satu nilainya melebihi 15000 array lengkap akan dibagi 100. ini akan mencegah int meluap.
2. Perhitungan amplitudo: Untuk menghitung amplitudo, bagian real dan imajiner perlu dikuadratkan dan akar kuadrat dari jumlah diperlukan. kuadrat dan akar kuadrat dari fungsi adalah waktu. untuk membuat proses lebih cepat, kode ini hanya akan melakukan beberapa besaran bagian nyata dan imajiner. Hal ini tentunya kurang akurat dan dapat menyebabkan kesimpulan yang salah dalam beberapa kasus. Anda dapat memilih untuk kembali ke metode Normal untuk perhitungan besaran tetapi akan memakan waktu lebih lama dan Anda juga perlu melakukan beberapa pengaturan untuk menyimpan angka-angka ini.
3. Kode ini tidak memiliki modul untuk deteksi puncak berganda. Ini hanya akan memilih nilai dengan amplitudo maks (tidak termasuk angka pertama yang merupakan offset DC). Jika Anda membutuhkan beberapa puncak, Anda dapat merujuk kode EasyFFT dan melakukan modifikasi yang diperlukan di sini. Dalam hal ini, beberapa array/variabel juga perlu dideklarasikan sebagai variabel global.
4. Fungsi tersebut berisi baris berikut:
unsigned int Pow2[13]={1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
mendeklarasikan variabel di atas sebagai variabel global (menempelkannya di awal kode) akan menghemat waktu 1 milidetik di setiap eksekusi.
5. Berbeda dengan fungsi EasyFFT, di mana 5 puncak teratas disimpan dalam larik yang telah ditentukan. Fungsi ini akan mengembalikan nilai float. nilai ini mewakili frekuensi dengan amplitudo maksimum dalam Hz. Jadi representasi kode akan terlihat seperti ini.
float f= Q_FFT(data, 256, 100);
6. Deteksi Puncak: Setelah frekuensi dengan amplitudo maksimum ditemukan, fungsi ini menggunakan amplitudo frekuensi sebelum dan sesudahnya untuk menghitung hasil yang akurat. Amplitudo yang digunakan dalam perhitungan ini juga merupakan penjumlahan dari modulus (bukan akar kuadrat dari penjumlahan kuadrat)
jika Fn adalah frekuensi dengan amplitudo maksimum maka frekuensi dapat dihitung dari rumus di bawah ini.
Sebenarnya F= (A n-1 *Fn-1 + An-1 *Fn-1 + An-1 *Fn-1) / (An-1+An+An+1)
di mana An adalah amplitudo dari n frekuensi dan Fn-1 adalah nilai frekuensi.
Langkah 3: Hasil:
Waktu penyelesaian ditunjukkan dalam perbandingan gambar di atas dengan EasyFFT. Kecepatan itu ditunjukkan dengan perbandingan.
Untuk data sampel yang memiliki 3 gelombang sinusoidal dengan frekuensi yang berbeda ditampilkan. Hasil dari QuickFFT dibandingkan dengan keluaran Scilab. Seperti yang dapat kita lihat pada gambar 3 puncak dengan amplitudo maksimal sesuai dengan keluaran Scilab. Namun, outputnya terdiri dari banyak noise, yang mungkin menyesatkan untuk beberapa aplikasi. Jadi disarankan untuk memeriksa kode dengan benar sebelum mendaftar ke aplikasi Anda.
Saya harap Anda menemukan kode ini berguna untuk proyek Anda. Jika ada pertanyaan atau saran, silakan beri komentar.
Direkomendasikan:
Mobil Listrik Kecepatan Tinggi Buatan Sendiri: 7 Langkah
Mobil Listrik Kecepatan Tinggi Buatan Sendiri: Jika Anda pernah ingin mencoba membuat mobil listrik sendiri, ini adalah cara yang sangat sederhana untuk membuat mobil berkecepatan tinggi dari bahan-bahan umum serta beberapa barang murah dari toko elektronik. Tidak perlu lagi menghabiskan $30-$60 dolar untuk mobil RC, saat Anda
Panduan Pengaturan Premium VPN untuk UNDUHAN KECEPATAN TINGGI dan Streaming OKE oleh REO: 10 Langkah
Panduan Pengaturan Premium VPN untuk UNDUHAN KECEPATAN TINGGI dan Streaming OKE oleh REO: Terima kasih, Asuswrt-MerlinHai, saya dari Thailand. Saya akan menulis panduan penyiapan terperinci VPN untuk unduhan berkecepatan tinggi rata-rata sekitar 100 Mb/s dan mungkin streaming paling lancar untuk Netflix, Crunchyroll, Hulu, dll. Dari Thailand, tujuan
Jam Kecepatan Tinggi untuk Video Gerak Lambat: 4 Langkah
Jam Kecepatan Tinggi untuk Video Gerakan Lambat: Hampir semua orang dengan smartphone modern memiliki kamera kecepatan tinggi yang dapat digunakan untuk membuat video gerakan lambat yang spektakuler. Tetapi jika Anda ingin mengukur berapa lama sebenarnya gelembung sabun itu pecah atau semangka itu meledak, Anda mungkin
Videografi Kecepatan Tinggi untuk Pemula.: 6 Langkah (dengan Gambar)
Videografi Berkecepatan Tinggi untuk Pemula.: Setiap orang yang saya temui dan berbicara untuk berbagi satu kesamaan: keinginan untuk memiliki, atau setidaknya bermain dengan, kamera kecepatan tinggi. Meskipun saya ragu bahwa banyak orang yang membaca ini memiliki kamera kecepatan tinggi mereka sendiri, adalah harapan saya bahwa beberapa orang yang
Buat Shock Mobil RC Anda Lebih Pendek untuk Penanganan Lebih Baik di Kecepatan Tinggi: 5 Langkah
Jadikan Guncangan Mobil RC Anda Lebih Pendek untuk Penanganan Lebih Baik pada Kecepatan Tinggi: Dalam Instruksi ini saya akan menunjukkan kepada Anda cara mempersingkat guncangan Anda sehingga Anda dapat membawa mobil Anda lebih dekat ke tanah sehingga Anda dapat berbelok dengan kecepatan lebih tinggi tanpa mengepak. Instruksi lainnya tentang cara melakukan perawatan pada guncangan mobil Anda sehingga