Il rumore bianco gaussiano a media zero reale, indipendente da un segnale pulito e di varianza nota viene aggiunto a producendo un segnale rumorosoTrasformata discreta di Fourier (DFT) del segnale rumoroso viene calcolata da:
Questo è solo per il contesto e definiremo la varianza del rumore nel dominio della frequenza, quindi la normalizzazione (o la sua mancanza) non è importante. Il rumore bianco gaussiano nel dominio del tempo è il rumore bianco gaussiano nel dominio della frequenza, vedi domanda: " Qual è la statistica della trasformata discreta di Fourier del rumore gaussiano bianco? ". Pertanto possiamo scrivere:
dove e sono i DFT del segnale pulito e del rumore, e il del rumore che segue una distribuzione gaussiana complessa simmetrica circolare della varianza . Ciascuna parte reale e immaginaria di segue indipendentemente una distribuzione gaussiana della varianza . Definiamo il rapporto segnale-rumore (SNR) del bin come:
Un tentativo di ridurre il rumore viene quindi effettuato mediante sottrazione spettrale, per cui l'entità di ciascun contenitore viene ridotta indipendentemente mantenendo la fase originale (a meno che il valore del contenitore non vada a zero nella riduzione dell'ampiezza). La riduzione forma una stima del quadrato del valore assoluto di ogni bin del DFT del segnale pulito:
dove è la varianza nota del rumore in ciascun cestino DFT. Per semplicità, non stiamo prendendo in considerazione o per , che sono casi speciali per realeCon un SNR basso, la formulazione in (2) a volte potrebbe risultare inPossiamo rimuovere questo problema bloccando la stima a zero dal basso, ridefinendo:
Figura 1. Stime Monte Carlo con una dimensione del campione di di: Solido: guadagno della somma dell'errore quadrato nella stimadi rispetto alla stima con
tratteggiato: guadagno della somma dell'errore quadrato nella stima di rispetto alla stima con punteggiato: guadagno della somma dell'errore quadrato nella stima di di rispetto alla stima conViene utilizzata la definizione di da (3).
Domanda: esiste un'altra stima dio che migliora su (2) e (3) senza fare affidamento sulla distribuzione di ?
Penso che il problema sia equivalente alla stima del quadrato del parametro di una distribuzione Rice (Fig. 2) con parametro noto data una singola osservazione.
Figura 2. La distribuzione del riso è la distribuzione della distanza dall'origine da un punto che segue una distribuzione normale simmetrica circolare bivariata con un valore assoluto della media varianza e varianza dei componenti
Ho trovato della letteratura che sembra rilevante:
- Jan Sijbers, Arnold J. den Dekker, Paul Scheunders e Dirk Van Dyck, "Stima della massima verosimiglianza dei parametri di distribuzione Rician" , Transazioni IEEE sull'imaging medico (Volume: 17, Numero: 3, Giugno 1998) ( doi , pdf ).
Python script A per curve di stima
Questo script può essere esteso per tracciare curve di stima nelle risposte.
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()
Script Python B per Fig. 1
Questo script può essere esteso per curve di guadagno di errore nelle risposte.
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)