Daftar Isi:

QuickFFT: FFT Kecepatan Tinggi untuk Arduino: 3 Langkah
QuickFFT: FFT Kecepatan Tinggi untuk Arduino: 3 Langkah

Video: QuickFFT: FFT Kecepatan Tinggi untuk Arduino: 3 Langkah

Video: QuickFFT: FFT Kecepatan Tinggi untuk Arduino: 3 Langkah
Video: EasyFFT: Fast Fourier Transform (FFT) for Arduino 2024, November
Anonim
QuickFFT: FFT Kecepatan Tinggi untuk Arduino
QuickFFT: FFT Kecepatan Tinggi untuk Arduino

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

Bekerja
Bekerja
Bekerja
Bekerja
Bekerja
Bekerja
Bekerja
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:

Hasil
Hasil
Hasil
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: