apa yang smoothing dalam hal yang sangat mendasar

17

Apa yang menghaluskan dan bagaimana saya bisa melakukannya?

Saya memiliki array di Matlab yang merupakan spektrum magnitudo dari sinyal ucapan (besarnya 128 titik FFT). Bagaimana cara memuluskan ini menggunakan moving average? Dari apa yang saya mengerti, saya harus mengambil ukuran jendela dari sejumlah elemen, mengambil rata-rata, dan ini menjadi elemen 1 yang baru. Kemudian geser jendela ke kanan dengan satu elemen, ambil rata-rata yang menjadi elemen ke-2, dan seterusnya. Apakah itu benar-benar cara kerjanya? Saya sendiri tidak yakin karena jika saya melakukan itu, pada hasil akhir saya, saya akan memiliki kurang dari 128 elemen. Jadi, bagaimana cara kerjanya dan bagaimana itu membantu kelancaran poin data? Atau adakah cara lain yang bisa saya lakukan perataan data?

EDIT: tautan ke pertanyaan tindak lanjut

Komunitas
sumber
untuk spektrum Anda mungkin ingin rata-rata bersama (dalam dimensi waktu) beberapa spektrum daripada rata-rata berjalan di sepanjang sumbu frekuensi spektrum tunggal
endolith
@endolith keduanya adalah teknik yang valid. Rata-rata dalam domain frekuensi (kadang-kadang disebut Danielle Periodogram) sama dengan windowing dalam domain waktu. Rata-rata beberapa periodogram ("spektra") adalah upaya untuk meniru rata-rata ensembel yang diperlukan pada Periodogram yang sebenarnya (ini disebut Welogram Periode). Juga, sebagai soal semantik, saya berpendapat bahwa "smoothing" adalah filter low-pass non-causual. Lihat Pemfilteran Kalman vs Pemulusan Kalman, pemfilteran Wiener v Pemulusan Wiener, dll. Ada perbedaan nontrivial dan tergantung implementasinya.
Bryan

Jawaban:

23

Menghaluskan dapat dilakukan dengan banyak cara, tetapi dalam istilah yang sangat mendasar dan umum itu berarti Anda bahkan mengeluarkan sinyal, dengan mencampurkan unsur-unsurnya dengan tetangga mereka. Anda mengotori / mengaburkan sinyal sedikit untuk menghilangkan kebisingan. Misalnya, teknik penghalusan yang sangat sederhana adalah, untuk menghitung ulang setiap elemen sinyal f(t)menjadi 0,8 dari nilai aslinya, ditambah 0,1 dari masing-masing tetangganya:

f'(t) = 0.1*f(t-1) + 0.8*f(t) + 0.1*f(t+1)

Perhatikan bagaimana faktor-faktor penggandaan, atau bobot, bertambah menjadi satu. Jadi, jika sinyal cukup konstan, smoothing tidak banyak mengubahnya. Tetapi jika sinyal berisi perubahan dendeng yang tiba-tiba, maka kontribusi dari tetangganya akan membantu untuk membersihkan sedikit kebisingan itu.

Bobot yang Anda gunakan dalam fungsi perhitungan ulang ini bisa disebut kernel . Fungsi Gaussian satu dimensi atau kernel dasar lainnya harus dilakukan dalam kasus Anda.

Contoh bagus dari satu jenis smoothing:

Atas: sinyal tidak terhapus
Di bawah: sinyal dihaluskan

masukkan deskripsi gambar di sini

Contoh beberapa kernel:

masukkan deskripsi gambar di sini

Junuxx
sumber
jadi apakah ini rata-rata bergerak tertimbang? Apakah ini disebut memiliki ukuran jendela 3? Bagaimana dengan elemen 1 dan elemen terakhir? Dan bagaimana ini akan dimodifikasi jika saya memiliki array 128 elemen dan saya ingin menggunakan jendela 16 atau 32 elemen?
@ user13267: Ya, bisa dibilang kernel smoothing adalah moving average tertimbang. Jika Anda menggunakan kernel yang seragam (lihat gambar kedua), itu hanya rata-rata bergerak biasa. Anda benar tentang ukuran jendela. Untuk berurusan dengan tepi, ada tiga pendekatan dasar: 1) nol-padding data Anda, 2) mengulangi nilai terakhir, 3) mirroring sinyal. Dalam semua kasus, Anda membuat beberapa data pura-pura sehingga kernel Anda tidak jatuh ke ketiadaan.
Junuxx
tidak akan menghitung nol padding sebagai jatuh ke dalam ketiadaan? Pada akhir proses rata-rata bergerak, kumpulan data "rata-rata" saya yang baru harus memiliki jumlah data yang sama dengan yang asli, bukan? maka jika saya nol pad itu di awal atau di akhir, atau ulangi data terakhir, bukankah itu bias nilai rata-rata di tepi array? Dan bagaimana cara mirroring sinyal membantu dalam hal jumlah istilah data? Apakah ada tutorial sederhana untuk ini di mana saja yang menunjukkan bagaimana proses berlangsung, katakanlah, 32 titik data dan ukuran jendela 4 atau 5?
2
Jika Anda ingin dataset yang dihaluskan memiliki panjang yang sama dengan dataset asli, Anda harus "membuat" data di titik akhir. Pilihan apa pun yang Anda buat untuk cara membuat data itu bias rata-rata dalam beberapa cara. Memperlakukan data di luar batas sebagai cermin dari dataset nyata (yaitu dengan asumsi bahwa sampel N + 1 sama dengan N-1, N + 2 = N-2, dll.) Akan mempertahankan karakteristik spektrum frekuensi dari bagian akhir dari sinyal, sedangkan dengan asumsi pengulangan nol atau non-nol akan membuatnya tampak bahwa semua frekuensi bergulir di ujungnya.
Russell Borogove
8

Selain jawaban yang bagus dari Junuxx saya ingin memberikan beberapa catatan.

  • Smoothing terkait dengan pemfilteran (sayangnya artikel Wikipedia yang tidak jelas ) - Anda harus memilih yang lebih halus berdasarkan propertinya.

  • Salah satu favorit saya adalah filter median . Ini adalah contoh filter non-linear. Ini memiliki beberapa sifat yang menarik, mempertahankan "ujung" dan cukup kuat di bawah kebisingan besar.

  • Jika Anda memiliki model bagaimana sinyal Anda berperilaku, filter Kalman layak untuk dilihat. Ini smoothing sebenarnya estimasi kemungkinan maksimum sinyal berdasarkan pengamatan.


sumber
4

Smoothing menyiratkan menggunakan informasi dari sampel tetangga untuk mengubah hubungan antara sampel tetangga. Untuk vektor terbatas, di ujungnya, tidak ada informasi tetangga di satu sisi. Pilihan Anda adalah: jangan menghaluskan / memfilter ujungnya, menerima vektor penghalusan yang lebih pendek, membuat data dan memuluskannya (tergantung pada keakuratan / kegunaan prediksi apa pun dari ujungnya), atau mungkin menggunakan kernel smoothing asimetris yang berbeda di ujungnya (yang akhirnya memperpendek konten informasi dalam sinyal).

hotpaw2
sumber
3

Anda dapat menemukan seluruh kode matlab untuk merapikan filter rata-rata bergerak untuk berbagai panjang keran. www.gaussianwaves.com/2010/11/moving-average-filter-ma-filter-2/

humourmind
sumber
1

Orang lain telah menyebutkan bagaimana Anda melakukan smoothing, saya ingin menyebutkan mengapa smoothing berfungsi.

Jika Anda melakukan oversample sinyal Anda dengan benar, itu akan bervariasi relatif sedikit dari satu sampel ke yang berikutnya (sample = titik waktu, piksel, dll), dan diharapkan memiliki penampilan keseluruhan yang halus. Dengan kata lain, sinyal Anda mengandung beberapa frekuensi tinggi, yaitu komponen sinyal yang bervariasi pada tingkat yang mirip dengan laju sampling Anda.

Namun, pengukuran seringkali rusak oleh kebisingan. Dalam perkiraan pertama, kami biasanya mempertimbangkan kebisingan untuk mengikuti distribusi Gaussian dengan rata-rata nol dan deviasi standar tertentu yang hanya ditambahkan di atas sinyal.

Untuk mengurangi noise pada sinyal kami, kami biasanya membuat empat asumsi berikut: noise adalah acak, tidak berkorelasi di antara sampel, memiliki rata-rata nol, dan sinyal cukup oversampled. Dengan asumsi ini, kita dapat menggunakan filter rata-rata geser.

Pertimbangkan, misalnya, tiga sampel berurutan. Karena sinyalnya sangat berlebih, sinyal yang mendasarinya dapat dianggap berubah secara linier, yang berarti bahwa rata-rata sinyal pada ketiga sampel akan sama dengan sinyal sebenarnya pada sampel tengah. Sebaliknya, kebisingan memiliki nilai nol dan tidak berkorelasi, yang berarti rata-rata cenderung nol. Dengan demikian, kita dapat menerapkan filter rata-rata geser tiga sampel, di mana kami mengganti setiap sampel dengan rata-rata antara dirinya dan dua tetangga yang berdekatan.

Tentu saja, semakin besar kita membuat jendela, semakin banyak suara akan rata-rata ke nol, tetapi semakin sedikit asumsi kita tentang linearitas dari sinyal yang benar. Jadi, kita harus melakukan trade-off. Salah satu cara untuk mencoba mendapatkan yang terbaik dari kedua dunia adalah dengan menggunakan rata-rata tertimbang, di mana kami memberikan sampel bobot yang lebih jauh, sehingga kami rata-rata efek kebisingan dari rentang yang lebih besar, sementara tidak terlalu membebani sinyal nyata terlalu banyak di mana itu menyimpang dari linieritas kami. anggapan.

Bagaimana Anda harus meletakkan bobot tergantung pada noise, sinyal, dan efisiensi komputasi, dan, tentu saja, pertukaran antara menghilangkan kebisingan dan memotong sinyal.

Perhatikan bahwa ada banyak pekerjaan yang dilakukan dalam beberapa tahun terakhir untuk memungkinkan kita untuk bersantai beberapa dari empat asumsi, misalnya dengan merancang skema perataan dengan jendela filter variabel (difusi anisotropik), atau skema yang tidak benar-benar menggunakan windows sama sekali (berarti nonlokal).

Jonas
sumber