Noise Gaussian white zero-mean yang nyata, tidak tergantung pada sinyal bersih dan varian yang dikenal ditambahkan ke menghasilkan sinyal berisik Transformasi Fourier Diskrit (DFT) dari sinyal bising dihitung dengan:
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:
dimana dan adalah DFT tentang sinyal bersih dan kebisingan, dan bin kebisingan yang mengikuti distribusi varians Gaussian kompleks simetris sirkular . Masing-masing bagian nyata dan imajiner secara independen mengikuti distribusi varian Gaussian . Kami mendefinisikan rasio signal-to-noise (SNR) dari bin sebagai:
Upaya untuk mengurangi noise kemudian dilakukan dengan pengurangan spektral, di mana besarnya setiap bin secara independen dikurangi sambil mempertahankan fase asli (kecuali nilai nampan pergi ke nol dalam pengurangan besarnya). Pengurangan membentuk estimasi dari alun-alun dari nilai absolut dari setiap nampan DFT dari sinyal bersih:
dimana adalah varian noise yang diketahui di setiap nampan DFT. Untuk kesederhanaan, kami tidak mempertimbangkan atau bahkan untuk , yang merupakan kasus khusus nyata Pada SNR rendah, formulasi dalam (2) kadang-kadang dapat menghasilkan negatif Kami dapat menghapus masalah ini dengan menjepit perkiraan ke nol dari bawah, mendefinisikan ulang:
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.
Pertanyaan: Apakah ada perkiraan lainatau yang membaik pada (2) dan (3) tanpa bergantung pada distribusi ?
Saya pikir masalahnya setara dengan memperkirakan kuadrat dari parameter dari distribusi Beras (Gbr. 2) dengan parameter yang diketahui diberi satu pengamatan.
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 komponen
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)