Bruit blanc gaussien à moyenne nulle, indépendant d'un signal propre et de variance connue est ajoutée à produire un signal bruyant Transformée de Fourier discrète (DFT) du signal bruyant est calculé par:
C'est juste pour le contexte, et nous définirons la variance du bruit dans le domaine fréquentiel, donc la normalisation (ou son absence) n'est pas importante. Le bruit blanc gaussien dans le domaine temporel est du bruit blanc gaussien dans le domaine fréquentiel, voir la question: " Quelles sont les statistiques de la transformée de Fourier discrète du bruit blanc gaussien? ". On peut donc écrire:
où et sont les DFT du signal propre et du bruit, et le bruit bin qui suit une distribution gaussienne complexe de symétrie circulaire . Chacun de la partie réelle et imaginaire de suit indépendamment une distribution de variance gaussienne . Nous définissons le rapport signal / bruit (SNR) de bin comme:
Une tentative de réduction du bruit est ensuite effectuée par soustraction spectrale, moyennant quoi l'amplitude de chaque bac est indépendamment réduit tout en conservant la phase d'origine (à moins que la valeur de la corbeille ne passe à zéro dans la réduction d'amplitude). La réduction constitue une estimation du carré de la valeur absolue de chaque bin de la DFT du signal propre:
où est la variance connue du bruit dans chaque bac DFT. Pour simplifier, nous n'envisageons pas ou même pour , qui sont des cas particuliers pour de À un SNR faible, la formulation en (2) pourrait parfois entraîner des Nous pouvons supprimer ce problème en fixant l'estimation à zéro par le bas, en redéfinissant:
Figure 1. Estimations de Monte Carlo avec un échantillon de de: Solide: gain de la somme des erreurs carrées dans l'estimation depar par rapport à son estimation avec
pointillés: gain de somme d'erreur quadratique dans l'estimation de par par rapport à son estimation avec pointillé: gain de la somme de l'erreur carrée dans l'estimation de par par rapport à son estimation avecLa définition de de (3) est utilisée.
Question: Y a - t-il une autre estimation deou qui s'améliore sur (2) et (3) sans compter sur la distribution de ?
Je pense que le problème équivaut à estimer le carré du paramètre d'une distribution de Rice (Fig. 2) avec le paramètre connu étant donné une seule observation.
Figure 2. La distribution du riz est la distribution de la distance à l'origine à partir d'un point qui suit une distribution normale symétrique circulaire bivariée avec une valeur absolue de la moyenne variance et variance des composants
J'ai trouvé de la littérature qui semble pertinente:
- Jan Sijbers, Arnold J. den Dekker, Paul Scheunders et Dirk Van Dyck, "Maximum Likelihood estimation of Rician distribution parameters" , IEEE Transactions on Medical Imaging (Volume: 17, Issue: 3, June 1998) ( doi , pdf ).
Script Python A pour les courbes d'estimateur
Ce script peut être étendu pour tracer des courbes d'estimateur dans les réponses.
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 pour la figure 1
Ce script peut être étendu pour les courbes de gain d'erreur dans les réponses.
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)