O ruído branco gaussiano de média zero real, independente de um sinal limpo e da variação conhecida, é adicionado a produzindo um sinal barulhentoA transformada discreta de Fourier (DFT) do sinal ruidoso é calculada por:
Isso é apenas para o contexto, e definiremos a variação de ruído no domínio da frequência, para que a normalização (ou a falta dela) não seja importante. O ruído branco gaussiano no domínio do tempo é o ruído branco gaussiano no domínio da frequência. Veja a pergunta: " Quais são as estatísticas da transformada discreta de Fourier do ruído branco gaussiano? ". Portanto, podemos escrever:
onde e são os do sinal e ruído limpos e o compartimento de ruído que segue uma distribuição gaussiana circularmente simétrica complexa e simétrica . Cada parte real e imaginária de segue independentemente uma distribuição gaussiana de variância . Definimos a relação sinal-ruído (SNR) da posição como:
Uma tentativa de reduzir o ruído é então feita por subtração espectral, em que a magnitude de cada compartimento é reduzida independentemente enquanto se mantém a fase original (a menos que o valor do compartimento seja zero na redução de magnitude). A redução forma uma estimativa do quadrado do valor absoluto de cada compartimento da DFT do sinal limpo:
onde é a variação conhecida de ruído em cada compartimento de DFT. Por simplicidade, não estamos considerando ou para pares , que são casos especiais para realEm um SNR baixo, a formulação em (2) às vezes pode resultar em negativoPodemos remover esse problema fixando a estimativa para zero a partir de baixo, redefinindo:
Figura 1. Estimativas de Monte Carlo com um tamanho de amostra de de: Sólido: ganho da soma do erro quadrado na estimativapor em comparação com a estimativa com
tracejado: ganho da soma do erro quadrado em estimar por em comparação com a estimativa com pontilhado: ganho da soma do erro quadrático na estimativa de por em comparação à estimativa comA definição de de (3) é usada.
Pergunta: Existe outra estimativa deou que melhora em (2) e (3) sem depender da distribuição de ?
Eu acho que o problema é equivalente a estimar o quadrado do parâmetro de uma distribuição Rice (Fig. 2) com o parâmetro conhecido dada uma única observação.
Figura 2. Distribuição do arroz é a distribuição da distância à origem de um ponto que segue uma distribuição normal circularmente simétrica bivariada com um valor absoluto da média variância e variação do componente
Encontrei alguma literatura que parece relevante:
- Jan Sijbers, Arnold J. den Dekker, Paul Scheunders e Dirk Van Dyck, "Estimativa de máxima verossimilhança dos parâmetros de distribuição ricianos" , IEEE Transactions on Medical Imaging (Volume: 17, Edição: 3, Junho 1998) ( doi , pdf ).
Script Python A para curvas de estimador
Esse script pode ser estendido para plotar curvas do estimador nas respostas.
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 para a Fig. 1
Este script pode ser estendido para obter curvas de ganho de erro nas respostas.
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)