Pengukur untuk pengurangan spektral yang lebih baik dari kebisingan


8

Noise Gaussian white zero-mean yang nyata, tidak tergantung pada sinyal bersih x dan varian yang dikenal ditambahkan ke x menghasilkan sinyal berisik y. Transformasi Fourier Diskrit (DFT) Y dari sinyal bising dihitung dengan:

(1)Yk=1Nn=0N1ei2πkn/Nyn.

Ini hanya untuk konteks, dan kami akan mendefinisikan varians noise di domain frekuensi, sehingga normalisasi (atau ketiadaan) tidak penting. Gaussian white noise dalam domain waktu adalah Gaussian white noise dalam domain frekuensi, lihat pertanyaan: " Apakah statistik dari transformasi Fourier diskrit dari white Gaussian white? ". Karena itu kita dapat menulis:

Yk=Xk+Zk,

dimana X dan Z adalah DFT tentang sinyal bersih dan kebisingan, dan Zk bin kebisingan yang mengikuti distribusi varians Gaussian kompleks simetris sirkular σ2. Masing-masing bagian nyata dan imajinerZk secara independen mengikuti distribusi varian Gaussian 12σ2. Kami mendefinisikan rasio signal-to-noise (SNR) dari binYk sebagai:

SNR=σ2|Xk|2.

Upaya untuk mengurangi noise kemudian dilakukan dengan pengurangan spektral, di mana besarnya setiap bin Yksecara independen dikurangi sambil mempertahankan fase asli (kecuali nilai nampan pergi ke nol dalam pengurangan besarnya). Pengurangan membentuk estimasi|Xk|2^ dari alun-alun |Xk|2 dari nilai absolut dari setiap nampan DFT dari sinyal bersih:

(2)|Xk|2^=|Yk|2σ2,

dimana σ2adalah varian noise yang diketahui di setiap nampan DFT. Untuk kesederhanaan, kami tidak mempertimbangkank=0, atau k=N/2 bahkan untuk N, yang merupakan kasus khusus nyata x. Pada SNR rendah, formulasi dalam (2) kadang-kadang dapat menghasilkan negatif |Xk|2^. Kami dapat menghapus masalah ini dengan menjepit perkiraan ke nol dari bawah, mendefinisikan ulang:

(3)|Xk|2^=max(|Yk|2σ2,0).

masukkan deskripsi gambar di sini
Gambar 1. Estimasi Monte Carlo dengan ukuran sampel dari: Solid: gain jumlah galat kuadrat dalam mengestimasioleh dibandingkan dengan memperkirakannya dengan putus-putus: gain dari jumlah kesalahan kuadrat dalam memperkirakan oleh dibandingkan dengan memperkirakannya dengan bertitik: gain dari jumlah kesalahan kuadrat dalam memperkirakan dengan dibandingkan dengan memperkirakan denganDefinisi dari (3) digunakan.105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.|Xk|2^

Pertanyaan: Apakah ada perkiraan lainatau yang membaik pada (2) dan (3) tanpa bergantung pada distribusi ?|Xk||Xk|2Yk

Saya pikir masalahnya setara dengan memperkirakan kuadrat dari parameter dari distribusi Beras (Gbr. 2) dengan parameter yang diketahui diberi satu pengamatan.νRiceσRice=22σ,

masukkan deskripsi gambar di sini
Gambar 2. Distribusi Beras adalah distribusi jarak ke asal dari titik yang mengikuti distribusi normal simetris bivariat sirkular dengan nilai absolut dari rata-rata varian dan varians komponenRνRice,2σRice2=σ2σRice2=12σ2.

Saya menemukan beberapa literatur yang tampaknya relevan:

  • Jan Sijbers, Arnold J. den Dekker, Paul Scheunders dan Dirk Van Dyck, "Estimasi Kemungkinan Maksimum dari parameter distribusi Rician" , Transaksi IEEE pada Pencitraan Medis (Volume: 17, Edisi: 3, Juni 1998) ( doi , pdf ).

Skrip Python A untuk kurva penduga

Skrip ini dapat diperluas untuk memplot kurva penduga dalam jawaban.

import numpy as np
from mpmath import mp
import matplotlib.pyplot as plt

def plot_est(ms, est_as):
    fig = plt.figure(figsize=(4,4))
    ax = fig.add_subplot(1, 1, 1)
    if len(np.shape(est_as)) == 2:
        for i in range(np.shape(est_as)[0]):
            plt.plot(ms, est_as[i])
    else:
        plt.plot(ms, est_as)    
    plt.axis([ms[0], ms[-1], ms[0], ms[-1]])
    if ms[-1]-ms[0] < 5:
        ax.set_xticks(np.arange(np.int(ms[0]), np.int(ms[-1]) + 1, 1))
        ax.set_yticks(np.arange(np.int(ms[0]), np.int(ms[-1]) + 1, 1))
    plt.grid(True)
    plt.xlabel('$m$')
    h = plt.ylabel('$\hat a$')
    h.set_rotation(0)
    plt.show()

Skrip Python B untuk Gambar. 1

Script ini dapat diperpanjang untuk kurva gain kesalahan dalam jawaban.

import math
import numpy as np
import matplotlib.pyplot as plt

def est_a_sub_fast(m):
    if m > 1:
        return np.sqrt(m*m - 1)
    else:
        return 0

def est_gain_SSE_a(est_a, a, N):
    SSE = 0
    SSE_ref = 0
    for k in range(N):  #Noise std. dev = 1, |X_k| = a
        m = abs(complex(np.random.normal(a, np.sqrt(2)/2), np.random.normal(0, np.sqrt(2)/2)))
        SSE += (a - est_a(m))**2 
        SSE_ref += (a - m)**2
    return SSE/SSE_ref

def est_gain_SSE_a2(est_a, a, N):
    SSE = 0
    SSE_ref = 0
    for k in range(N):  #Noise std. dev = 1, |X_k| = a
        m = abs(complex(np.random.normal(a, np.sqrt(2)/2), np.random.normal(0, np.sqrt(2)/2)))
        SSE += (a**2 - est_a(m)**2)**2
        SSE_ref += (a**2 - m**2)**2
    return SSE/SSE_ref

def est_gain_SSE_complex(est_a, a, N):
    SSE = 0
    SSE_ref = 0
    for k in range(N):  #Noise std. dev = 1, X_k = a
        Y = complex(np.random.normal(a, np.sqrt(2)/2), np.random.normal(0, np.sqrt(2)/2))        
        SSE += abs(a - est_a(abs(Y))*Y/abs(Y))**2
        SSE_ref += abs(a - Y)**2
    return SSE/SSE_ref

def plot_gains_SSE(as_dB, gains_SSE_a, gains_SSE_a2, gains_SSE_complex, color_number = 0):    
    colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
    fig = plt.figure(figsize=(7,4))
    ax = fig.add_subplot(1, 1, 1)
    if len(np.shape(gains_SSE_a)) == 2:
        for i in range(np.shape(gains_SSE_a)[0]):
            plt.plot(as_dB, gains_SSE_a[i], color=colors[i], )
            plt.plot(as_dB, gains_SSE_a2[i], color=colors[i], linestyle='--')
            plt.plot(as_dB, gains_SSE_complex[i], color=colors[i], linestyle=':')
    else:
        plt.plot(as_dB, gains_SSE_a, color=colors[color_number])
        plt.plot(as_dB, gains_SSE_a2, color=colors[color_number], linestyle='--')
        plt.plot(as_dB, gains_SSE_complex, color=colors[color_number], linestyle=':')
    plt.grid(True)
    plt.axis([as_dB[0], as_dB[-1], 0, 2])
    plt.xlabel('SNR (dB)')
    plt.ylabel('SSE gain')
    plt.show()

as_dB = range(-40, 41)
as_ = [10**(a_dB/20) for a_dB in as_dB]
gains_SSE_a_sub = [est_gain_SSE_a(est_a_sub_fast, a, 10**5) for a in as_]
gains_SSE_a2_sub = [est_gain_SSE_a2(est_a_sub_fast, a, 10**5) for a in as_]
gains_SSE_complex_sub = [est_gain_SSE_complex(est_a_sub_fast, a, 10**5) for a in as_]

plot_gains_SSE(as_dB, gains_SSE_a_sub, gains_SSE_a2_sub, gains_SSE_complex_sub, 1)

2
Astaga, pertanyaan klarifikasi: "Ini hanya untuk konteks, jadi normalisasi tidak penting. Kebisingan kemudian dikurangi dengan pengurangan spektral, di mana besarnya setiap bin Yk berkurang secara independen sambil mempertahankan fase asli (kecuali nilai bin berjalan ke nol dalam pengurangan besarnya). "Apa yang membuat Anda mengatakan ini adalah operasi pengurangan kebisingan? Jika kebisingan dapat menuju ke arah mana pun, bagi saya tampaknya hal ini akan memperbesar kebisingan apa pun untuk melemahkannya.
Cedron Dawg


2
@CedronDawg: Jika kita mengasumsikan independensi sinyal dan noise, kekuatannya akan bertambah, sehingga sinyal (power) diperoleh dengan mengurangi estimasi kekuatan noise. Jadi dalam hal kekuatan, kebisingan hanya bisa berjalan dalam satu arah.
Matt L.

1
@OlliNiemitalo: Apakah Anda tahu makalah mendasar ini oleh Ephraim dan Malah? Mereka memperoleh estimator optimal untuk amplitudo sinyal, yang merupakan peningkatan dari pengurangan spektral sederhana.
Matt L.

1
@OlliNiemitalo: Koefisien DFT diasumsikan Gaussian (untuk sinyal yang diinginkan dan juga untuk noise), sehingga amplitudo memiliki distribusi Rayleigh. Lih Persamaan (5) dan (6) di koran.
Matt L.

Jawaban:


7

Penaksir kemungkinan maksimum (ML)

Di sini akan diturunkan penduga kemungkinan maksimum dari kekuatan sinyal bersih, tetapi tampaknya tidak meningkatkan hal-hal dalam hal kesalahan kuadrat akar rata-rata, untuk SNR apa pun, dibandingkan dengan pengurangan daya spektral.

pengantar

Mari kita memperkenalkan dinormalisasi amplitudo bersih dan dinormalisasi besarnya berisik dinormalisasi dengan deviasi standar kebisinganamσ:

(1)a=|Xk|σ,m=|Yk|σ.

Estimator dalam Persamaan. 3 dari pertanyaan memberikan perkiraan dari sebagai:a^a

(2)a^=1σ|Xk|2^=1σmax((σm)2σ2,0)={m21if m>1,0if m1.

Estimasi kemungkinan maksimum

Untuk membuat estimator mungkin lebih baik dari daripada Persamaan. 2, kami mengikuti prosedur Sijbers et al. 1998. (lihat pertanyaan) untuk membuat estimator kemungkinan maksimum (ML)Ini memberikan nilai yang memaksimalkan probabilitas nilai yang diberikanaa^ML.am.

PDF dariadalah Rician dengan parameterdan parameter (untuk diganti nanti untuk kejelasan)|Yk|νRice=|Xk|σRice=12σ:

(3)PDF(|Yk|)=|Yk|σRice2exp((|Yk|2+|Xk|2)2σRice2)I0(|Yk||Xk|σRice2),

di mana adalah fungsi Bessel yang dimodifikasi dari jenis pertama . Mengganti danIα|Xk|=σa, |Yk|=σm,σRice2=12σ2:

(3.1)=PDF(σm)=2mσe(m2+a2)I0(2ma),

dan mentransformasikan:

(3.2)PDF(m)=σPDF(σm)=2me(m2+a2)I0(2ma).

Rician PDF dari parameter tidak tergantung pada varians derauMaksimum kemungkinan estimator parameter merupakan nilai yang memaksimalkan . Ini adalah solusi dari:maσ2.a^MLaaPDF(m)

(4)mI1(2ma^ML)I0(2ma^ML)a^ML=0.

Solusi untuk Persamaan. 4 memiliki properti yang:

(5)a^ML=0 if m1.

Kalau tidak, itu harus diselesaikan secara numerik.

masukkan deskripsi gambar di sini
Gambar 1. biru, atas: estimator kemungkinan maksimum dan oranye, lebih rendah: estimator pengurangan daya spektral pertanyaan dari amplitudo bersih dinormalisasi , sebagai fungsi dari besaran bising berisik dinormalisasia^MLa^am.

σa^ML adalah penaksir kemungkinan maksimum dari dan dengan invarian fungsional estimasi kemungkinan maksimum, adalah penaksir kemungkinan maksimum dari|Xk|,σ2a^ML2|Xk|2.

Seri penduga empiris dari estimator ML

Saya mencoba menghitung secara numerik (lihat skrip lebih lanjut di bawah) seri Laurent dari tetapi sepertinya tidak konvergen untuk kisaran dibutuhkan. Berikut adalah pemotongan dari seri Laurent sejauh yang saya hitung:a^ML2,m

(6)a^ML2m2121m0123m2325m41227m65729m8309211m101884213m1212864215m1498301217m16839919219m187999311221m20

Saya tidak dapat menemukan urutan integer pembilang atau penyebut dalam On-line Encyclopedia of Integer Sequences (OEIS). Hanya untuk lima syarat daya negatif pertama, koefisien pembilang cocok dengan A027710 . Namun, setelah mengirimkan urutan yang dihitung ( ) ke OEIS Superseeker , saya mendapatkan jawaban ini (dari mana saya mengkonfirmasi tiga nomor yang disarankan berikutnya dengan perhitungan yang diperluas):1,1,1,3,84437184,980556636,12429122844

Guesss suggests that the generating function  F(x)
may satisfy the following algebraic or differential equation:

-1/2*x+1/2+(-x+1/2)*x*diff(F(x),x)+(x-3/2)*F(x)-1/2*F(x)*x*diff(F(x),x)+F(x)^2 = 0

If this is correct the next 6 numbers in the sequence are:

[-84437184, -980556636, -12429122844, -170681035692, -2522486871192, -39894009165525]

Perkiraan kesalahan estimasi dan estimasi galat

Tabel interpolasi linier (lihat skrip di bawah ini) berisi sampel tidak seragam memberikan perkiraan dengan kesalahan maksimum sekitar124071a^ML2m26×1011.

Perkiraan kuadrat terkecil dari estimator ML

Perkiraan kuadrat terkecil (dengan bobot ekstra pada ) dari sampel kurva estimator telah dibuat, dalam bentuk yang terinspirasi oleh eksperimen seri Laurent (lihat skrip Oktaf lebih jauh ke bawah). Istilah konstan diubah untuk menghilangkan kemungkinan negatif pada Perkiraan ini berlaku untuk dan memiliki kesalahan maksimum sekitar (Gambar . 3) dalam perkiraanm2=1- 0.5- 0.49999998237308493999a2m2=1.m212×105a^ML2:

a^2 = m^2 - 0.49999998237308493999 -0.1267853520007855/m^2 - 0.02264263789612356/m^4 - 1.008652066326489/m^6 + 4.961512935048501/m^8 - 12.27301424767318/m^10 + 5.713416605734312/m^12 + 21.55623892529696/m^14 - 38.15890985013438/m^16 + 24.77625343690267/m^18 - 5.917417766578400/m^20

masukkan deskripsi gambar di sini
Gambar 3. Kesalahan perkiraan kuadrat terkecil daria^ML2.

Skrip ini tampaknya mampu menangani peningkatan jumlah kekuatan negatif secara konsisten memberikan kesalahan yang lebih kecil dan lebih kecil, dengan jumlah ekstrem kesalahan yang tumbuh, tetapi dengan kerusakan kesalahan maksimum yang cukup lambat. Perkiraannya hampir sama, tetapi masih akan mendapat sedikit manfaat dari perbaikan pertukaran Remez .m2,

Dengan menggunakan perkiraan, kurva gain kesalahan yang diharapkan berikut ini diperoleh:

masukkan deskripsi gambar di sini
Gambar 2. Estimasi Monte Carlo dengan ukuran sampel dari: Solid: gain jumlah kesalahan kuadrat dalam mengestimasioleh dibandingkan dengan memperkirakannya dengan putus-putus: gain dari jumlah kesalahan kuadrat dalam memperkirakan oleh dibandingkan dengan memperkirakannya dengan bertitik: gain dari jumlah kesalahan kuadrat dalam memperkirakan dengan dibandingkan dengan memperkirakan denganBiru: estimator ML, oranye: pengurangan daya spektral yang dijepit.105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.

Secara mengejutkan, estimator ML lebih buruk daripada pengurangan daya spektral yang dijepit di hampir semua aspek, kecuali karena secara marginal lebih baik untuk estimasi sinyal di SNR> sekitar 5 dB, dan estimasi amplitudo di SNR> sekitar 3 dB. Pada SNR tersebut, kedua estimator lebih buruk daripada hanya menggunakan sinyal berisik sebagai estimasi.

Skrip Python A untuk Gambar. 1

Skrip ini memperluas skrip pertanyaan A.

def est_a_sub(m):
    m = mp.mpf(m)
    if m > 1:
        return mp.sqrt(m**2 - 1)
    else:
        return 0

def est_a_ML(m):
    m = mp.mpf(m)
    if m > 1:
        return mp.findroot(lambda a: m*mp.besseli(1, 2*a*m)/(mp.besseli(0, 2*a*m)) - a, [mp.sqrt(2*m**2*(m**2 - 1)/(2*m**2 - 1)), mp.sqrt(m**2-0.5)])
    else:
        return 0

def est_a_ML_fast(m): 
    m = mp.mpf(m)
    if m > 1:
        return mp.sqrt(m**2 - mp.mpf('0.49999998237308493999') - mp.mpf('0.1267853520007855')/m**2 - mp.mpf('0.02264263789612356')/m**4 - mp.mpf('1.008652066326489')/m**6 + mp.mpf('4.961512935048501')/m**8 - mp.mpf('12.27301424767318')/m**10 + mp.mpf('5.713416605734312')/m**12 + mp.mpf('21.55623892529696')/m**14 - mp.mpf('38.15890985013438')/m**16 + mp.mpf('24.77625343690267')/m**18 - mp.mpf('5.917417766578400')/m**20)
    else:
        return 0

ms = np.arange(0, 5.0078125, 0.0078125)
est_as = [[est_a_ML(m) for m in ms], [est_a_sub(m) for m in ms]];
plot_est(ms, est_as)

Skrip python untuk perhitungan numerik seri Laurent

Skrip ini menghitung secara numerik beberapa istilah pertama dari rangkaian Laurent dariIni didasarkan pada skrip dalam jawaban ini .a^ML2m2.

from sympy import *
from mpmath import *
num_terms = 10
num_decimals = 12
num_use_decimals = num_decimals + 5 #Ad hoc headroom
def y(a2):
    return sqrt(m2)*besseli(1, 2*sqrt(a2*m2))/besseli(0, 2*sqrt(a2*m2)) - sqrt(a2)

c = []
h = mpf('1e'+str(num_decimals))
denominator = mpf(2)  # First integer denominator. Use 1 if unsure
denominator_ratio = 4  # Denominator multiplier per step. Use 1 if unsure
print("x")
for i in range(0, num_terms):
    mp.dps = 2*2**(num_terms - i)*num_use_decimals*(i + 2) #Ad hoc headroom
    m2 = mpf('1e'+str(2**(num_terms - i)*num_use_decimals))
    r = findroot(y, [2*m2*(m2 - 1)/(2*m2 - 1),  m2-0.5]) #Safe search range, must be good for the problem
    r = r - m2; # Part of the problem definition
    for j in range(0, i):
        r = (r - c[j])*m2
    c.append(r)
    mp.dps = num_decimals
    print '+'+str(nint(r*h)*denominator/h)+'/('+str(denominator)+'x^'+str(i)+')'
    denominator *= denominator_ratio

Skrip python untuk tabulasi estimator ML

Skrip ini membuat tabel sampel tidak rata dari pasangan cocok untuk interpolasi linier, memberikan kira-kira kesalahan interpolasi linear absolut maksimum yang ditentukan kira-kira untuk rentangUkuran tabel secara otomatis meningkat dengan menambahkan sampel ke bagian yang sulit, sampai kesalahan puncak cukup kecil. Jika sama dengan ditambah kekuatan bilangan bulat maka semua interval pengambilan sampel akan menjadi kekuatan Pada akhir tabel akan ada transisi bebas diskontinuitas ke aproksimasi besar-[m2,a^ML2]a^ML2m=0mmax.mmax22,2.ma^ML2=m212.Jika diperlukan, tebakan saya adalah bahwa lebih baik untuk menginterpolasi tabel sebagaimana adanya dan kemudian melakukan konversia^MLa^ML=a^ML2.

Untuk digunakan bersama dengan skrip berikutnya, pipa output > linear.m.

import sys # For writing progress to stderr (won't pipe when piping output to a file)
from sympy import *
from mpmath import *
from operator import itemgetter
max_m2 = 2 + mpf(2)**31 # Maximum m^2
max_abs_error = 2.0**-34 #Maximum absolute allowed error in a^2
allow_over = 0 #Make the created samples have max error (reduces table size to about 7/10)
mp.dps = 24
print('# max_m2='+str(max_m2))
print('# max_abs_error='+str(max_abs_error))
def y(a2):
    return sqrt(m2)*besseli(1, 2*sqrt(a2*m2))/besseli(0, 2*sqrt(a2*m2)) - sqrt(a2)

# [m2, a2, following interval tested good]
samples = [[0, 0, True], [1, 0, False], [max_m2, max_m2 - 0.5, True]]

m2 = mpf(max_m2)
est_a2 = findroot(y, [2*m2*(m2 - 1)/(2*m2 - 1),  m2-0.5])
abs_error = abs(est_a2 - samples[len(samples) - 1][1])
if abs_error > max_abs_error:
    sys.stderr.write('increase max_m, or increase max_abs_error to '+str(abs_error)+'\n')
    quit()

peak_taken_abs_error = mpf(max_abs_error*allow_over)
while True:
    num_old_samples = len(samples)
    no_new_samples = True
    peak_trial_abs_error = peak_taken_abs_error
    for i in range(num_old_samples - 1):
        if samples[i][2] == False:
            m2 = mpf(samples[i][0] + samples[i + 1][0])/2
            est_a2 = mpf(samples[i][1] + samples[i + 1][1])/2
            a2 = findroot(y, [2*m2*(m2 - 1)/(2*m2 - 1),  m2-0.5])
            est_abs_error = abs(a2-est_a2)
            if peak_trial_abs_error < est_abs_error:
                peak_trial_abs_error = est_abs_error
            if est_abs_error > max_abs_error:                
                samples.append([m2, a2 + max_abs_error*allow_over, False])
                no_new_samples = False
            else:
                samples[i][2] = True
                if peak_taken_abs_error < est_abs_error:
                    peak_taken_abs_error = est_abs_error
    if no_new_samples == True:
        sys.stderr.write('error='+str(peak_taken_abs_error)+', len='+str(len(samples))+'\n')
        print('# error='+str(peak_taken_abs_error)+', len='+str(len(samples)))
        break
    sys.stderr.write('error='+str(peak_trial_abs_error)+', len='+str(len(samples))+'\n')
    samples = sorted(samples, key=itemgetter(0))

print('global m2_to_a2_table = [')
for i in range(len(samples)):
    if i < len(samples) - 1:
      print('['+str(samples[i][0])+', '+str(samples[i][1])+'],')
    else:
      print('['+str(samples[i][0])+', '+str(samples[i][1])+']')
print('];')

Skrip Python B untuk Gambar. 2

Skrip ini memperluas skrip pertanyaan B.

def est_a_ML_fast(m): 
    mInv = 1/m
    if m > 1:
        return np.sqrt(m**2 - 0.49999998237308493999 - 0.1267853520007855*mInv**2 - 0.02264263789612356*mInv**4 - 1.008652066326489*mInv**6 + 4.961512935048501*mInv**8 - 12.27301424767318*mInv**10 + 5.713416605734312*mInv**12 + 21.55623892529696*mInv**14 - 38.15890985013438*mInv**16 + 24.77625343690267*mInv**18 - 5.917417766578400*mInv**20)
    else:
        return 0

gains_SSE_a_ML = [est_gain_SSE_a(est_a_ML_fast, a, 10**5) for a in as_]
gains_SSE_a2_ML = [est_gain_SSE_a2(est_a_ML_fast, a, 10**5) for a in as_]
gains_SSE_complex_ML = [est_gain_SSE_complex(est_a_ML_fast, a, 10**5) for a in as_]
plot_gains_SSE(as_dB, [gains_SSE_a_ML, gains_SSE_a_sub], [gains_SSE_a2_ML, gains_SSE_a2_sub], [gains_SSE_complex_ML, gains_SSE_complex_sub])

Skrip oktaf untuk kuadrat terkecil

Skrip Oktaf ini (adaptasi dari jawaban ini ) melakukan kuadrat paling tidak sesuai dengan kekuatan menjadi . Sampel disiapkan oleh skrip Python sedikit di atas.m2a^ML2(m212)

graphics_toolkit("fltk");
source("linear.m");
format long
dup_zero = 2000000  # Give extra weight to m2 = 1, a2 = 0
max_neg_powers = 10  # Number of negative powers in the polynomial
m2 = m2_to_a2_table(2:end-1,1);
m2 = vertcat(repmat(m2(1), dup_zero, 1), m2);
A = (m2.^-[1:max_neg_powers]);
a2_target = m2_to_a2_table(2:end-1,2);
a2_target = vertcat(repmat(a2_target(1), dup_zero, 1), a2_target);
fun_target = a2_target - m2 + 0.5;
disp("Cofficients for negative powers of m^2:")
x = A\fun_target
a2 = A*x + m2 - 0.5;
plot(sqrt(m2), sqrt(a2)) # Plot approximation
xlim([0, 3])
ylim([0, 3])
a2(1)  # value at m2 = 2
abs_residual = abs(a2-a2_target);
max(abs_residual) # Max abs error of a^2
max(abs(sqrt(a2)-sqrt(a2_target))) # Max abs error of a
plot(sqrt(log10(m2)), a2_target - a2) # Plot error
xlabel("sqrt(log(m^2))")
ylabel("error in approximation of hat a^2_{ML}")

Skrip Python A2 untuk perkiraan menggunakan polinomial Chebyshev

Skrip ini memperluas skrip A dan memberikan perkiraan alternatif estimator ML menggunakan polinomial Chebyshev. Node Chebyshev pertama adalah pada dan jumlah polinomial Chebyshev sedemikian rupa sehingga perkiraannya adalah tidak negatif.m=1

N = 20
est_a_ML_poly, err = mp.chebyfit(lambda m2Reciprocal: est_a_ML(mp.sqrt(1/m2Reciprocal))**2 - 1/m2Reciprocal, [0, 2/(mp.cos(mp.pi/(2*N)) + 1)], N, error=True)

def est_a_ML_fast(m): 
    global est_a_ML_poly
    m = mp.mpf(m)
    if m > 1:
        return mp.sqrt(m**2 + mp.polyval(est_a_ML_poly, 1/m**2))
    else:
        return 0

4

Memperbarui:

Saya minta maaf harus mengatakan bahwa pengujian menunjukkan argumen berikut ini sepertinya rusak di bawah kebisingan yang besar. Ini bukan yang saya harapkan, jadi saya pasti belajar sesuatu yang baru. Pengujian saya sebelumnya semuanya berada dalam kisaran SNR tinggi karena fokus saya adalah menemukan solusi yang tepat dalam kasus tanpa suara.


Olli,

Jika tujuan Anda adalah menemukan parameter nada murni dalam sinyal bising, Anda seharusnya mengatakannya. Masalah ini, saya punya banyak pengalaman dan keahlian dalam.

Anda mengatakan Anda sedang mencari amplitudo (dan fase datang dengan itu) jadi saya yakin Anda berbaris DFT Anda untuk memiliki sejumlah siklus. Ini adalah konfigurasi terburuk untuk situasi ini karena Anda kemudian berurusan dengan sinyal Anda hanya dalam satu tempat terhadap kebisingan di tempat itu.

Seperti yang telah Anda tunjukkan di atas, semakin besar SNR semakin buruk trik Anda, sampai pada titik yang merugikan atau di luarnya. Nah, tempat menarik Anda akan menjadi yang memiliki SNR tertinggi.

Yang ingin Anda lakukan adalah menyelaraskan bingkai DFT Anda pada keseluruhan ditambah satu setengah siklus. Ini akan menyebarkan sinyal Anda ke sampah sebanyak mungkin. Kemudian Anda dapat menemukan fase dan amplitudo seperti yang dijelaskan dalam artikel blog saya tentang topik Tahap dan Perhitungan Amplitudo untuk Nada Nyata Murni dalam DFT: Metode 1 .

Singkatnya, Anda memperlakukan set sampah di dekat puncak sebagai ruang vektor yang kompleks. Kemudian mengetahui frekuensinya, Anda membangun satu set vektor basis untuk sinyal Anda. Koefisien vektor bertindak sebagai nampan virtual yang akan memberi tahu Anda amplitudo sinyal serta fase. Dengan menemukan vektor yang paling cocok di beberapa tempat sampah, teknik ini tidak memungkinkan kebisingan di bin yang diberikan menjadi terlalu dominan dan semacam memberikan "tuas" bahwa kebisingan harus menyeimbangkan sekitar. Efek pengurangan noise mirip dengan ketika variabel acak dirata-rata bersama-sama.

Membangun vektor basis berarti mengambil DFT dari sinus dan kosinus pada frekuensi Anda. Saya memiliki formula untuk perhitungan langsung mereka yang mem-bypass harus melakukan penjumlahan. Artikel untuk itu ditautkan dari artikel di atas.

Saya akan tertarik untuk mencari tahu apakah teknik Anda meningkatkan hasil dari metode ini. Saya sudah terbiasa bekerja di SNR >> >> 1 yang lebih tinggi sehingga saya belum pernah benar-benar menguji tingkat kebisingan yang Anda hadapi.

Sinopsis pendekatan:

x[n]=acos(ωn)+bsin(ωn)+wgn[n]

Karena DFT adalah operator linier:

DFT(x[n])=aDFT(cos(ωn))+bDFT(sin(ωn))+DFT(wgn[n])

Dalam notasi vektor:

Z=aA+bB+W

Anda hanya memecahkan untuk dan menggunakan aljabar linier standar untuk memberikan Anda yang terbaik. Bonusnya adalah Anda juga mendapatkan perkiraan W. Oleh karena itu, Anda dapat mencoba pendekatan "membuang gelandangan", dan sepenuhnya menghilangkan perkiraan kebisingan di tempat pemasangan terburuk dan kemudian menghitung ulang. Bilas, ulangi. Atau kurangi kebisingan di setiap nampan dengan beberapa formula lain. Jika Anda melakukannya secara proporsional, hasil Anda akan tetap sama dengan W adalah ortogonal untuk A dan B. Tetapi pengurangan konstan sepanjang W, daripada Z (seperti metode Anda) harus meningkatkan hasil juga.ab

Biasanya, saya melakukan empat nampan di sekitar puncak, tetapi Anda mungkin ingin memperpanjang ke 6 atau bahkan 8. Pada beberapa titik, lebih banyak nampan membuat untuk hasil yang lebih buruk karena Anda membawa lebih banyak suara daripada sinyal.

Anda hanya perlu menghitung tempat menarik DFT.


Saya pikir harus ada pertanyaan lain di mana Anda dan metode lain dapat dibandingkan.
Olli Niemitalo

@OlliNiemitalo, Ayo kita lakukan, dan kirim hasilnya di sini. Berapa nilai wajar untuk jumlah sampel per siklus? Untuk itu, berapa siklus per frame?
Cedron Dawg

Tolong jangan di sini, dalam pertanyaan lain.
Olli Niemitalo

@OlliNiemitalo, Oke, jika Anda bersikeras, tapi itu tidak akan benar-benar menjadi pertanyaan. Karena penasaran, apakah ini masalah yang Anda coba selesaikan secara nyata, atau lebih merupakan latihan akademis?
Cedron Dawg

Saya pikir hasilnya mungkin berguna secara umum sehingga menarik minat saya untuk mengerjakannya.
Olli Niemitalo

2

Solusi perkiraan yang menarik dari masalah estimasi kemungkinan maksimum (ML) diperoleh dengan menggunakan rumus asimptotik

(1)I0(x)ex2πx,x1

Menggunakan notasi dan formula dari jawaban Olli , estimasi ML optimal dari amplitudo sinyal bersih yang dinormalisasi memuaskan

(2)a^=mI1(2ma^)I0(2ma^)

Dengan menggunakan dan mencatat bahwa , kami memperoleh aproksimasi(1)I1(x)=I0(x)

(3)I1(x)I0(x)112x

Perkiraan ini memiliki kesalahan relatif kurang dari % untuk .1x>4.5

Memasukkan ke memberikan solusi perkiraan(3)(2)

(4)a^12(m+m21)

Dengan dan kami perolehm=|Yk|/σa=|Xk|/σ

(5)|X|k^12(|Yk|+|Yk|2σ2)

yang hanya merupakan rata-rata aritmatika dari pengamatan bisingdan estimasi diperoleh dari pengurangan daya spektral.|Yk|


EDIT:

Saya akan senang memiliki perkiraan seperti yang bekerja pada seluruh rentang . Calon untuk perkiraan seperti itu adalah keluarga fungsi(3)x[0,)

(6)f(x)=xc1+c2x2

Pilihan konstanta yang benar secara teoritis adalah dan , dengan mempertimbangkan properti sekitar dan . Namun, untuk rentang realistis , perkiraan yang lebih baik dalam kisaran tersebut mungkin dapat dicapai dengan sedikit mengubah konstanta tersebut.c1=4c2=1f(x)x=0xx

Menggunakan perkiraan dengan dan menghasilkan estimasi berikut:(6)c1=4c2=1

(7)a^=m11m4

atau, secara setara,

(8)|X|k^=|Yk|1σ4|Yk|4


Suntingan Olli:

masukkan deskripsi gambar di sini
Gambar 1. (oranye) dan perkiraannya didefinisikan oleh Persamaan. 4 (biru) dan Persamaan. 7 (hijau), sebagai fungsi dariSemua kurva mendekati sebagai (lihat gambar kanan untuk besar ). mendekati seri Laurent terpotongnya sebagai yang memberikan hasil yang aneh bahwa meskipun perkiraan secara asimptotik mendekatinya sebagai , kuadrat dari Persamaan. 7 memiliki kesalahan konstan dalam mendekati sebagaia^MLm.a=mmma^ML2m212m,a^MLma^ML2mkarena istilah konstan 0 dari seri Laurent berbeda dari dari seri Laurent dari (lihat jawaban estimator ML Olli) dan seri Laurent dari kuadrat dari Eq. 4. Kesalahan konstan ini menghilang dalam estimasi karena fakta bahwa12a^ML2ca^MLlimm(m2+cm)=0.

Skrip python untuk Gambar. 1

Skrip ini memerlukan skrip pertanyaan untuk impor modul dan untuk fungsi plot plot_est, dan definisi fungsi dari est_a_MLjawaban ML Olli.

def est_a_MattL_Eq_4(m):
    m = mp.mpf(m)
    if m > 1:
        return (m + mp.sqrt(m**2 - 1))/2
    else:
        return 0

def est_a_MattL_Eq_7(m):
    m = mp.mpf(m)
    if m > 1:
        return m*mp.sqrt(1 - 1/m**4)
    else:
        return 0

ms = np.arange(0, 2.00390625, 0.00390625)
est_as = [[est_a_MattL_Eq_4(m) for m in ms], [est_a_ML(m) for m in ms], [est_a_MattL_Eq_7(m) for m in ms]];
plot_est(ms, est_as)

ms = np.arange(18, 20.125, 0.125)
est_as = [[est_a_MattL_Eq_4(m) for m in ms], [est_a_ML(m) for m in ms], [est_a_MattL_Eq_7(m) for m in ms]];
plot_est(ms, est_as)

@OlliNiemitalo: Saya telah menyesuaikan formula saya dengan tepat.
Matt L.

2

Scale-invariant minimum mean square error (MMSE) yang tidak tepat sebelumnya merupakan penduga dari amplitudo yang ditransformasikan

Jawaban ini menyajikan penaksir invarian skala keluarga, parameter dengan satu parameter yang mengontrol distribusi amplitudo Bayesian sebelumnya dan transformasi amplitudo ke skala lain. Penaksir adalah penaksir kesalahan rata-rata minimum (MMSE) dalam skala amplitudo yang ditransformasikan. Diasumsikan seragam yang tidak sesuai sebelum amplitudo yang ditransformasikan. Transformasi yang tersedia termasuk skala linier (tanpa transformasi) dan dapat mendekati skala logaritmik di mana estimator mendekati nol di mana-mana. Estimator dapat diparameterisasi untuk mendapatkan jumlah kesalahan kuadrat rendah pada rasio signal-to-noise (SNRs) negatif.

Estimasi Bayesian

Pengukur kemungkinan maksimum (ML) dalam jawaban pertama saya berkinerja buruk. Penaksir ML juga dapat dipahami sebagai penaksir Bayesian maksimum a posteriori (MAP) yang diberi distribusi probabilitas sebelum seragam yang tidak tepat. Di sini, tidak tepat berarti bahwa sebelumnya meluas dari nol hingga tak terbatas dengan kepadatan sangat kecil. Karena densitasnya bukan bilangan real, prior bukan distribusi yang tepat, tetapi masih dapat memberikan distribusi posterior yang tepat oleh teorema Bayes yang kemudian dapat digunakan untuk memperoleh estimasi MAP atau MMSE.

Teorema Mereka Bayes 'dalam hal fungsi kepadatan probabilitas (PDF) adalah:

(1)PDF(am)=PDF(ma)PDF(a)PDF(m)=PDF(ma)PDF(a)0PDF(ma)PDF(a)da.

Penaksir MAP adalah argumen dari posterior PDF yang memaksimalkannya:a^MAP

(2)a^MAP=argmaxaPDF(am).

Penaksir MMSE adalah rata-rata posterior:a^MMSE

(3)a^MMSE=argmaxa^E[(aa^)2m]=E[am]=0aPDF(am)da.

Sebelumnya seragam yang tidak tepat bukan satu-satunya skala-invarian sebelumnya. Setiap PDF yang memuaskan sebelumnya:

(4)PDF(|Xk|)|Xk|ε1,

dengan eksponen nyata dan berarti: "sebanding dengan", adalah skala-invarian dalam arti bahwa produk dan konstanta positif masih mengikuti distribusi yang sama (lihat Lauwers et al. 2010 ).ε1,Xk

Keluarga penaksir

Keluarga penaksir harus disajikan, dengan sifat-sifat ini:

  1. Skala-invarian: Jika komplek bin bersih atau setara dengan amplitudo bersih dan standar deviasi derau masing-masing dikalikan dengan konstanta positif yang sama, maka juga amplitudo diperkirakan akan dikalikan oleh konstanta itu.Xk,|Xk|,σ|Xk|^
  2. Minimum mean square transformed-amplitudo kesalahan.
  3. Seragam yang tidak benar sebelum amplitudo yang ditransformasikan.

Kami akan menggunakan notasi yang dinormalisasi:

(5)a=|Xk|σnormalized clean amplitude,m=|Yk|σnormalized noisy magnitude,1=(σσ)2normalized variance of noise,SNR=(|Xk|σ)2=a2signal-to-noise ratio (10log10(SNR) dB),

dimanaadalah amplitudo bersih yang ingin kami perkirakan dari besarnya bisingdari nilai bin whicy sama dengan jumlah nilai bin bersih ditambah kompleks sirkular simetris Gaussian noise of varianceSkala sebelum invariandiberikan dalam Persamaan. 4 dibawa ke notasi yang dinormalisasi sebagai:|Xk||Yk|YkXkσ2.|Xk|

(6)PDF(a)aε1.

Misalkan menjadi fungsi transformasi amplitudo yang meningkatSeragam yang tidak tepat sebelum amplitudo yang ditransformasikan dilambangkan dengan:g(a)a.

(7)PDF(g(a))1.

Persamaan. 6 & 7 bersama-sama menentukan keluarga kemungkinan transformasi amplitudo. Mereka terkait oleh perubahan variabel :

(8)g(a)PDF(g(a))=PDF(a)g(a)aε1g(a)aε1da=aεε+cg(a)=c1aεε+c0.

Kami berasumsi tanpa bukti bahwa pilihan konstanta dan tidak akan mempengaruhi estimasi amplitudo. Untuk kenyamanan kami atur:c0c1

(9)g(1)=1andg(1)=1c0=ε1εandc1=1g(a)=aε+ε1ε,

yang memiliki kasus linier khusus:

(10)g(a)=aifε=1,

dan batas:

(11)limε0g(a)=log(a)+1.

Fungsi transformasi dapat dengan mudah mewakili skala amplitudo linier (at ) dan dapat mendekati skala amplitudo logaritmik (seperti ). Untuk positif dukungan PDF dari amplitudo yang ditransformasikan adalah:ε=1ε0ε,

(12)0<a<ε1ε<g(a)<,

Fungsi transformasi terbalik adalah:

(13)g1(g(a))=(εg(a)ε+1)1/ε=a.

Estimasi yang diubah adalah kemudian, menggunakan hukum ahli statistik yang tidak sadar :

(14)a^uni-MMSE-xform=argmina^E[(g(a)g(a^))2m]=g1(E[g(a)m])=g1(0g(a)PDF(am)da)=g1(0g(a)f(am)da0f(am)da),

di mana adalah PDF posterior dan adalah PDF posterior tidak dinormalisasi yang didefinisikan menggunakan teorema Bayes (Persamaan 1), Rician dari Persamaan. 3,2 dari jawaban estimator ML saya, dan Persamaan. 6:PDF(ab)f(am)PDF(ma)=2me(m2+a2)I0(2ma)

(15)PDF(am)PDF(ma)PDF(a)2me(m2+a2)I0(2ma)×aε1ea2I0(2ma)aε1=f(am),

dari mana dijatuhkan dari formula Bayes karena itu konstan di atasMenggabungkan Persamaan. 14, 9 & 15, menyelesaikan integral dalam Mathematica, dan menyederhanakan, memberikan:PDF(m)a.

(16)a^uni-MMSE-xform=g1(0aε+ε1ε×ea2I0(2ma)aε1da0ea2I0(2ma)aε1da)=(ε12ε(Γ(ε)Lε(m2)+(ε1)Γ(ε/2)Lε/2(m2))12Γ(ε/2)Lε/2(m2)ε+1)1/ε=(Γ(ε)Lε(m2)+(ε1)Γ(ε/2)Lε/2(m2)Γ(ε/2)Lε/2(m2)ε+1)1/ε=(Γ(ε)Lε(m2)Γ(ε/2)Lε/2(m2))1/ε,

di mana adalah fungsi gamma dan adalah fungsi Laguerre . Pengukur turun menjadi nol di mana-mana sebagai sehingga tidak masuk akal untuk menggunakan negatif yang akan menekankan nilai-nilai kecil lebih jauh dan memberikan distribusi posterior yang tidak tepat. Beberapa kasus khusus adalah:ΓLε0,ε,a

(17)a^uni-MMSE-xform=m2+1,if ε=2,

(18)a^uni-MMSE=a^uni-MMSE-xform=em2/2πI0(m2/2),if ε=1,

diperkirakan pada besar dengan ( lihat perhitungan ) seri Laurent terpotong:m

(19)a^uni-MMSEm14m732m359128m5,

Perkiraan asimptotik ini memiliki kesalahan amplitudo maksimum absolut kurang dari untuk106m>7.7.

Kurva estimator ditunjukkan pada Gambar. 1.

masukkan deskripsi gambar di sini
Gambar 1. Estimator sebagai fungsi untuk nilai yang berbeda dari dari atas ke bawah: biru: yang meminimalkan kesalahan daya kuadrat rata-rata dengan asumsi seragam yang tidak tepat sebelum kekuasaan, oranye: yang meminimalkan kesalahan amplitudo kuadrat rata-rata dengan asumsi seragam yang tidak benar sebelum amplitudo, hijau: merah: dan ungu:a^uni-MMSE-xformmε,ε=2,ε=1,ε=12,ε=14,ε=18.

Pada kurva adalah horisontal dengan nilai:m=0

(20)a^uni-MMSE-xform=211/ε(Γ(1+ε2))1/επ1/(2ε),if m=0.

Pada SNR negatif, penaksir uni-MMSE-xform dapat diparameterisasi menggunakan low untuk memberikan jumlah kesalahan kuadrat yang lebih rendah dibandingkan dengan estimator pengurangan daya spektral yang dijepit, dengan penalti yang sesuai pada nilai SNR menengah dekat 7 dB (Gbr. 2 ).ε

masukkan deskripsi gambar di sini
masukkan deskripsi gambar di sini
masukkan deskripsi gambar di sini
Gambar 2. Estimasi Monte Carlo dengan ukuran sampel dari: Solid: gain jumlah kesalahan kuadrat dalam mengestimasioleh dibandingkan dengan memperkirakannya dengan putus-putus: gain dari jumlah kesalahan kuadrat dalam memperkirakan oleh dibandingkan dengan memperkirakannya dengan bertitik: gain dari jumlah kesalahan kuadrat dalam memperkirakan dengan dibandingkan dengan memperkirakan denganBiru: estimator uni-MMSE-xform dengan (atas), (tengah), dan105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.ε=1ε=12ε=14, oranye: pengurangan daya spektral dijepit.

Skrip python untuk Gambar. 1

Skrip ini memperluas skrip pertanyaan A.

def est_a_uni_MMSE_xform(m, epsilon):
    m = mp.mpf(m)
    epsilon = mp.mpf(epsilon)
    if epsilon == 0:
        return mpf(0)
    elif epsilon == 1:
        return mp.exp(m**2/2)/(mp.sqrt(mp.pi)*mp.besseli(0, m**2/2))
    elif epsilon == 2:
        return mp.sqrt(m**2 + 1)
    else:
        return (mp.gamma(epsilon)*mp.laguerre(-epsilon, 0, m**2) / (mp.gamma(epsilon/2)*mp.laguerre(-epsilon/2, 0, m**2)))**(1/epsilon)

ms = np.arange(0, 6.0625, 0.0625)
est_as_uni_MMSE_xform = [[est_a_uni_MMSE_xform(m, 2) for m in ms], [est_a_uni_MMSE_xform(m, 1) for m in ms], [est_a_uni_MMSE_xform(m, 0.5) for m in ms], [est_a_uni_MMSE_xform(m, 0.25) for m in ms],  [est_a_uni_MMSE_xform(m, 0.125) for m in ms]]
plot_est(ms, est_as_uni_MMSE_xform)

Skrip python untuk Gambar. 2

Skrip ini memperluas skrip pertanyaan B. Fungsi ini est_a_uni_MMSE_xform_fastmungkin tidak stabil secara numerik.

from scipy import special

def est_a_uni_MMSE_fast(m):
    return 1/(np.sqrt(np.pi)*special.i0e(m**2/2))

def est_a_uni_MMSE_xform_fast(m, epsilon):
    if epsilon == 0:
        return 0
    elif epsilon == 1:
        return 1/(np.sqrt(np.pi)*special.i0e(m**2/2))
    elif epsilon == 2:
        return np.sqrt(m**2 + 1)
    else:
        return (special.gamma(epsilon)*special.eval_laguerre(-epsilon, m**2)/(special.gamma(epsilon/2)*special.eval_laguerre(-epsilon/2, m**2)))**(1/epsilon)

gains_SSE_a_uni_MMSE = [est_gain_SSE_a(est_a_uni_MMSE_fast, a, 10**5) for a in as_]
gains_SSE_a2_uni_MMSE = [est_gain_SSE_a2(est_a_uni_MMSE_fast, a, 10**5) for a in as_]
gains_SSE_complex_uni_MMSE = [est_gain_SSE_complex(est_a_uni_MMSE_fast, a, 10**5) for a in as_]
plot_gains_SSE(as_dB, [gains_SSE_a_uni_MMSE, gains_SSE_a_sub], [gains_SSE_a2_uni_MMSE, gains_SSE_a2_sub], [gains_SSE_complex_uni_MMSE, gains_SSE_complex_sub])

gains_SSE_a_uni_MMSE_xform_0e5 = [est_gain_SSE_a(lambda m: est_a_uni_MMSE_xform_fast(m, 0.5), a, 10**5) for a in as_]
gains_SSE_a2_uni_MMSE_xform_0e5 = [est_gain_SSE_a2(lambda m: est_a_uni_MMSE_xform_fast(m, 0.5), a, 10**5) for a in as_]
gains_SSE_complex_uni_MMSE_xform_0e5 = [est_gain_SSE_complex(lambda m: est_a_uni_MMSE_xform_fast(m, 0.5), a, 10**5) for a in as_]
plot_gains_SSE(as_dB, [gains_SSE_a_uni_MMSE_xform_0e5, gains_SSE_a_sub], [gains_SSE_a2_uni_MMSE_xform_0e5, gains_SSE_a2_sub], [gains_SSE_complex_uni_MMSE_xform_0e5, gains_SSE_complex_sub])

gains_SSE_a_uni_MMSE_xform_0e25 = [est_gain_SSE_a(lambda m: est_a_uni_MMSE_xform_fast(m, 0.25), a, 10**5) for a in as_]
gains_SSE_a2_uni_MMSE_xform_0e25 = [est_gain_SSE_a2(lambda m: est_a_uni_MMSE_xform_fast(m, 0.25), a, 10**5) for a in as_]
gains_SSE_complex_uni_MMSE_xform_0e25 = [est_gain_SSE_complex(lambda m: est_a_uni_MMSE_xform_fast(m, 0.25), a, 10**5) for a in as_]
plot_gains_SSE(as_dB, [gains_SSE_a_uni_MMSE_xform_0e25, gains_SSE_a_sub], [gains_SSE_a2_uni_MMSE_xform_0e25, gains_SSE_a2_sub], [gains_SSE_complex_uni_MMSE_xform_0e25, gains_SSE_complex_sub])

Referensi

Lieve Lauwers, Kurt Barbe, Wendy Van Moer dan Rik Pintelon, Menganalisis Rice mendistribusikan data pencitraan resonansi magnetik fungsional fungsional: Pendekatan Bayesian , Meas. Sci. Technol. 21 (2010) 115804 (12pp) DOI: 10.1088 / 0957-0233 / 21/11/115804 .


0

Pengukur kesalahan log-amplitudo rata-rata kuadrat minimum

Jawaban ini menyajikan penduga yang meminimalkan rata-rata galat log-amplitudo, untuk pemilihan prior yang tidak tepat dari amplitudo bersih: seragam dan linier.

Penduga kesalahan rata-rata minimum log-amplitudo log kuadrat (uni-MMSE-log) yang tidak semestinya

Dalam literatur, pengembangan selanjutnya setelah penaksir amplitudo MMSE telah menjadi penaksir amplitudo log MMSE, terutama penaksir (Ephraim & Malah 1985, terima kasih kepada @MattL untuk referensi) yang mengasumsikan seorang Rician sebelum amplitudo bersih. Dalam upaya untuk meningkatkan pada estimator , di sini akan diturunkan estimator kesalahan log-amplitudo rata-rata kuadrat (uni-MMSE-log) untuk seragam yang tidak tepat sebelum amplitudo bersih.a^uni-MMSE

Menggunakan variabel yang dinormalisasi dari jawaban saya, "Skala minimum invarian kuadrat rata-rata seragam penduga sebelumnya dari amplitudo yang diubah" Persamaan. (5), estimator uni-MMSE-log dari amplitudo bersih adalah:

(1)a^uni-MMSE-log=argmina^E[(logaloga^)2m]=exp(E[logam]).

Dengan menggunakan hukum ahli statistik yang tidak disadari , kemudian menulis estimasi dalam bentuk PDF yang tidak dinormalkan dan menyederhanakan :f(am)=PDF(ma),

(2)a^uni-MMSE-log=exp(0log(a)PDF(am)da)=exp(0log(a)f(am)da0f(am)da)=exp(0log(a)PDF(ma)da0PDF(ma)da)=exp(0log(a)2me(m2+a2)I0(2ma)da02me(m2+a2)I0(2ma)da)=exp(2mem20log(a)ea2I0(2ma)damem2πem2/2I0(m2/2))=exp(20log(a)ea2I0(2ma)daπem2/2I0(m2/2))=exp(em2/2I0(m22)Ψ(12)+m2F201112(3/2;1;1,1/2;2,2;;3/2;m2,m2)2em2/2I0(m2/2))=exp(m2F201112(3/2;1;1,1/2;2,2;;3/2;m2,m2))2em2/2I0(m2/2)γ2log2),

di mana adalah fungsi digamma , adalah konstanta Euler-Mascheroni , dan adalah fungsi Kampé de Fériet (-like) . Bentuk fungsi khusus estimator ini dapat dievaluasi dalam mpmath Python (lihat skrip di akhir jawaban). Ada juga formulir menggunakan seri yang tidak memerlukan fungsi khusus:ΨγF201112

(3)=exp(L1/2(1,0)(m2)2em2/2I0(m2/2)+Ψ(12)2)=exp(k=0((1/2)km2k(1)kk!n=1k12n1)em2/2I0(m2/2)+Ψ(12)2)=exp(k=0((1/2)km2k(1)kk!n=1k12n1)k=0(1/2)km2k(1)kk!γ2log2),

di mana adalah fungsi L Laguerre dan superscript menunjukkan pembedaannya sehubungan dengan parameter subskrip, dan adalah simbol Pochhammer dengan case khususdanSeri pembilang dan penyebut dapat dipotong pada puluhan istilah untuk mendapatkan estimator untuk rendahAkurasi yang lebih baik diperoleh dengan memperkirakan kedua seri menggunakan pemotongan panjang yang sama, dibandingkan dengan menggunakan fungsi khusus yang tepat untuk yang lain, atau pemotongan panjang yang berbeda. Sulit untuk mengevaluasi seri pada umumnya karena istilah terbesar muncul sekitarLn(x)(1,0)(x)k(1)k=k!(1/2)k=(2k1)!!/2k.m.mkm2.

@ ekspresi asli pengguna150203 dari seri yang terkait dengan integral pembilang memberikan ekspresi setara lain untuk penaksir:

(4)=exp(k=0m2kk!(k12k)Ψ(k+12)2em2/2I0(m2/2))=exp(k=0m2kk!(k12k)Ψ(k+12)2k=0m2kk!(k12k)),

di mana menunjukkan koefisien binomial .(ab)

Kurva penduga log uni-MMSE (Gbr. 1, kurva lebih rendah oranye) mirip dengan penduga uni-MMSE, tetapi dengan nilai yang lebih rendah padam=0:

(5)a^uni-MMSE-log=eγ20.374653,if m=0.

Penaksir kesalahan log-amplitudo log minimum linier minimum sebelum-linier (lin-MMSE-log) tidak benar

Penaksir terkait dapat diperoleh jika seseorang mengambil batas penaksir (Ephraim & Malah 1985) pada varian sebelum tak terbatas dari variabel kompleks bersih. Kemudian, fungsi densitas probabilitas Rayleigh sebelumnya dari amplitudo bersih menjadi jalan linier yang nol pada magnitudo nol dan naik secara linear dengan kemiringan yang sangat kecil. Pengukur yang dihasilkan (Gbr. 1, kurva atas biru) adalah:

(6)a^lin-MMSE-log=exp(12m2ettdt)m=exp(Ei(m2)2)m=exp(Γ(0,m2)2)m,
(7)limm0+a^lin-MMSE-log=eγ/20.749306,

di mana adalah integral eksponensial , dan adalah fungsi gamma atas tidak lengkap .Ei(x)Γ(0,x)

masukkan deskripsi gambar di sini
Gambar 1. Estimator galat log-amplitudo rata-rata kuadrat minimum: biru, atas: dengan linear sebelum dan oranye yang tidak tepat, lebih rendah: dengan seragam yang tidak tepat sebelumnya. Diperkirakan amplitudo bersih sebagai fungsi dari noise berisik dengan noise aditif unit-variance.a^lin-MMSE-loga^uni-MMSE-loga^m

Skrip python untuk Gambar. 1

Skrip ini memperluas skrip pertanyaan A. Fungsi est_a_uni_MMSE_logini tidak stabil secara numerik m.

def est_a_uni_MMSE_log(m):
    m = mp.mpf(m)
    return mp.exp(m**2*mp.hyper2d({'m+n':[1.5], 'n':[1], 'm':[1, 0.5]}, {'m+n':[2, 2], 'm':[1.5]}, m**2, m**2)/(2*mp.exp(m**2/2)*mp.besseli(0, m**2/2))-mp.euler/2-mp.log(2))

def est_a_lin_MMSE_log(m):
    m = mp.mpf(m)
    if m == 0:
        return mp.exp(-mp.euler/2)
    else:
        return mp.exp(-mp.ei(-m**2)/2)*m

ms = np.arange(0, 6.0625, 0.0625)
est_as_MMSE_log = [[est_a_lin_MMSE_log(m) for m in ms], [est_a_uni_MMSE_log(m) for m in ms]];    
plot_est(ms, est_as_MMSE_log)

Referensi

Y. Ephraim dan D. Malah, Peningkatan kemampuan bicara menggunakan penaksir amplitudo log-spektral rata-rata galat minimum , Transaksi IEEE pada Prosesor Pidato dan Sinyal Akustik , Mei 1985, DOI: 10.1109 / TASSP.1985.1164550 .

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.