Hilbert transform untuk menghitung amplop sinyal?


27

Saya pernah mendengar bahwa transformasi Hilbert dapat digunakan untuk menghitung amplop sinyal. Bagaimana cara kerjanya? Dan bagaimana "amplop Hilbert" ini berbeda dari amplop yang didapat seseorang hanya dengan memperbaiki sinyal?

Saya tertarik secara khusus dalam menemukan cara untuk menghitung amplop untuk digunakan dalam kompresi rentang dinamis (yaitu, "mengecilkan volume" dari bagian keras dari sinyal audio secara otomatis).


apakah Anda memiliki kode kerja sekarang? baik dengan Hilbert transsform atau metode lain?
Basj

Jawaban:


18

Transformasi Hilbert digunakan untuk menghitung sinyal "analitik". Lihat misalnya http://en.wikipedia.org/wiki/Analytic_signal . Jika sinyal Anda adalah gelombang sinus atau gelombang sinus termodulasi, besarnya sinyal analitik memang akan terlihat seperti amplop. Namun, perhitungan transformasi Hilbert bukanlah hal sepele. Secara teknis membutuhkan filter FIR non-kausal dengan panjang yang cukup besar sehingga akan membutuhkan MIPS, memori, dan latensi dalam jumlah yang wajar.

Untuk sinyal pita lebar, itu sangat tergantung pada bagaimana Anda mendefinisikan "amplop" untuk aplikasi spesifik Anda. Untuk aplikasi kompresi rentang dinamis, Anda menginginkan metrik yang berkorelasi baik dengan persepsi kenyaringan dari waktu ke waktu. Transformasi Hilbert bukanlah alat yang tepat untuk itu.

Pilihan yang lebih baik adalah menerapkan filter berbobot A ( http://en.wikipedia.org/wiki/A- weighting ) dan kemudian melakukan puncak lossy atau detektor RMS lossy. Ini akan berkorelasi cukup baik dengan persepsi kenyaringan dari waktu ke waktu dan relatif murah untuk dilakukan.


Keduanya non-kausal, tetapi apakah metode FFT (membuang setengah spektrum dan IFFT) biasanya lebih cepat daripada filter FIR?
endolith

Juga, bagaimana metode FFT untuk menghitung transformasi Hilbert memerlukan non-kausalitas? Seseorang mungkin hanya membutuhkan jendela yang cukup besar untuk mendapatkan bentuk amplop yang berguna.
mavavilj

4

Anda dapat menggunakan transformasi Hilbert untuk menghitung amplop dengan cara berikut. (Saya akan menuliskannya sebagai kode MATLAB):

envelope = abs(hilbert(yourTimeDomainSignal));

Saya tidak punya waktu untuk menulis matematika sekarang, (saya akan coba nanti), tetapi sangat sederhana, katakan sinyal Anda adalah gelombang sinus. Transformasi Hilbert dari sinus adalah -osina. (Dengan kata lain, transformasi hilbert akan selalu memberi Anda sinyal Anda digeser oleh fase -90 derajat - kuadratur dengan kata lain).

Jika Anda menambahkan sinyal Anda (gelombang sinus) ke jkali sinyal hilberted Anda, (-cosine wave), Anda mendapatkan:

sin(wt) - j.*cos(wt)

Yang juga merupakan e ^ (j * (wt - pi / 2)).

Jadi, ketika Anda mengambil nilai absolut dari ini, Anda mendapatkan 1, yang merupakan amplop Anda. (Untuk kasus ini).


Ups! Lupa tanda negatif - terima kasih Dilip, perbaiki sekarang.
Spacey

2

Saya menyadari setidaknya dua cara terpisah untuk mengambil amplop amplitudo dari sinyal.

Persamaan kuncinya adalah:

E(t)^2 = S(t)^2 + Q(S(t))^2

Where Q represents a π/2 phase shift (also known as quadrature signal).

Cara paling sederhana yang saya ketahui adalah untuk mendapatkan Q adalah dengan menguraikan S (t) menjadi sekelompok komponen sinusoidal menggunakan FFT, memutar setiap komponen seperempat putaran berlawanan arah jarum jam (ingat setiap komponen akan menjadi bilangan kompleks sehingga komponen tertentu x + iy -> -y + ix) lalu rekombinasi.

Pendekatan ini bekerja dengan cukup baik, walaupun membutuhkan sedikit penyetelan (saya belum memahami matematika dengan cukup baik untuk menjelaskan ini dengan cara yang lebih baik)

Ada beberapa istilah kunci di sini, yaitu 'transformasi Hilbert' dan 'sinyal analitik'

Saya menghindari penggunaan istilah-istilah ini karena saya cukup yakin telah menyaksikan ambiguitas yang cukup besar dalam penggunaannya.

Satu dokumen menggambarkan sinyal analitik (kompleks) dari sinyal asli asli f (t) sebagai:

Analytic(f(t)) = f(t) + i.H(f(t))

where H(f(t)) represents the 'π/2 phase shift' of f(t)

dalam hal ini amplop hanyalah | Analytic (f (t)) |, yang membawa kita kembali ke persamaan Pythagoras yang asli

NB: Saya baru-baru ini menemukan teknik yang lebih maju yang melibatkan pengalihan frekuensi dan filter digital lowpass. Teorinya adalah bahwa kita dapat membangun sinyal analitik dengan cara yang berbeda; kami menguraikan f (t) menjadi komponen frekuensi sinusoidal positif dan negatif dan kemudian hanya menghapus komponen negatif dan menggandakan komponen positif. dan dimungkinkan untuk melakukan 'penghapusan komponen frekuensi negatif' ini dengan kombinasi pengalihan frekuensi dan penyaringan lowpass. ini dapat dilakukan dengan sangat cepat menggunakan filter digital. Saya belum menjelajahi pendekatan ini, jadi ini adalah sebanyak yang bisa saya katakan saat ini.


1
Ini semua hanyalah cara berbeda untuk menghitung hal yang sama (besarnya sinyal analitik melalui transformasi Hilbert). Teknik "lanjutan" adalah dengan hanya melakukan FFT, nol frekuensi negatif dan kemudian lakukan FFT terbalik. Bagian yang sebenarnya adalah sinyal asli dan bagian imajiner yang ditransformasikan oleh Hilbert. Iblis ada dalam detail seperti framing, windowing, tumpang tindih, dan pemrosesan linear vs bundar.
Hilmar

2
Sangat menyedihkan melihat bahwa beberapa individu telah melihat layak untuk menghargai waktu dan energi yang telah saya berikan kepada komunitas ini (melalui pos di atas) dengan downvote. Posting yang berisi informasi padat yang baik yang akan bermanfaat bagi seseorang.
P

2
@Hilmar, Ada cara yang lebih baik untuk 'menghilangkan frekuensi negatif' untuk mencapai Hilbert Transform. Seperti yang saya katakan, cara yang tidak melibatkan FFT. Sehubungan dengan hal di atas, saya tidak merasa sangat tertarik untuk memerincinya sekarang.
P

Hargai jawaban terperinci Anda pada transformasi Hilbert; ingin memastikan bahwa ini diterima dengan baik, maka dari itu jangan berkecil hati. Harap abaikan downvote oleh siapa pun.

0

jadi pada dasarnya Anda mencari Automatic Gain Control (AGC). Tidak yakin apakah Anda harus melakukannya dengan memproses secara digital, tetapi ada sirkuit terintegrasi yang sangat bagus di luar sana yang dapat melakukan tugas itu dengan sangat baik, biasanya AGC terintegrasi dengan banyak fitur lain, tetapi beberapa sirkutis dapat dibuat dengan transistor JFET. dan beberapa dioda.

Tetapi cara yang sangat mudah dimengerti untuk melakukan hal ini dengan pemrosesan digital adalah mendesain penaksir varians adaptif, seperti mengambil jendela waktu dari sampel yang cukup untuk mewakili 5 atau 10 msec, dan menerapkan faktor lupa alpha ^ n (alpha <1) sehingga setiap sampel baru yang masuk diperhitungkan lebih dari sampel sebelumnya. kemudian berdasarkan estimasi varians ini Anda merancang sesuai dengan keinginan Anda, fungsi yang memetakan varians untuk keuntungan yang Anda terapkan untuk setiap sampel audio. ini bisa menjadi batas keputusan sulit, sedangkan jika varians melampaui beberapa ambang batas Anda mengurangi keuntungan dengan beberapa faktor.

Atau bisa menjadi batas keputusan yang lebih lunak, di mana Anda membuat transformasi non linear dari varians ke gain, dan menerapkan transformasi untuk setiap sampel berdasarkan estimasi varians terakhir.

Ini adalah metode yang lebih heuristik tetapi setidaknya itu menyelamatkan Anda dari semua matematika yang berat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.