Apa yang akan menjadi cara ideal untuk menemukan mean dan standar deviasi sinyal untuk aplikasi waktu nyata. Saya ingin dapat memicu controller ketika sinyal lebih dari 3 standar deviasi dari rata-rata untuk jangka waktu tertentu.
Saya mengasumsikan DSP khusus akan melakukan ini dengan mudah, tetapi apakah ada "jalan pintas" yang mungkin tidak memerlukan sesuatu yang begitu rumit?
statistics
real-time
measurement
jonsca
sumber
sumber
Jawaban:
Ada kekurangan dalam jawaban Jason R, yang dibahas dalam Knuth's "Art of Computer Programming" vol. 2. Masalah muncul jika Anda memiliki standar deviasi yang merupakan sebagian kecil dari rata-rata: perhitungan E (x ^ 2) - (E (x) ^ 2) menderita sensitivitas parah hingga kesalahan pembulatan titik mengambang.
Anda bahkan dapat mencobanya sendiri dalam skrip Python:
Saya mendapatkan -128.0 sebagai jawaban, yang jelas tidak valid secara komputasi, karena matematika memperkirakan bahwa hasilnya harus non-negatif.
Knuth mengutip pendekatan (saya tidak ingat nama penemunya) untuk menghitung rata-rata berjalan dan standar deviasi yang kira-kira seperti ini:
dan kemudian setelah setiap langkah, nilai dari
m
mean, dan standar deviasi dapat dihitung sebagaisqrt(S/n)
atausqrt(S/n-1)
tergantung pada definisi favorit Anda tentang standar deviasi.Persamaan yang saya tulis di atas sedikit berbeda dari yang ada di Knuth, tetapi ini setara secara komputasi.
Ketika saya memiliki beberapa menit lagi, saya akan memberi kode rumus di atas dalam Python dan menunjukkan bahwa Anda akan mendapatkan jawaban yang tidak negatif (yang diharapkan dekat dengan nilai yang benar).
pembaruan: ini dia.
test1.py:
hasil:
Anda akan mencatat bahwa masih ada beberapa kesalahan pembulatan, tetapi itu tidak buruk, sedangkan
naive_stats
hanya muntah.sunting: Hanya memperhatikan komentar Belisarius yang mengutip Wikipedia yang menyebutkan algoritma Knuth.
sumber
Pendekatan yang tepat dalam situasi seperti ini biasanya untuk menghitung rata-rata berlari tertimbang secara eksponensial dan standar deviasi. Dalam eksponensial tertimbang rata-rata, perkiraan mean dan varians bias terhadap sampel terbaru memberikan Anda memperkirakan mean dan varians selama terakhir detikτ , yang mungkin apa yang Anda inginkan, daripada biasa aritmatika rata-rata semua sampel yang pernah dilihat.
Dalam domain frekuensi, "rata-rata berlari tertimbang secara eksponensial" hanyalah kutub nyata. Mudah diterapkan di domain waktu.
Implementasi domain waktu
Biarkan
mean
danmeansq
jadilah estimasi saat ini dari mean dan mean dari kuadrat dari sinyal. Pada setiap siklus, perbarui estimasi ini dengan sampel barux
:Di sini adalah konstanta yang menentukan panjang efektif rata-rata berjalan. Bagaimana memilih dijelaskan di bawah ini di "analisis".0 < a < 1 Sebuah
Apa yang dinyatakan di atas sebagai program imperatif juga dapat digambarkan sebagai diagram aliran sinyal:
Analisis
Algoritma di atas menghitung mana adalah input pada sampel , dan adalah output (yaitu estimasi rata-rata). Ini adalah filter IIR tiang tunggal yang sederhana. Mengambil transformasi , kami menemukan fungsi transfer .ysaya= a xsaya+ ( 1 - a ) yi - 1 xsaya saya yi z
Mengondensasi filter IIR ke dalam blok mereka sendiri, diagram sekarang terlihat seperti ini:
Untuk menuju ke domain kontinu, kami membuat substitusi mana adalah waktu sampel dan adalah laju sampel. Memecahkan , kami menemukan bahwa sistem kontinu memiliki kutub pada .z=esT T fs=1/T 1−(1−a)e−sT=0 s=1Tlog(1−a)
Pilih :a
Referensi
sumber
0 > a > 1
0 < a < 1
. Jika sistem Anda memiliki sampel pengambilan sampelT
dan Anda ingin rata-rata waktu konstantau
, maka piliha = 1 - exp (2*pi*T/tau)
.z=1
(DC) keH(z) = a/(1-(1-a)/z)
dan Anda mendapatkan 1.Metode yang saya gunakan sebelumnya dalam aplikasi pemrosesan tertanam adalah untuk mempertahankan akumulator jumlah dan jumlah kuadrat dari sinyal yang menarik:
Juga, pantau instan waktu saat ini dalam persamaan di atas (yaitu, perhatikan jumlah sampel yang telah Anda tambahkan ke akumulator). Kemudian, mean sampel dan simpangan baku pada saat adalah:i i
atau Anda dapat menggunakan:
tergantung pada metode estimasi standar deviasi yang Anda inginkan . Persamaan ini didasarkan pada definisi varians :
Saya telah menggunakan ini dengan sukses di masa lalu (meskipun saya hanya peduli dengan estimasi varians, bukan standar deviasi), meskipun Anda harus berhati-hati tentang tipe numerik yang Anda gunakan untuk memegang akumulator jika Anda akan menjumlahkan periode waktu yang lama; Anda tidak ingin meluap.
Sunting: Selain komentar di atas tentang overflow, harus dicatat bahwa ini bukan algoritma yang kuat secara numerik ketika diterapkan dalam aritmatika titik-mengambang, berpotensi menyebabkan kesalahan besar dalam perkiraan statistik. Lihatlah jawaban Jason S untuk pendekatan yang lebih baik dalam kasus itu.
sumber
Mirip dengan jawaban yang disukai di atas (Jason S.), dan juga berasal dari rumus yang diambil dari Knut (Vol.2, p 232), orang juga dapat memperoleh rumus untuk mengganti nilai, yaitu menghapus dan menambahkan nilai dalam satu langkah . Menurut pengujian saya, ganti memberikan presisi yang lebih baik daripada versi dua-langkah hapus / tambah.
Kode di bawah ini di Jawa,
mean
dans
dapatkan pembaruan (variabel anggota "global"), sama sepertim
dans
di atas dalam posting Jason. Nilaicount
mengacu pada ukuran jendelan
.sumber
Jawaban Jason dan Nibot berbeda dalam satu aspek penting: Metode Jason menghitung std dev dan rata-rata untuk seluruh sinyal (karena y = 0), sedangkan Nibot adalah perhitungan "berjalan", yaitu menimbang sampel yang lebih baru lebih kuat daripada sampel dari masa lalu yang jauh.
Karena aplikasi tampaknya memerlukan std dev dan berarti sebagai fungsi waktu, metode Nibot mungkin yang lebih tepat (untuk aplikasi spesifik ini). Namun, bagian yang sulit sebenarnya adalah untuk mendapatkan bagian pembobotan waktu yang tepat. Contoh Nibot menggunakan filter tiang tunggal sederhana.
Pilihan filter lowpass dapat dipandu oleh apa yang Anda ketahui tentang sinyal Anda dan resolusi waktu yang Anda butuhkan untuk estimasi Anda. Frekuensi cutoff yang lebih rendah dan urutan yang lebih tinggi akan menghasilkan akurasi yang lebih baik tetapi waktu respons lebih lambat.
Untuk menyulitkan lebih lanjut, satu filter diterapkan dalam domain linier dan lainnya dalam domain kuadrat. Mengkuadratkan secara signifikan mengubah konten spektral sinyal sehingga Anda mungkin ingin menggunakan filter yang berbeda dalam domain kuadrat.
Berikut adalah contoh tentang cara memperkirakan mean, rms dan std dev sebagai fungsi waktu.
sumber
y1 = filter(a,[1 (1-a)],x);
.