Friday 14 July 2017

Moving Average Filter Implementation C


Mungkinkah menerapkan rata-rata bergerak di C tanpa memerlukan jendela sampel, saya telah menemukan bahwa saya dapat mengoptimalkan sedikit, dengan memilih ukuran jendela, itulah kekuatan dua untuk memungkinkan perpindahan bit daripada membagi, tapi tidak memerlukannya. Penyangga akan menyenangkan Apakah ada cara untuk mengungkapkan hasil rata-rata bergerak baru hanya sebagai fungsi dari hasil lama dan sampel baru Tentukan contoh rata-rata bergerak, di atas jendela 4 sampel menjadi: Tambahkan sampel baru e: Rata-rata bergerak dapat diimplementasikan secara rekursif. , Tapi untuk kalkulasi rata-rata bergerak yang tepat, Anda harus mengingat sampel masukan tertua dalam jumlah (contohnya dalam contoh Anda). Untuk panjang N rata-rata bergerak yang Anda hitung: di mana yn adalah sinyal output dan xn adalah sinyal input. Pers. (1) dapat ditulis secara rekursif. Jadi Anda harus selalu mengingat sampel xn-N untuk menghitung (2). Seperti yang ditunjukkan oleh Conrad Turner, Anda dapat menggunakan jendela eksponensial (jauh lebih panjang) sebagai gantinya, yang memungkinkan Anda menghitung keluaran hanya dari keluaran lalu dan masukan saat ini: namun ini bukan rata-rata bergerak standar (tanpa bobot) namun secara eksponensial. Rata bergerak tertimbang, di mana sampel lebih jauh di masa lalu mendapatkan bobot yang lebih kecil, tapi (setidaknya secara teori) Anda tidak akan pernah melupakan apapun (bobotnya semakin kecil dan kecil untuk sampel jauh di masa lalu). Saya menerapkan rata-rata bergerak tanpa memori item individual untuk program pelacakan GPS yang saya tulis. Saya mulai dengan 1 sampel dan bagi 1 untuk mendapatkan nilai rata-rata saat ini. Saya kemudian menambahkan sampel anothe dan membagi dengan 2 ke avg saat ini. Ini berlanjut sampai saya mencapai panjang rata-rata. Setiap saat setelah itu, saya menambahkan sampel baru, mendapatkan rata-rata dan menghapus rata-rata dari total. Saya bukan seorang matematikawan tapi ini sepertinya cara yang bagus untuk melakukannya. Kupikir itu akan mengubah perut orang matematika sejati tapi, ternyata itu adalah salah satu cara yang bisa diterima untuk melakukannya. Dan itu bekerja dengan baik. Ingatlah bahwa semakin tinggi panjang Anda semakin lambat, mengikuti apa yang ingin Anda ikuti. Itu mungkin tidak masalah sebagian besar waktu tapi ketika mengikuti satelit, jika Anda lamban, jejaknya bisa jauh dari posisi sebenarnya dan akan terlihat buruk. Anda bisa memiliki celah antara duduk dan titik-titik trailing. Saya memilih panjang 15 update 6 kali per menit untuk mendapatkan smoothing yang memadai dan tidak terlalu jauh dari posisi duduk sebenarnya dengan titik jepret yang merapikan. Jawab 16 16 pada 23:03 menginisialisasi total 0, count0 (setiap kali melihat nilai baru Kemudian satu masukan (scanf), satu menambahkan totalnewValue, satu kenaikan (hitungan), satu rata-rata pembagian (jumlah total) Ini akan menjadi rata-rata bergerak di atas Semua input Untuk menghitung rata-rata hanya di atas 4 masukan terakhir, akan memerlukan 4 variabel input, mungkin menyalin setiap masukan ke inputvariable yang lebih tua, kemudian menghitung rata-rata pergerakan baru. Sebagai jumlah dari 4 variabel input, dibagi 4 (pergeseran kanan 2 akan menjadi Baik jika semua input positif membuat perhitungan rata-rata dijawab 3 Feb 15 at 4:06 Itu benar-benar akan menghitung rata-rata total dan TIDAK rata-rata bergerak. Seiring bertambahnya dampak, setiap sampel masukan baru menjadi sangat kecil ndash Hilmar Feb Stack Exchange, IncI tahu ini dapat dicapai dengan dorongan sesuai: Tapi saya benar-benar ingin menghindari penggunaan dorongan. Saya telah googled dan tidak menemukan contoh yang sesuai atau mudah dibaca. Pada dasarnya saya ingin melacak bergerak Rata-rata arus aliran angka floating point yang sedang berlangsung menggunakan 1000 nomor terbaru sebagai sampel data. Apa cara termudah untuk mencapainya? Saya bereksperimen dengan menggunakan array melingkar, moving average eksponensial dan moving average yang lebih sederhana dan menemukan bahwa hasil dari array melingkar sesuai dengan kebutuhan saya yang terbaik. Tanya 12 Jun 12 at 4:38 Jika kebutuhan Anda sederhana, Anda mungkin hanya mencoba menggunakan rata-rata bergerak eksponensial. Sederhananya, Anda membuat variabel akumulator, dan saat kode Anda melihat setiap sampel, kode akan memperbarui akumulator dengan nilai baru. Anda memilih alpha konstan yaitu antara 0 dan 1, dan hitung ini: Anda hanya perlu menemukan nilai alfa dimana efek sampel tertentu hanya bertahan sekitar 1000 sampel. Hmm, saya tidak yakin ini cocok untuk anda, sekarang saya sudah meletakkannya disini. Masalahnya adalah bahwa 1000 adalah jendela yang cukup panjang untuk rata-rata bergerak eksponensial Im tidak yakin ada alfa yang akan menyebar rata-rata selama 1000 nomor terakhir, tanpa arus dalam perhitungan floating point. Tapi jika Anda menginginkan rata-rata yang lebih kecil, seperti 30 angka atau lebih, ini adalah cara yang sangat mudah dan cepat untuk melakukannya. Jawab 12 Jun pukul 4:44 di posmu Rata-rata pergerakan eksponensial dapat memungkinkan alfa menjadi variabel. Jadi, ini memungkinkannya digunakan untuk menghitung rata-rata basis waktu (misalnya byte per detik). Jika waktu sejak update akumulator terakhir lebih dari 1 detik, Anda membiarkan alpha menjadi 1.0. Jika tidak, Anda bisa membiarkan alpha menjadi (usecs sejak update1000000 terakhir). Ndash jxh 12 Jun 12 at 6:21 Pada dasarnya saya ingin melacak rata-rata bergerak aliran arus dari sebuah angka floating point dengan menggunakan 1000 nomor terbaru sebagai sampel data. Perhatikan bahwa di bawah ini update total sebagai elemen sebagai tambahan yang ditambahkan, hindari tumpang tindih O (N) untuk menghitung jumlah yang dibutuhkan untuk rata-rata - sesuai permintaan. Total dibuat parameter yang berbeda dari T untuk mendukung mis. Menggunakan panjang yang panjang bila total 1000 s panjang, int untuk char s, atau double to total float s. Ini sedikit cacat pada numsamples yang bisa melewati INTMAX - jika Anda peduli Anda bisa menggunakan unsigned long long. Atau gunakan anggota data bool tambahan untuk merekam saat wadah pertama kali diisi saat bersepeda mendekati numamples di sekitar array (terbaik kemudian berganti nama menjadi sesuatu yang tidak berbahaya seperti pos). Dijawab 12 Jun 12 at 5:19 seseorang mengasumsikan bahwa operator quotvoid (T sample) quot sebenarnya adalah quotvoid operatorltlt (T sample) quot. Ndash oPless 8 Jun 14 jam 11:52 oPless ahhh. Baik terlihat Sebenarnya saya bermaksud untuk itu menjadi operator void () (sampel T) tapi tentu saja Anda bisa menggunakan notasi apa pun yang Anda sukai. Akan memperbaiki, terima kasih. Ndash Tony D 8 Jun 14 at 14: 27The Moving Average sebagai Filter Rata-rata bergerak sering digunakan untuk merapikan data dengan adanya noise. Rata-rata pergerakan sederhana tidak selalu dikenali sebagai filter Finite Impulse Response (FIR) yang sebenarnya, padahal sebenarnya adalah filter yang paling umum dalam pemrosesan sinyal. Mengobati itu sebagai filter memungkinkan membandingkannya dengan, misalnya filter windowed-sinc (lihat artikel tentang filter low-pass, high-pass, dan band-pass dan band-reject untuk contohnya). Perbedaan utama dengan filter tersebut adalah bahwa rata-rata bergerak cocok untuk sinyal yang informasi bermanfaatnya terdapat dalam domain waktu. Pengukuran perataan dengan rata-rata adalah contoh utama. Saringan berjejer-sinc, di sisi lain, adalah pemain yang kuat dalam domain frekuensi. Dengan pemerataan dalam pengolahan audio sebagai contoh tipikal. Ada perbandingan yang lebih rinci dari kedua jenis filter dalam Domain Time vs. Frekuensi Kinerja Filter. Jika Anda memiliki data yang baik waktu dan domain frekuensi penting, Anda mungkin ingin melihat Variasi pada Moving Average. Yang menyajikan sejumlah versi bobot rata-rata bergerak yang lebih baik dalam hal itu. Rata-rata pergerakan panjang (N) dapat didefinisikan sebagai ditulis seperti biasanya diterapkan, dengan sampel keluaran saat ini sebagai rata-rata sampel (N) sebelumnya. Terlihat sebagai filter, moving average melakukan konvolusi dari urutan input (xn) dengan pulsa panjang persegi panjang (N) dan tinggi (1N) (untuk membuat area pulsa, dan, karenanya, gain filter , satu ). Dalam prakteknya, yang terbaik adalah mengambil (N) ganjil. Meskipun rata-rata bergerak juga dapat dihitung dengan menggunakan sejumlah sampel, dengan menggunakan nilai ganjil untuk (N) memiliki keuntungan bahwa penundaan filter akan menjadi jumlah sampel integer, karena penundaan filter dengan (N) Contohnya persis ((N-1) 2). Rata-rata bergerak kemudian dapat disesuaikan persis dengan data asli dengan menggesernya dengan bilangan bulat sampel. Domain Waktu Karena rata-rata bergerak adalah konvolusi dengan pulsa persegi panjang, respons frekuensinya adalah fungsi sinc. Hal ini membuat sesuatu seperti dual filter windowed-sinc, karena itu adalah konvolusi dengan pulsa sinc yang menghasilkan respons frekuensi persegi panjang. Ini adalah respon frekuensi sinc yang membuat rata-rata bergerak menjadi pemain miskin dalam domain frekuensi. Namun, kinerjanya sangat bagus dalam domain waktu. Oleh karena itu, sangat sempurna untuk memperlancar data agar terhapus noise sementara pada saat bersamaan tetap melakukan respon langkah cepat (Gambar 1). Untuk Additive White Gaussian Noise (AWGN) biasa yang sering diasumsikan, sampel rata-rata (N) memiliki efek meningkatkan SNR dengan faktor (sqrt N). Karena kebisingan untuk sampel individu tidak berkorelasi, tidak ada alasan untuk memperlakukan setiap sampel secara berbeda. Oleh karena itu, rata-rata bergerak, yang memberi setiap sampel bobot yang sama, akan menyingkirkan jumlah suara maksimal untuk ketajaman respons langkah tertentu. Implementasi Karena itu adalah filter FIR, moving average bisa diimplementasikan melalui konvolusi. Ini kemudian akan memiliki efisiensi yang sama (atau kurang) seperti filter FIR lainnya. Namun, bisa juga diimplementasikan secara rekursif, dengan cara yang sangat efisien. Ini mengikuti langsung dari definisi bahwa Rumus ini adalah hasil dari ungkapan untuk (yn) dan (yn1), yaitu, di mana kita melihat bahwa perubahan antara (yn1) dan (yn) adalah bahwa istilah tambahan (xn1N) muncul di Akhir, sementara istilah (xn-N1N) dihapus dari awal. Dalam aplikasi praktis, seringkali memungkinkan untuk meninggalkan pembagian dengan (N) untuk setiap istilah dengan mengkompensasi keuntungan yang dihasilkan (N) di tempat lain. Implementasi rekursif ini akan jauh lebih cepat daripada konvolusi. Setiap nilai baru (y) dapat dihitung hanya dengan dua penambahan, dan bukan penambahan (N) yang diperlukan untuk implementasi definisi yang langsung. Satu hal yang harus diwaspadai dengan implementasi rekursif adalah kesalahan pembulatan akan terakumulasi. Ini mungkin atau mungkin tidak menjadi masalah bagi aplikasi Anda, namun ini juga menyiratkan bahwa implementasi rekursif ini akan benar-benar bekerja lebih baik dengan implementasi bilangan bulat daripada dengan bilangan floating-point. Ini sangat tidak biasa, karena implementasi floating point biasanya lebih sederhana. Kesimpulan dari semua ini pasti bahwa Anda tidak boleh meremehkan kegunaan filter rata-rata bergerak sederhana dalam aplikasi pemrosesan sinyal. Filter Design Tool Artikel ini dilengkapi dengan alat Filter Design. Percobaan dengan nilai yang berbeda untuk (N) dan visualisasikan filter yang dihasilkan. Coba sekarang

No comments:

Post a Comment