Estimadores para subtração espectral aprimorada de ruído


8

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:xxy.Y

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

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:

Yk=Xk+Zk,

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:XZZkσ2Zk12σ2Yk

SNR=σ2|Xk|2.

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:Yk|Xk|2^|Xk|2

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

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:σ2k=0,k=N/2Nx.|Xk|2^.

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

insira a descrição da imagem aqui
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.105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.|Xk|2^

Pergunta: Existe outra estimativa deou que melhora em (2) e (3) sem depender da distribuição de ?|Xk||Xk|2Yk

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.νRiceσRice=22σ,

insira a descrição da imagem aqui
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 componenteRνRice,2σRice2=σ2σRice2=12σ2.

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)

2
Puxa Olli, uma pergunta de esclarecimento: "Isso é apenas para contexto, portanto a normalização não é importante. O ruído é então reduzido pela subtração espectral, pela qual a magnitude de cada bin Yk é reduzida independentemente enquanto se mantém a fase original (a menos que o valor do bin seja elevado"). zero na redução de magnitude). "O que faz você dizer que esta é uma operação de redução de ruído? Se o ruído puder ir em qualquer direção, parece-me que isso provavelmente amplificará qualquer ruído que seja para atenuá-lo.
Cedron Dawg


2
@CedronDawg: Se assumirmos a independência do sinal e do ruído, suas potências serão adicionadas, para que o sinal (potência) seja obtido subtraindo a potência estimada do ruído. Assim, em termos de potência, o ruído só pode ir em uma direção.
Matt L.

1
@OlliNiemitalo: Você conhece este artigo fundamental de Ephraim e Malah? Eles derivam um estimador ideal para a amplitude do sinal, que é uma melhoria em relação à simples subtração espectral.
Matt L.

1
@OlliNiemitalo: Os coeficientes DFT são assumidos como gaussianos (para o sinal desejado e também para o ruído), de modo que as amplitudes têm uma distribuição Rayleigh. Cf. Eqs (5) e (6) no papel.
Matt L.

Respostas:


7

Estimador de máxima verossimilhança (ML)

Aqui será derivado um estimador de máxima probabilidade da potência do sinal limpo, mas não parece estar melhorando as coisas em termos de erro quadrático médio da raiz, para qualquer SNR, comparado à subtração de potência espectral.

Introdução

Vamos apresentar a amplitude limpa normalizada e a magnitude barulhenta normalizada normalizada pelo desvio padrão do ruídoamσ:

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

O estimador na Eq. 3 da questão fornece uma estimativa de como:a^a

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

Estimador de máxima verossimilhança

Para fazer um estimador possivelmente melhor de que a Eq. 2, seguimos o procedimento de Sijbers et al. 1998. (veja a pergunta) para construir um estimador de máxima verossimilhança (ML)Dá o valor de que maximiza a probabilidade do valor dado deaa^ML.am.

O PDF deé riciano com o parâmetroe parâmetro (para ser substituído posteriormente por clareza)|Yk|νRice=|Xk|σRice=12σ:

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

onde é uma função de Bessel modificada do primeiro tipo . Substituindo eIα|Xk|=σa, |Yk|=σm,σRice2=12σ2:

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

e transformando:

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

O PDF riciano de parametrizado por é independente da variação de ruídoO estimador de probabilidade máxima do parâmetro é o valor de que maximiza . É uma solução de:maσ2.a^MLaaPDF(m)

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

A solução para a Eq. 4 tem a propriedade de que:

(5)a^ML=0 if m1.

Caso contrário, ele precisa ser resolvido numericamente.

insira a descrição da imagem aqui
Figura 1. azul, superior: o estimador de máxima verossimilhança e laranja, inferior: o estimador de subtração espectral de potência da questão de amplitude limpa normalizada , em função da magnitude barulhenta normalizadaa^MLa^am.

σa^ML é o estimador de probabilidade máxima de e por invariância funcional da estimativa de probabilidade máxima, é o estimador de probabilidade máxima de X_k|Xk|,σ2a^ML2|Xk|2.

Série empírica de Laurent do estimador ML

Tentei calcular numericamente (veja o script mais abaixo) a série Laurent de mas parece não convergir para o intervalo de necessário. Aqui está um truncamento da série Laurent, tanto quanto eu calculei:a^ML2,m

(6)a^ML2m2121m0123m2325m41227m65729m8309211m101884213m1212864215m1498301217m16839919219m187999311221m20

Não foi possível encontrar as seqüências inteiras de numerador ou denominador na Enciclopédia on-line de sequências inteiras (OEIS). Somente para os cinco primeiros termos de potência negativa, os coeficientes do numerador correspondem a A027710 . No entanto, depois de enviar a sequência computada ( ) para o OEIS Superseeker , obtive isso na resposta (da qual confirmei os próximos três números sugeridos por um cálculo estendido):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]

Aproximação tabulada e ganho de erro de estimativa

Uma tabela interpolada linearmente (consulte scripts abaixo) contendo não uniformemente distribuídas de fornece uma aproximação com um erro máximo de cerca de124071a^ML2m26×1011.

Aproximação dos mínimos quadrados do estimador ML

Uma aproximação de mínimos quadrados (com peso extra em ) das amostras da curva estimadora foi criada, de forma inspirada nos experimentos da série Laurent (veja o script Octave mais adiante). O termo constante foi alterado para remover a possibilidade de negativo em A aproximação é válida para e tem um erro máximo de cerca de (Fig 3) na aproximação dem2=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

insira a descrição da imagem aqui
Figura 3. Erro da aproximação dos mínimos quadrados dea^ML2.

O script parece capaz de lidar com o aumento do número de potências negativas de dando consistentemente erros cada vez menores, com o número de erros extremos crescendo, mas com uma lenta e lenta deterioração máxima dos erros. A aproximação é quase dupla, mas ainda se beneficiaria um pouco do refinamento da troca de Remez .m2,

Usando a aproximação, as seguintes curvas de ganho de erro esperadas foram obtidas:

insira a descrição da imagem aqui
Figura 2. 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 comAzul: estimador ML, laranja: subtração de potência espectral presa.105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.

Surpreendentemente, o estimador de ML é pior do que a subtração de potência espectral pinçada em quase todos os aspectos, exceto por ser marginalmente melhor para estimativa de sinal em SNR> cerca de 5 dB e estimativa de amplitude em SNR> cerca de 3 dB. Nesses SNR, os dois estimadores são piores do que apenas usar o sinal barulhento como estimativa.

Script Python A para a Fig. 1

Este script estende o script A. da pergunta

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)

Script Python para cálculo numérico da série Laurent

Esse script calcula numericamente os primeiros termos da série Laurent deÉ baseado no script nesta resposta .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

Script Python para tabulação do estimador de ML

Este script cria uma tabela com amostragem desigual de pares adequados para interpolação linear, fornecendo aproximadamente o erro máximo absoluto definido de interpolação linear aproximada de para o intervaloO tamanho da tabela é aumentado automaticamente adicionando amostras às partes difíceis, até que o erro de pico seja pequeno o suficiente. Se é igual a , mais uma potência inteira de então todos os intervalos de amostragem será potências de No final da tabela haverá uma transição sem descontinuidade a uma larga aproximação[m2,a^ML2]a^ML2m=0mmax.mmax22,2.ma^ML2=m212.Se for necessário, meu palpite é que é melhor interpolar a tabela como está e fazer a conversãoa^MLa^ML=a^ML2.

Para uso em conjunto com o próximo script, canalize a saída > 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('];')

Script Python B para a Fig. 2

Esse script estende o script B. da pergunta

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])

Script de oitava para mínimos quadrados

Este script Oitava (uma adaptação desta resposta ) ajusta os mínimos quadrados de poderes de em . As amostras foram preparadas pelo script Python um pouco acima.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}")

Script Python A2 para aproximação usando polinômios de Chebyshev

Esse script estende o script A e fornece uma aproximação alternativa do estimador de ML usando polinômios de Chebyshev. O primeiro nó Chebyshev está em e o número de polinômios de Chebyshev é tal que a aproximação é não-negativa.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

Atualizar:

Lamento dizer que o teste mostra que o seguinte argumento parece ser quebrado sob um ruído intenso. Não era o que eu esperava, então definitivamente aprendi algo novo. Todos os meus testes anteriores estavam na faixa alta de SNR, pois meu foco estava em encontrar soluções exatas no caso silencioso.


Olli,

Se seu objetivo é encontrar os parâmetros de um tom puro em um sinal barulhento, você deveria ter dito isso. Nesta edição, tenho muita experiência e conhecimento.

Você diz que está procurando a amplitude (e a fase vem com ela), por isso aposto que está alinhando sua DFT para ter um número inteiro de ciclos. Essa é a pior configuração para essa situação, pois você lida com o sinal em apenas uma única posição contra o ruído nessa única posição.

Como você mostrou acima, quanto maior o SNR, pior será o seu truque, a ponto de prejudicial ou além. Bem, seu escopo de interesse será aquele com o maior SNR.

O que você quer fazer é alinhar seu quadro DFT em um todo mais meio ciclo. Isso espalhará seu sinal pelo maior número possível de caixas. Em seguida, você pode encontrar a fase e a amplitude, conforme descrito no artigo do meu blog, no tópico Cálculo de fase e amplitude para um tom real puro em uma DFT: Método 1 .

Em resumo, você trata o conjunto de caixas perto do pico como um espaço vetorial complexo. Então, conhecendo a frequência, você constrói um conjunto de vetores básicos para o seu sinal. Os coeficientes dos vetores atuam como um compartimento virtual que informa a amplitude do sinal e a fase. Ao encontrar o vetor de melhor ajuste em vários compartimentos, a técnica não permite que o ruído em um determinado compartimento seja muito dominante e meio que fornece uma "alavanca" que o ruído precisa equilibrar. Os efeitos de redução de ruído são semelhantes a quando variáveis ​​aleatórias são calculadas em média juntas.

Construir os vetores base significa tomar a DFT de um seno e cosseno na sua frequência. Eu tenho uma fórmula para o cálculo direto que ignora ter que fazer uma soma. O artigo para isso está vinculado no artigo acima.

Eu estaria interessado em descobrir se sua técnica melhora os resultados desse método. Estou acostumado a trabalhar com SNR >> 1 mais alto, então nunca testei realmente nos níveis de ruído com os quais você está lidando.

Sinopse da abordagem:

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

Como o DFT é um operador linear:

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

Em notação vetorial:

Z=aA+bB+W

Você simplesmente está resolvendo para e usando álgebra linear padrão para lhe dar um melhor ajuste. Um bônus é que você também obtém uma estimativa de W. Portanto, você pode tentar uma abordagem "jogar fora o bumbum" e eliminar completamente o ruído estimado na bandeja com pior ajuste e depois recalcular. Enxágüe, repita. Ou reduza o ruído em cada caixa por outra fórmula. Se você fizer isso proporcionalmente, seus resultados permanecerão os mesmos que W é ortogonal a A e B. Mas uma subtração constante ao longo de W, em vez de Z (como o método faz) também deve melhorar os resultados.ab

Normalmente, eu faço os quatro compartimentos em torno do pico, mas você pode estender para 6 ou até 8. Em algum momento, mais compartimentos produzem resultados piores à medida que você gera mais ruído do que sinal.

Você só precisa calcular os depósitos de DFT de interesse.


Acho que deveria haver outra pergunta em que o seu e outros métodos poderiam ser comparados.
Olli Niemitalo 28/01/19

@OlliNiemitalo, vamos fazer isso e postar resultados aqui. Qual é o valor justo para o número de amostras por ciclo? Quanto a isso, quantos ciclos por quadro?
Cedron Dawg

Não aqui, por favor, em outra pergunta.
Olli Niemitalo 28/01/19

@OlliNiemitalo, Ok, se você insistir, mas não será realmente uma pergunta. Por curiosidade, esse é um problema que você está tentando resolver de verdade ou é mais um exercício acadêmico?
Cedron Dawg

Eu acho que o resultado pode ser útil em um sentido geral, por isso me interessa trabalhar nele.
Olli Niemitalo 28/01/19

2

Uma solução aproximada interessante do problema de estimativa de máxima verossimilhança (ML) é obtida usando a fórmula assintótica

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

Usando a notação e as fórmulas da resposta de Olli , a estimativa ótima de ML da amplitude normalizada do sinal limpo satisfaz

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

Usando e observando que , obtemos a aproximação(1)I1(x)=I0(x)

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

Essa aproximação tem um erro relativo menor que % para .1x>4.5

A conexão em fornece a solução aproximada(3)(2)

(4)a^12(m+m21)

Com e obtemosm=|Yk|/σa=|Xk|/σ

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

que é simplesmente a média aritmética da observação barulhentae a estimativa obtida da subtração de potência espectral.|Yk|


EDITAR:

Seria bom ter uma aproximação como que funcione em todo o intervalo . Um candidato para essa aproximação é a família de funções(3)x[0,)

(6)f(x)=xc1+c2x2

A escolha teoricamente correcta das constantes é e , considerando as propriedades de em torno de e . No entanto, para um intervalo realista de , uma melhor aproximação nesse intervalo pode ser possível ajustando um pouco essas constantes.c1=4c2=1f(x)x=0xx

Usando a aproximação com e resulta na seguinte estimativa:(6)c1=4c2=1

(7)a^=m11m4

ou equivalente,

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


Edição de Olli:

insira a descrição da imagem aqui
Figura 1. (laranja) e suas aproximações definidas pela Eq. 4 (azul) e Eq. 7 (verde), em função deTodas as curvas se aproximam de como (veja a figura à direita para grande ). aproxima assintoticamente da série Laurent truncada como que dá o resultado curioso de que, embora as aproximações de aproxima-se assintoticamente como , o quadrado da Eq. 7 tem erro constante ao aproximar comoa^MLm.a=mmma^ML2m212m,a^MLma^ML2mporque o termo constante 0 de sua série Laurent difere de da série Laurent de (consulte a resposta do estimador de ML de Olli) e da série Laurent do quadrado de Eq. 4. Este erro constante desaparece na estimativa de devido ao fato de que12a^ML2ca^MLlimm(m2+cm)=0.

Script Python para a Fig. 1

Esse script requer o script da pergunta para importação de módulos e para a função de plotagem plot_est, e a definição da função da est_a_MLresposta ML de 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: adaptei minhas fórmulas de acordo.
Matt L.

2

Estimativas anteriores uniformes impróprias uniformes inadequadas antes do erro quadrático médio invariante na escala (MMSE)

Esta resposta apresenta estimadores invariantes em escala de família, parametrizados por um único parâmetro que controla a distribuição Bayesiana anterior de amplitude e a transformação de amplitude em outra escala. Os estimadores são estimadores de erro quadrático médio mínimo (MEEM) na escala de amplitude transformada. Um uniforme inadequado antes da amplitude transformada é assumido. As transformações disponíveis incluem uma escala linear (sem transformação) e podem se aproximar de uma escala logarítmica, na qual o estimador se aproxima de zero em qualquer lugar. Os estimadores podem ser parametrizados para obter uma soma baixa de erro quadrado em relações sinal-ruído negativas (SNRs).

Estimação bayesiana

O estimador de máxima verossimilhança (ML) na minha primeira resposta teve um desempenho bastante fraco. O estimador de ML também pode ser entendido como um estimador Bayesiano de máximo a posteriori (PAM), dada uma distribuição de probabilidade anterior inadequada e uniforme. Aqui, impróprio significa que o anterior se estende de zero ao infinito com densidade infinitesimal. Como a densidade não é um número real, o prioritário não é uma distribuição adequada, mas ainda pode fornecer uma distribuição posterior adequada pelo teorema de Bayes, que pode ser usada para obter uma estimativa de MAP ou MMSE.

O teorema de Bayes em termos de funções de densidade de probabilidade (PDFs) é:

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

Um estimador de MAP é o argumento do PDF posterior que o maximiza:a^MAP

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

Um estimador MMSE é a média posterior:a^MMSE

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

Um anterior uniforme inadequado não é o único anterior invariante na escala. Qualquer PDF anterior que satisfaça:

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

com expoente real e significado: "é proporcional a", é invariante em escala no sentido de que o produto de e uma constante positiva ainda seguem a mesma distribuição (ver Lauwers et al. 2010 ).ε1,Xk

Uma família de estimadores

Uma família de estimadores deve ser apresentada, com as seguintes propriedades:

  1. Invariância de escala: se o compartimento limpo complexo ou equivalentemente a amplitude limpa e o desvio padrão do ruído forem multiplicados pela mesma constante positiva, também a amplitude estimada será multiplicada por essa constante.Xk,|Xk|,σ|Xk|^
  2. Erro mínimo de amplitude transformada do quadrado médio.
  3. Uniforme inadequado antes da amplitude transformada.

Usaremos notação normalizada:

(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),

ondeé a amplitude limpa que queremos estimar a partir da magnitude barulhentado valor do compartimento whicy é igual à soma do valor do compartimento limpo mais o ruído gaussiano de variância complexo circularmente simétricoO invariante de escala anterior dedado na Eq. 4 é transferido para a notação normalizada como:|Xk||Yk|YkXkσ2.|Xk|

(6)PDF(a)aε1.

Seja uma função crescente de transformação da amplitudeO uniforme inadequado antes da amplitude transformada é indicado por:g(a)a.

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

Eqs. 6 e 7 juntos determinam a família de possíveis transformações de amplitude. Eles são relacionados por uma mudança de variáveis :

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

Assumimos sem prova que a escolha das constantes e não afetará a estimativa de amplitude. Por conveniência, definimos:c0c1

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

que tem um caso linear especial:

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

e um limite:

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

A função de transformação pode representar convenientemente a escala de amplitude linear (em ) e pode se aproximar de uma escala de amplitude logarítmica (como ). Para positivo o suporte do PDF de amplitude transformada é:ε=1ε0ε,

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

A função de transformação inversa é:

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

A estimativa transformada é então, usando a lei do estatístico inconsciente :

(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),

onde é o PDF posterior é um PDF posterior não normalizado definido usando o teorema de Bayes (Eq. 1), o Rician da Eq. 3,2 da minha resposta do estimador de ML e Eq. 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),

do qual foi retirado da fórmula de Bayes porque é constante ao longo deCombinando Eqs. 14, 9 e 15, resolvendo as integrais no Mathematica e simplificando, fornece: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/ε,

onde é a função gama e é a função Laguerre . O estimador cai para zero em todos os lugares como por isso não faz sentido para uso negativo que ênfase valores pequenos de ainda mais e dar uma distribuição posterior inadequada. Alguns casos especiais são:Γ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,

aproximado em grande por ( ver cálculo ) uma série Laurent truncada:m

(19)a^uni-MMSEm14m732m359128m5,

Essa aproximação assintótica tem um erro de amplitude máxima absoluta inferior a para106m>7.7.

As curvas do estimador são mostradas na Fig. 1.

insira a descrição da imagem aqui
Figura 1. Estimador como função de para diferentes valores de de cima para baixo: azul: que minimiza o erro de potência quadrático médio assumindo um uniforme inadequado antes da energia, laranja: que minimiza o erro médio de amplitude quadrada assumindo um uniforme inadequado antes da amplitude, verde: vermelho: e roxo:a^uni-MMSE-xformmε,ε=2,ε=1,ε=12,ε=14,ε=18.

Em as curvas são horizontais com valor:m=0

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

No SNR negativo, o estimador uni-MMSE-xform pode ser parametrizado usando low para fornecer uma soma menor de erro quadrado em comparação com o estimador de subtração de potência espectral pinçada, com uma penalidade correspondente em valores SNR intermediários próximos a 7 dB (Fig. 2 )ε

insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
Figura 2. 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 comAzul: estimador uni-MMSE-xform com (em cima), (meio) e105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.ε=1ε=12ε=14, laranja: subtração de potência espectral fixa.

Script Python para a Fig. 1

Este script estende o script A. da pergunta

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)

Script Python para a Fig. 2

Esse script estende o script B. da pergunta. A função est_a_uni_MMSE_xform_fastpode ser numericamente instável.

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])

Referências

Lieve Lauwers, Kurt Barbe, Wendy Van Moer e Rik Pintelon, Analyzing Rice, distribuíram dados funcionais de ressonância magnética: Uma abordagem bayesiana , Meas. Sci. Technol. 21 (2010) 115804 (12pp) DOI: 10.1088 / 0957-0233 / 21/11/115804 .


0

Estimadores de erro mínimos quadrados médios da amplitude logarítmica

Esta resposta apresenta estimadores que minimizam o erro quadrático médio da amplitude logarítmica, para uma seleção de anteriores impróprios da amplitude limpa: uniforme e linear.

Estimador uniforme anterior mínimo mínimo incorreto do quadrado da amplitude logarítmica (uni-MMSE-log)

Na literatura, um próximo desenvolvimento após um estimador de amplitude MMSE foi um estimador de amplitude logarítmica do MMSE, particularmente o estimador de (Ephraim & Malah 1985, graças a @MattL. Para a referência), que assume um prior riciano da amplitude limpa. Na tentativa de melhorar o estimador , será derivado aqui um estimador de erro quadrático médio mínimo de amplitude de log (uni-MMSE-log) para um uniforme impróprio antes da amplitude limpa.a^uni-MMSE

Usando as variáveis ​​normalizadas da minha resposta "Erro mínimo médio quadrático invariante na escala uniforme estimadores anteriores da amplitude transformada" Eq. (5), o estimador uni-MMSE-log da amplitude limpa é:

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

Usando a lei do estatístico inconsciente , escrevendo a estimativa em termos de um PDF não normalizado e simplificando :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),

onde é a função digamma , é a constante de Euler – Mascheroni e é uma função de Kampé de Fériet (semelhante a) . Essa forma de função especial do estimador pode ser avaliada no mpmath do Python (consulte o script no final da resposta). Há também um formulário usando séries que não requer funções especiais:Ψγ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),

onde é a função L de Laguerre e sobrescrito indica diferenciação em relação ao parâmetro subscrito e é um símbolo de Pochhammer com casos especiaiseAs séries de numeradores e denominadores podem ser truncadas em dezenas de termos para obter o estimador para baixoÉ obtida uma melhor precisão aproximando as duas séries usando o mesmo truncamento de comprimento, em comparação com o uso de uma função especial exata para o outro ou truncamentos de comprimento diferentes. É difícil avaliar a série em geral porque os termos maiores aparecem em torno deLn(x)(1,0)(x)k(1)k=k!(1/2)k=(2k1)!!/2k.m.mkm2.

A expressão original de @ user150203 da série relacionada à integral do numerador fornece outra expressão equivalente para o estimador:

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

onde indica um coeficiente binomial .(ab)

A curva do estimador uni-MMSE-log (Fig. 1, curva inferior laranja) é semelhante à do estimador uni-MMSE, mas com um valor mais baixo emm=0:

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

Estimador incorreto linear anterior mínimo mínimo de erro de amplitude logarítmica quadrado (lin-MMSE-log)

Um estimador relacionado pode ser obtido se considerarmos o limite do estimador de (Ephraim & Malah 1985) com variação prévia infinita da variável complexa limpa. Então, a função de densidade de probabilidade anterior de Rayleigh da amplitude limpa torna-se uma rampa linear que é zero na magnitude zero e aumenta linearmente com uma inclinação infinitesimal. O estimador resultante (Fig. 1, curva superior azul) é:

(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,

onde é a integral exponencial e é a função gama incompleta superior .Ei(x)Γ(0,x)

insira a descrição da imagem aqui
Figura 1. Estimadores de erro quadrático médio mínimo de amplitude de log quadrado: azul, superior: com um anterior linear e laranja incorretos, inferior: com um uniforme impróprio antes. A amplitude limpa estimada é função de magnitude ruidosa com ruído aditivo de variação de unidade.a^lin-MMSE-loga^uni-MMSE-loga^m

Script Python para a Fig. 1

Esse script estende o script A. da pergunta. A função est_a_uni_MMSE_logé numericamente instável em geral 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)

Referências

Y. Ephraim e D. Malah, Aperfeiçoamento da fala usando um estimador de amplitude espectral logarítmica de erro quadrático médio mínimo , IEEE Transactions on Acoustics Speech and Signal Processing , maio de 1985, DOI: 10.1109 / TASSP.1985.1164550 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.