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?
sumber
Jawaban:
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: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
Contoh beberapa kernel:
sumber
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
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).
sumber
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/
sumber
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).
sumber