Schätzer für eine verbesserte spektrale Subtraktion von Rauschen


8

Reales weißes Gaußsches Rauschen mit dem Mittelwert Null, unabhängig von einem sauberen Signal und bekannter Varianz, wird zu addiert, wodurch ein verrauschtes SignalDie diskrete Fourier-Transformation (DFT) des verrauschten Signals wird berechnet durch:xxy.Y

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

Dies ist nur für den Kontext gedacht, und wir werden die Rauschvarianz im Frequenzbereich definieren, sodass die Normalisierung (oder deren Fehlen) nicht wichtig ist. Gaußsches weißes Rauschen im Zeitbereich ist Gaußsches weißes Rauschen im Frequenzbereich, siehe Frage: " Wie ist die Statistik der diskreten Fourier-Transformation des weißen Gaußschen Rauschens? ". Deshalb können wir schreiben:

Yk=Xk+Zk,

wobei X und Z die Zk des sauberen Signals und Rauschens sind und Z_k der Rauschbehälter, der einer zirkular symmetrischen komplexen Gaußschen Varianzverteilung σ2 folgt . Jeder Real- und Imaginärteil von Zk folgt unabhängig voneinander einer Gaußschen Varianzverteilung 12σ2 . Wir definieren das Signal-Rausch-Verhältnis (SNR) von bin Yk als:

SNR=σ2|Xk|2.

Ein Versuch, das Rauschen zu reduzieren, wird dann durch spektrale Subtraktion unternommen, wobei die Größe jedes Bin unabhängig wird, während die ursprüngliche Phase beibehalten wird (es sei denn, der Bin-Wert geht bei der auf Null). Die Reduktion bildet eine Schätzung des Quadrats des Absolutwerts jedes Bin der DFT des sauberen Signals:Yk|Xk|2^|Xk|2

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

Dabei ist die bekannte Varianz des Rauschens in jedem DFT-Bin. Der Einfachheit halber berücksichtigen wir nicht oder für gerade , was Sonderfälle für realesBei einem niedrigen SNR kann die Formulierung in (2) manchmal zu einem negativenWir können dieses Problem beheben, indem wir die Schätzung von unten auf Null klemmen und neu definieren:σ2k=0,k=N/2Nx.|Xk|2^.

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

Geben Sie hier die Bildbeschreibung ein
Figure 1. Monte-Carlo-Schätzungen mit einer Stichprobengröße von von: Solid: Gewinn der Summe der quadratischen Fehler bei der Schätzung vondurch im Vergleich zur Schätzung mit gestrichelt: Gewinn der Summe der quadratischen Fehler bei der Schätzung von durch im Vergleich zur Schätzung mit gepunktet: Gewinn der Summe der quadratischen Fehler bei der Schätzung von durch im Vergleich zur Schätzung mitDie Definition von aus (3) wird verwendet.105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.|Xk|2^

Frage: Gibt es eine andere Schätzung vonoder , das (2) und (3) verbessert, ohne sich auf die Verteilung von ?|Xk||Xk|2Yk

Ich denke, das Problem entspricht der Schätzung des Quadrats des Parameters einer Reisverteilung (Abb. 2) mit dem bekannten Parameter gegeben eine einzige Beobachtung.νRice σ R i c e =σRice=22σ,

Geben Sie hier die Bildbeschreibung ein
Abbildung 2. Reisverteilung ist die Verteilung des Abstands zum Ursprung von einem Punkt, der einer bivariaten zirkularsymmetrischen Normalverteilung mit einem Absolutwert des Mittelwerts Varianz folgt und KomponentenvarianzRνRice,2σRice2=σ2σRice2=12σ2.

Ich habe Literatur gefunden, die relevant erscheint:

  • Jan Sijbers, Arnold J. den Dekker, Paul Scheunders und Dirk Van Dyck, "Maximum Likelihood Estimation of Rician Distribution Parameters" , IEEE-Transaktionen zur medizinischen Bildgebung (Band: 17, Ausgabe: 3, Juni 1998) ( doi , pdf ).

Python-Skript A für Schätzerkurven

Dieses Skript kann erweitert werden, um Schätzerkurven in den Antworten zu zeichnen.

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

Python-Skript B für Abb. 1

Dieses Skript kann für Fehlerverstärkungskurven in den Antworten erweitert werden.

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
Meine Güte Olli, eine Klärungsfrage: "Dies ist nur für den Kontext, daher ist die Normalisierung nicht wichtig. Das Rauschen wird dann durch spektrale Subtraktion reduziert, wobei die Größe jedes Bin Yk unabhängig reduziert wird, während die ursprüngliche Phase beibehalten wird (es sei denn, der Bin-Wert geht." in der Größenreduzierung auf Null). "Warum sagen Sie, dass dies eine Rauschreduzierungsoperation ist? Wenn das Geräusch in eine beliebige Richtung gehen kann, scheint es mir, dass dies jedes Geräusch genauso wahrscheinlich verstärkt, wie es ist, um es zu dämpfen.
Cedron Dawg


2
@CedronDawg: Wenn wir die Unabhängigkeit von Signal und Rauschen annehmen, addieren sich ihre Leistungen, sodass das Signal (Leistung) durch Subtrahieren der geschätzten Rauschleistung erhalten wird. In Bezug auf die Leistung kann das Rauschen also nur in eine Richtung gehen.
Matt L.

1
@OlliNiemitalo: Kennen Sie dieses grundlegende Papier von Ephraim und Malah? Sie leiten einen optimalen Schätzer für die Signalamplitude ab, was eine Verbesserung gegenüber der einfachen spektralen Subtraktion darstellt.
Matt L.

1
@OlliNiemitalo: Die DFT-Koeffizienten werden als Gauß-Koeffizienten angenommen (sowohl für das gewünschte Signal als auch für das Rauschen), sodass die Amplituden eine Rayleigh-Verteilung haben. Vgl. Gleichungen (5) und (6) in der Arbeit.
Matt L.

Antworten:


7

Maximum Likelihood (ML) Schätzer

Hier wird ein Maximum-Likelihood-Schätzer für die Leistung des sauberen Signals abgeleitet, der jedoch die Ergebnisse hinsichtlich des quadratischen Mittelwertfehlers für jedes SNR im Vergleich zur spektralen Leistungssubtraktion nicht verbessert.

Einführung

Lassen Sie uns die normalisierte saubere Amplitude und die normalisierte verrauschte Größe einführen, die durch die Rauschstandardabweichung normalisiert sindeinmσ::

(1)ein=|X.k|σ,m=|Y.k|σ.

Der Schätzer in Gl. 3 der Frage gibt eine Schätzung von als:ein^ein

(2)ein^=1σ|X.k|2^=1σmax((σm)2- -σ2,0)={m2- -1wenn m>1,0wenn m1.

Maximum Likelihood Estimator

Um einen möglicherweise besseren Schätzer für als Gl. 2 folgen wir dem Verfahren von Sijbers et al. 1998. (siehe Frage), um einen Maximum-Likelihood (ML) -Schätzer zu konstruierenEs gibt den Wert von , der die Wahrscheinlichkeit des gegebenen Wertes von maximierteinaein^M.L..einm.

Das PDF vonist Rician mit dem Parameterund Parameter (der Klarheit später zu ersetzen)|Y.k|ν R i c e = | X kνR.ichce=|X.k|σR.ichce=12σ::

(3)P.D.F.(|Y.k|)=|Y.k|σR.ichce2exp(- -(|Y.k|2+|X.k|2)2σR.ichce2)ich0(|Y.k||X.k|σR.ichce2),

wobei eine modifizierte Bessel-Funktion der ersten Art ist . Ersetzen von undichα| X k | = σ a , | Y k | = σ m , σ 2 R i c e = 1|X.k|=σein, |Y.k|=σm,σR.ichce2=12σ2::

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

und verwandeln:

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

Das durch parametrisierte Rician-PDF von ist unabhängig von der RauschvarianzDer Maximum-Likelihood-Schätzer von Parameter ist der Wert von , der maximiert . Es ist eine Lösung von:maσ2.a^MLaaPDF(m)

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

Die Lösung zu Gl. 4 hat die Eigenschaft, dass:

(5)a^ML=0 if m1.

Andernfalls muss es numerisch gelöst werden.

Geben Sie hier die Bildbeschreibung ein
Abbildung 1. blau, oben: der Maximum-Likelihood-Schätzer und orange, unten: der Leistungsspektral-Subtraktionsschätzer der Frage der normalisierten sauberen Amplitude als Funktion der normalisierten verrauschten Größea^MLa^am.

σa^ML ist der Maximum-Likelihood-Schätzer von und durch funktionale Invarianz der Maximum-Likelihood-Schätzung ist der Maximum-Likelihood-Schätzer von|Xk|,σ2a^ML2|Xk|2.

Empirische Laurent-Reihe des ML-Schätzers

Ich habe versucht, die Laurent-Reihe von numerisch zu berechnen (siehe Skript weiter unten) aber sie scheint nicht für den Bereich von zu konvergieren . Hier ist eine Kürzung der Laurent-Reihe, soweit ich sie berechnet habe:a^ML2,m

(6)a^ML2m2121m0123m2325m41227m65729m8309211m101884213m1212864215m1498301217m16839919219m187999311221m20

Ich konnte die Zähler- oder Nenner-Ganzzahlsequenzen in der Online-Enzyklopädie der Ganzzahlsequenzen (OEIS) nicht finden. Nur für die ersten fünf Terme mit negativer Leistung stimmen die Zählerkoeffizienten mit A027710 überein . Nachdem ich die berechnete Sequenz ( ) an OEIS Superseeker gesendet hatte , erhielt ich dies in der Antwort (von der ich die nächsten drei vorgeschlagenen Nummern durch eine erweiterte Berechnung):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]

Tabellarische Annäherung und Schätzfehlerverstärkung

Eine linear interpolierte Tabelle (siehe Skripte unten), die ungleichmäßig verteilte Stichproben von ergibt eine Näherung mit einem maximalen Fehler von ungefähr124071a^ML2m26×1011.

Approximation der kleinsten Quadrate des ML-Schätzers

Eine Näherung der kleinsten Quadrate (mit zusätzlichem Gewicht bei ) der Stichproben der Schätzerkurve wurde in einer Form erstellt, die von den Experimenten der Laurent-Reihe inspiriert wurde (siehe Oktavschrift weiter unten). Der konstante Term wurde geändert, um die Möglichkeit eines negativen bei zu beseitigen Die Näherung gilt für und hat einen maximalen Fehler von ungefähr (Abb 3) bei der Annäherung vonm2=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

Geben Sie hier die Bildbeschreibung ein
Abbildung 3. Fehler der Approximation der kleinsten Quadrate vona^ML2.

Das Skript scheint in der Lage zu sein, die Anzahl der negativen Potenzen von erhöhen wobei immer kleinere Fehler auftreten, wobei die Anzahl der Extrema-Fehler zunimmt, jedoch mit einem recht langsamen maximalen Fehlerabfall. Die Annäherung ist fast gleich, würde aber dennoch ein wenig von der Verfeinerung des Remez-Austauschs profitieren .m2,

Unter Verwendung der Näherung wurden die folgenden erwarteten Fehlerverstärkungskurven erhalten:

Geben Sie hier die Bildbeschreibung ein
Abbildung 2. Monte-Carlo-Schätzungen mit einer Stichprobengröße von von: Solid: Gewinn der Summe der quadratischen Fehler bei der Schätzung vondurch im Vergleich zur Schätzung mit gestrichelt: Gewinn der Summe der quadratischen Fehler bei der Schätzung von durch im Vergleich zur Schätzung mit gepunktet: Gewinn der Summe der quadratischen Fehler bei der Schätzung von durch im Vergleich zur Schätzung mitBlau: ML-Schätzer, Orange: geklemmte spektrale Leistungssubtraktion.105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.

Überraschenderweise ist der ML-Schätzer in fast allen Aspekten schlechter als die geklemmte spektrale Leistungssubtraktion, außer dass er für die Signalschätzung bei SNR> etwa 5 dB und die Amplitudenschätzung bei SNR> etwa 3 dB geringfügig besser ist. Bei diesen SNR sind die beiden Schätzer schlechter als nur das verrauschte Signal als Schätzung zu verwenden.

Python-Skript A für Abb. 1

Dieses Skript erweitert das Skript A der Frage.

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)

Python-Skript zur numerischen Berechnung von Laurent-Reihen

Dieses Skript berechnet numerisch die ersten Terme der Laurent-Reihe vonEs basiert auf dem Skript in dieser Antwort .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

Python-Skript zur Tabellierung des ML-Schätzers

Dieses Skript erstellt eine ungleichmäßig abgetastete Tabelle von -Paaren, die für die lineare Interpolation geeignet sind, wobei ungefähr der definierte maximale absolute lineare Interpolationsfehler der Approximation von für den BereichDie Tabellengröße wird automatisch durch Hinzufügen von Stichproben zu den schwierigen Teilen erhöht, bis der Spitzenfehler klein genug ist. Wenn gleich plus einer ganzzahligen Potenz von alle Abtastintervalle Potenzen von Am Ende der Tabelle gibt es einen diskontinuitätsfreien Übergang zu einer großen Näherung[m2,a^ML2]a^ML2m=0mmax.mmax22,2.ma^ML2=m212.Wenn benötigt wird, ist es meiner Meinung nach besser, die Tabelle unverändert zu interpolieren und dann die Konvertierunga^MLa^ML=a^ML2.

Leiten Sie die Ausgabe zur Verwendung in Verbindung mit dem nächsten Skript weiter > 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('];')

Python-Skript B für Abb. 2

Dieses Skript erweitert das Skript B der Frage.

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

Oktavskript für kleinste Quadrate

Dieses Oktavskript (eine Anpassung dieser Antwort ) passt die kleinsten Quadrate der Potenzen von in . Die Beispiele wurden vom Python-Skript etwas oben vorbereitet.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}")

Python-Skript A2 zur Approximation mit Chebyshev-Polynomen

Dieses Skript erweitert Skript A und gibt eine alternative Annäherung an den ML-Schätzer unter Verwendung von Chebyshev-Polynomen. Der erste Chebyshev-Knoten liegt beim=1 und die Anzahl der Chebyshev-Polynome ist so, dass die Approximation nicht negativ ist.

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

Aktualisieren:

Es tut mir leid sagen zu müssen, dass das Testen zeigt, dass das folgende Argument unter starkem Lärm zusammenzubrechen scheint. Das habe ich nicht erwartet, also habe ich definitiv etwas Neues gelernt. Meine vorherigen Tests lagen alle im hohen SNR-Bereich, da ich mich darauf konzentriert habe, im geräuschlosen Fall genaue Lösungen zu finden.


Olli,

Wenn Ihr Ziel darin besteht, die Parameter eines reinen Tons in einem verrauschten Signal zu finden, sollten Sie dies gesagt haben. In dieser Ausgabe habe ich viel Erfahrung und Fachwissen.

Sie sagen, Sie suchen nach der Amplitude (und der Phase, die damit einhergeht), also wette ich, dass Sie Ihre DFT auf eine ganze Anzahl von Zyklen ausrichten. Dies ist die schlechteste Konfiguration für diese Situation, da Sie dann Ihr Signal in nur einem einzigen Bin gegen das Rauschen in diesem einzelnen Bin verarbeiten.

Wie Sie oben gezeigt haben, ist Ihr Trick umso schlechter, je größer das SNR ist, bis es nachteilig oder darüber hinaus ist. Nun, Ihr interessierender Behälter wird derjenige mit dem höchsten SNR sein.

Was Sie tun möchten, ist, Ihren DFT-Rahmen auf einen ganzen plus einen halben Zyklus auszurichten. Dadurch wird Ihr Signal auf so viele Bins wie möglich verteilt. Dann finden Sie die Phase und Amplitude, wie in meinem Blog-Artikel zum Thema Phasen- und Amplitudenberechnung für einen reinen Realton in einer DFT beschrieben: Methode 1 .

Kurz gesagt, Sie behandeln die Gruppe von Bins in der Nähe des Peaks als komplexen Vektorraum. Wenn Sie dann die Frequenz kennen, konstruieren Sie einen Satz Basisvektoren für Ihr Signal. Die Koeffizienten der Vektoren fungieren als virtueller Bin, der Ihnen die Amplitude des Signals sowie die Phase anzeigt. Durch das Finden des Best-Fit-Vektors über mehrere Bins hinweg lässt die Technik nicht zu, dass das Rauschen in einem bestimmten Bin zu dominant ist, und bietet sozusagen einen "Hebel", um den sich das Rauschen ausgleichen muss. Die Rauschunterdrückungseffekte ähneln denen, wenn Zufallsvariablen zusammen gemittelt werden.

Um die Basisvektoren zu konstruieren, müssen Sie die DFT eines Sinus und Cosinus mit Ihrer Frequenz nehmen. Ich habe eine Formel für ihre direkte Berechnung, die die Summierung umgeht. Der Artikel dazu ist aus dem obigen Artikel verlinkt.

Ich würde gerne herausfinden, ob Ihre Technik die Ergebnisse dieser Methode verbessert. Ich bin es gewohnt, in einem höheren SNR >> 1 zu arbeiten, daher habe ich nie wirklich getestet, mit welchen Geräuschpegeln Sie es zu tun haben.

Zusammenfassung des Ansatzes:

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

Weil die DFT ein linearer Operator ist:

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

In Vektornotation:

Z=aA+bB+W

Sie lösen einfach nach a und b mit der linearen Standardalgebra, um die beste Anpassung zu erzielen. Ein Bonus ist, dass Sie auch eine Schätzung von W erhalten. Daher können Sie einen "Throw the Bum Out" -Ansatz ausprobieren und das geschätzte Rauschen im schlecht passenden Behälter vollständig eliminieren und dann neu berechnen. Spülen, wiederholen. Oder reduzieren Sie das Rauschen in jedem Behälter durch eine andere Formel. Wenn Sie dies proportional tun, bleiben Ihre Ergebnisse dieselben wie W orthogonal zu A und B. Eine konstante Subtraktion entlang W anstelle von Z (wie bei Ihrer Methode) sollte jedoch auch die Ergebnisse verbessern.

Normalerweise mache ich die vier Bins um den Peak herum, aber vielleicht möchten Sie das auf 6 oder sogar 8 erweitern. Irgendwann führen mehr Bins zu schlechteren Ergebnissen, da Sie mehr Rauschen als Signal einbringen.

Sie müssen nur die interessierenden DFT-Bins berechnen.


Ich denke, es sollte eine andere Frage geben, bei der Ihre und andere Methoden verglichen werden könnten.
Olli Niemitalo

@OlliNiemitalo, Lass es uns beide tun und die Ergebnisse hier posten. Was ist ein fairer Wert für die Anzahl der Proben pro Zyklus? Wie viele Zyklen pro Frame?
Cedron Dawg

Bitte nicht hier, in einer anderen Frage.
Olli Niemitalo

@OlliNiemitalo, Okay, wenn Sie darauf bestehen, aber es wird nicht wirklich eine Frage sein. Ist dies aus Neugier ein Problem, das Sie wirklich lösen möchten, oder handelt es sich eher um eine akademische Übung?
Cedron Dawg

Ich denke, das Ergebnis könnte im Allgemeinen nützlich sein, daher interessiert es mich, daran zu arbeiten.
Olli Niemitalo

2

Eine interessante Näherungslösung des Maximum-Likelihood (ML) -Schätzproblems wird unter Verwendung der asymptotischen Formel erhalten

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

Unter Verwendung der Notation und der Formeln aus Ollis Antwort erfüllt die optimale ML-Schätzung der normalisierten sauberen Signalamplitude

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

Unter Verwendung von (1) und unter Hinweis darauf, dass I1(x)=I0(x) , erhalten wir die Näherung

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

Diese Näherung hat einen relativen Fehler von weniger als 1 % für x>4.5 .

Das Einstecken von (3) in (2) ergibt die Näherungslösung

(4)a^12(m+m21)

Mit m=|Yk|/σ und a=|Xk|/σ wir

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

Das ist einfach das arithmetische Mittel der verrauschten Beobachtung |Yk|und die Schätzung, die aus der spektralen Leistungssubtraktion erhalten wird.


BEARBEITEN:

Es wäre schön, eine Annäherung wie (3) , die über den gesamten Bereich x[0,) funktioniert . Ein Kandidat für eine solche Annäherung ist die Funktionsfamilie

(6)f(x)=xc1+c2x2

c1=4c2=1f(x)x=0xx

(6)c1=4c2=1

(7)a^=m11m4

oder äquivalent,

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


Ollis Bearbeitung:

enter image description here
a^MLm.a=mmma^ML2m212m,a^MLma^ML2m12a^ML2ca^MLlimm(m2+cm)=0.

Python-Skript für Abb. 1

Dieses Skript erfordert das Skript der Frage für Modulimporte und für die Plotfunktion plot_estsowie die Funktionsdefinition est_a_MLvon Ollis ML-Antwort.

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: Ich habe meine Formeln entsprechend angepasst.
Matt L.

2

Skaleninvarianter minimaler mittlerer quadratischer Fehler (MMSE) ungeeignete einheitliche vorherige Schätzer der transformierten Amplitude

Diese Antwort präsentiert einen Familienskalen-invarianten Schätzer, der durch einen einzelnen Parameter parametrisiert wird, der sowohl die Bayes'sche vorherige Amplitudenverteilung als auch die Transformation der Amplitude in eine andere Skala steuert. Die Schätzer sind Schätzer für den minimalen mittleren quadratischen Fehler (MMSE) in der transformierten Amplitudenskala. Es wird ein falscher einheitlicher Prior der transformierten Amplitude angenommen. Verfügbare Transformationen umfassen eine lineare Skala (keine Transformation) und können sich einer logarithmischen Skala nähern, wobei sich der Schätzer überall Null nähert. Die Schätzer können parametrisiert werden, um eine niedrige Summe von quadratischen Fehlern bei negativen Signal-Rausch-Verhältnissen (SNRs) zu erreichen.

Bayesianische Schätzung

Der Maximum Likelihood (ML) -Schätzer in meiner ersten Antwort schnitt eher schlecht ab. Der ML-Schätzer kann auch als Bayes'scher Maximum-a-posteriori- Schätzer (MAP-Schätzer) verstanden werden, wenn eine falsche gleichmäßige vorherige Wahrscheinlichkeitsverteilung vorliegt. Falsch bedeutet hier, dass sich der Prior von null bis unendlich mit infinitesimaler Dichte erstreckt. Da die Dichte keine reelle Zahl ist, ist der Prior keine richtige Verteilung, aber er kann nach dem Bayes-Theorem immer noch eine richtige hintere Verteilung ergeben , die dann verwendet werden kann, um eine MAP- oder eine MMSE-Schätzung zu erhalten.

Der Satz von Bayes in Bezug auf Wahrscheinlichkeitsdichtefunktionen (PDFs) lautet:

(1)PDF(einm)=PDF(mein)PDF(ein)PDF(m)=PDF(mein)PDF(ein)0PDF(mein)PDF(ein)dein.

ein^KARTE

(2)ein^KARTE=einrGmeinxeinPDF(einm).

ein^MMSE

(3)ein^MMSE=einrGmeinxein^E.[(ein- -ein^)2m]]=E.[einm]]=0einPDF(einm)dein.

Ein falscher einheitlicher Prior ist nicht der einzige skaleninvariante Prior. Alle vorherigen PDF-Dateien sind zufriedenstellend:

(4)P.D.F.(|X.k|)|X.k|ε- -1,

ε- -1,X.k

Eine Familie von Schätzern

Es wird eine Familie von Schätzern mit folgenden Eigenschaften vorgestellt:

  1. X.k,|X.k|,σ|X.k|^
  2. Minimaler Fehler der mittleren quadratischen transformierten Amplitude.
  3. Unsachgemäßer gleichmäßiger Prior der transformierten Amplitude.

Wir werden normalisierte Notation verwenden:

(5)ein=|X.k|σnormalisierte saubere Amplitude,m=|Y.k|σnormalisierte verrauschte Größe,1=(σσ)2normalisierte Rauschvarianz,S.N.R.=(|X.k|σ)2=ein2Signal-Rausch-Verhältnis (10Log10(S.N.R.) dB),

|X.k||Y.k|Y.kX.kσ2.|X.k|

(6)PDF(ein)einε- -1.

G(ein)ein.

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

Gl. 6 und 7 bestimmen zusammen die Familie möglicher Amplitudenumwandlungen. Sie hängen durch eine Änderung der Variablen zusammen :

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

We assume without proof that the choice of the constants c0 and c1 will not affect the amplitude estimate. For convenience we set:

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

which has a special linear case:

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

and a limit:

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

The transformation function can conveniently represent the linear amplitude scale (at ε=1) and can approach a logarithmic amplitude scale (as ε0). For positive ε, the support of the PDF of transformed amplitude is:

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

The inverse transformation function is:

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

The transformed estimate is then, using the law of the unconscious statistician:

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

where PDF(ab) is the posterior PDF and f(am) is an unnormalized posterior PDF defined using Bayes' theorem (Eq. 1), the Rician PDF(ma)=2me(m2+a2)I0(2ma) from Eq. 3.2 of my ML estimator answer, and Eq. 6:

(15)PDF(am)PDF(ma)PDF(a)2me(m2+a2)I0(2ma)×aε1ea2I0(2ma)aε1=f(am),

from which PDF(m) was dropped from the Bayes' formula because it is constant over a. Combining Eqs. 14, 9 & 15, solving the integrals in Mathematica, and simplifying, gives:

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

where Γ is the gamma function and L is the Laguerre function. The estimator collapses to zero everywhere as ε0, so it does not make sense to use negative ε, which would emphasis small values of a even further and give an improper posterior distribution. Some special cases are:

(17)a^uni-MMSE-xform=m2+1,if ε=2,

(18)a^uni-MMSE=a^uni-MMSE-xform=em2/2πI0(m2/2),if ε=1,

approximated at large m by (see calculation) a truncated Laurent series:

(19)a^uni-MMSEm14m732m359128m5,

This asymptotic approximation has an absolute maximum amplitude error of less than 106 for m>7.7.

The estimator curves are shown in Fig. 1.

enter image description here
Figure 1. Estimator a^uni-MMSE-xform as function of m for different values of ε, from top to bottom: blue: ε=2, which minimizes the mean square power error assuming an improper uniform prior of power, orange: ε=1, which minimizes the mean square amplitude error assuming an improper uniform prior of amplitude, green: ε=12, red: ε=14, and purple: ε=18.

At m=0 the curves are horizontal with value:

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

At negative SNR, the uni-MMSE-xform estimator can be parameterized using low ε to give a lower sum of square error compared to the clamped spectral power subtraction estimator, with a corresponding penalty at intermediate SNR values near 7 dB (Fig. 2).

enter image description here
enter image description here
enter image description here
Figure 2. Monte Carlo estimations with a sample size of 105, of: Solid: gain of sum of square error in estimating |Xk| by |Xk|^ as compared to estimating it with |Yk|, dashed: gain of sum of square error in estimating |Xk|2 by |Xk|2^ as compared to estimating it with |Yk|2, dotted: gain of sum of square error in estimating Xk by |Xk|^eiarg(Yk) as compared to estimating it with Yk. Blue: uni-MMSE-xform estimator with ε=1 (top), ε=12 (middle), and ε=14, orange: clamped spectral power subtraction.

Python script for Fig. 1

This script extends the question's script A.

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)

Python script for Fig. 2

This script extends the question's script B. The function est_a_uni_MMSE_xform_fast may be numerically unstable.

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

References

Lieve Lauwers, Kurt Barbe, Wendy Van Moer and Rik Pintelon, Analyzing Rice distributed functional magnetic resonance imaging data: A Bayesian approach, Meas. Sci. Technol. 21 (2010) 115804 (12pp) DOI: 10.1088/0957-0233/21/11/115804.


0

Minimale mittlere quadratische logarithmische Amplitudenfehlerschätzer der Amplitude

Diese Antwort enthält Schätzer, die den mittleren quadratischen logarithmischen Amplitudenfehler für eine Auswahl unpassender Prioritäten der sauberen Amplitude minimieren: gleichmäßig und linear.

Unsachgemäßer vorheriger Schätzer für den minimalen mittleren quadratischen logarithmischen Amplitudenfehler (uni-MMSE-log)

In der Literatur war eine nächste Entwicklung nach einem MMSE-Amplitudenschätzer ein MMSE-Log-Amplitudenschätzer, insbesondere der Schätzer von (Ephraim & Malah 1985, dank @MattL. Als Referenz), der einen Rician vor der sauberen Amplitude annimmt. In einem Versuch, den Schätzer zu verbessernein^uni-MMSE Hier wird ein Schätzer für den minimalen mittleren quadratischen logarithmischen Amplitudenfehler (uni-MMSE-log) für eine falsche Uniform vor der sauberen Amplitude abgeleitet.

Unter Verwendung der normalisierten Variablen meiner Antwort "Skaleninvariante minimale mittlere quadratische Fehler einheitliche vorherige Schätzer der transformierten Amplitude" Gl. (5) ist der Uni-MMSE-Log-Schätzer der sauberen Amplitude:

(1)ein^uni-MMSE-log=einrGmichnein^E.[(Logein- -Logein^)2m]]=exp(E.[Logeinm]]).

Verwenden Sie das Gesetz des unbewussten Statistikers und schreiben Sie dann die Schätzung in Form eines nicht normalisierten PDFf(einm)=PDF(mein),und vereinfachen :

(2)ein^uni-MMSE-log=exp(0Log(ein)PDF(einm)dein)=exp(0Log(ein)f(einm)dein0f(einm)dein)=exp(0Log(ein)PDF(mein)dein0PDF(mein)dein)=exp(0Log(ein)2me- -(m2+ein2)ich0(2mein)dein02me- -(m2+ein2)ich0(2mein)dein)=exp(2me- -m20Log(ein)e- -ein2ich0(2mein)deinme- -m2πem2/.2ich0(m2/.2))=exp(20Log(ein)e- -ein2ich0(2mein)deinπem2/.2ich0(m2/.2))=exp(em2/.2ich0(m22)Ψ(12)+m2F.201112(3/.2;;1;;1,1/.2;;2,2;;;;3/.2;;m2,m2)2em2/.2ich0(m2/.2))=exp(m2F.201112(3/.2;;1;;1,1/.2;;2,2;;;;3/.2;;m2,m2))2em2/.2ich0(m2/.2)- -γ2- -Log2),

wo Ψist die Digammafunktion ,γist die Euler-Mascheroni-Konstante undF.201112ist eine Kampé de Fériet (-ähnliche) Funktion . Diese spezielle Funktionsform des Schätzers kann in Pythons mpmath ausgewertet werden (siehe Skript am Ende der Antwort). Es gibt auch ein Formular mit Serien, für das keine speziellen Funktionen erforderlich sind:

(3)=exp(- -L.- -1/.2(1,0)(m2)2em2/.2ich0(m2/.2)+Ψ(12)2)=exp(k=0((1/.2)km2k(1)kk!n=1k12n- -1)em2/.2ich0(m2/.2)+Ψ(12)2)=exp(k=0((1/.2)km2k(1)kk!n=1k12n- -1)k=0(1/.2)km2k(1)kk!- -γ2- -Log2),

wo L.n(x) ist Laguerres L-Funktion und hochgestellt (1,0) bezeichnet die Differenzierung in Bezug auf den tiefgestellten Parameter und (x)kist ein Pochhammer-Symbol mit Sonderfällen(1)k=k! und (1/.2)k=(2k- -1)!!/.2k. Die Zähler- und Nennerreihen können bei zehn Termen abgeschnitten werden, um den Schätzer für niedrig zu erhalten m.Eine bessere Genauigkeit wird erzielt, wenn beide Reihen mit derselben Längenkürzung approximiert werden, verglichen mit der Verwendung einer exakten Sonderfunktion für die andere oder mit unterschiedlichen Längenkürzungen. Es ist schwierig, die Serie insgesamt zu bewertenm weil die größten Begriffe herum erscheinen km2.

Der ursprüngliche Ausdruck der Reihe von @ user150203 in Bezug auf das Zählerintegral gibt einen weiteren äquivalenten Ausdruck für den Schätzer:

(4)=exp(k=0m2kk!(k- -12k)Ψ(k+12)2em2/.2ich0(m2/.2))=exp(k=0m2kk!(k- -12k)Ψ(k+12)2k=0m2kk!(k- -12k)),

wo (einb)bezeichnet einen Binomialkoeffizienten .

Die Kurve des Uni-MMSE-Log-Schätzers (Abb. 1, orangefarbene untere Kurve) ähnelt der des Uni-MMSE-Schätzers, jedoch mit einem niedrigeren Wert beim=0::

(5)ein^uni-MMSE-log=e- -γ20,374653,wenn m=0.

Unsachgemäßer vorheriger Schätzer des linearen minimalen quadratischen logarithmischen Amplitudenfehlers (lin-MMSE-log)

Ein verwandter Schätzer kann erhalten werden, wenn man die Grenze des Schätzers von (Ephraim & Malah 1985) bei unendlicher vorheriger Varianz der sauberen komplexen Variablen nimmt. Dann wird die Rayleigh- Prioritätswahrscheinlichkeitsdichtefunktion der sauberen Amplitude zu einer linearen Rampe, die bei einer Größe von Null Null ist und linear mit einer infinitesimalen Steigung ansteigt. Der resultierende Schätzer (Abb. 1, blaue obere Kurve) ist:

(6)ein^lin-MMSE-Protokoll=exp(12m2e- -ttdt)m=exp(- -Ei(- -m2)2)m=exp(Γ(0,m2)2)m,
(7)limm0+ein^lin-MMSE-Protokoll=e- -γ/.20,749306,

wo Ei(x)ist das Exponentialintegral undΓ(0,x)ist die obere unvollständige Gammafunktion .

Geben Sie hier die Bildbeschreibung ein
Abbildung 1. Schätzer für minimale mittlere quadratische logarithmische Amplitudenfehler: blau, oben: ein^lin-MMSE-Protokoll mit einem falschen linearen Prior und Orange, niedriger: ein^uni-MMSE-logmit einer falschen Uniform vor. Geschätzte saubere Amplitudeein^ als Funktion der verrauschten Größe m mit additivem Rauschen der Einheitsvarianz.

Python-Skript für Abb. 1

Dieses Skript erweitert das Skript A der Frage. Die Funktion est_a_uni_MMSE_logist insgesamt numerisch instabil 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)

Verweise

Y. Ephraim und D. Malah, Sprachverbesserung unter Verwendung eines logarithmischen Spektralamplitudenschätzers für minimale quadratische Fehler , IEEE Transactions on Acoustics Speech and Signal Processing , Mai 1985, DOI: 10.1109 / TASSP.1985.1164550 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.