Ước tính cho phép trừ phổ cải thiện của tiếng ồn


8

Nhiễu trắng Gaussian trung bình thực, không phụ thuộc vào tín hiệu sạch và phương sai đã biết được thêm vào tạo ra tín hiệu nhiễuBiến đổi Fourier rời rạc (DFT) của tín hiệu nhiễu được tính bằng:xxy.Y

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

Đây chỉ là bối cảnh và chúng tôi sẽ xác định phương sai nhiễu trong miền tần số, vì vậy việc chuẩn hóa (hoặc thiếu chúng) là không quan trọng. Nhiễu trắng Gaussian trong miền thời gian là nhiễu trắng Gaussian trong miền tần số, xem câu hỏi: " Thống kê biến đổi Fourier rời rạc của nhiễu Gaussian trắng là gì? ". Vì vậy, chúng ta có thể viết:

Yk=Xk+Zk,

Trong đó và là DFT của tín hiệu và nhiễu sạch và thùng tạp âm theo phân phối Gaussian đối xứng phức tạp tròn đối xứng . Mỗi phần thực và phần ảo của độc lập tuân theo phân phối phương sai Gaussian . Chúng tôi xác định tỷ lệ tín hiệu / nhiễu (SNR) của bin là:XZZkσ2Zk12σ2Yk

SNR= =σ2|Xk|2.

Sau đó, một nỗ lực để giảm nhiễu được thực hiện bằng phép trừ phổ, theo đó độ lớn của mỗi thùng được giảm độc lập trong khi vẫn giữ lại pha ban đầu (trừ khi giá trị bin giảm về 0 khi giảm cường độ). Việc giảm tạo thành ước tính của hình vuông của giá trị tuyệt đối của mỗi thùng của DFT của tín hiệu sạch:Yk|Xk|2^|Xk|2

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

trong đó là phương sai đã biết của tiếng ồn trong mỗi thùng DFT. Để đơn giản, chúng tôi không xem xét hoặc cho ngay cả , đó là những trường hợp đặc biệt cho thựcỞ SNR thấp, công thức trong (2) đôi khi có thể dẫn đến âmChúng tôi có thể loại bỏ vấn đề này bằng cách kẹp ước tính về 0 từ bên dưới, xác định lại:σ2k= =0,k= =N/2Nx.|Xk|2^.

(3)|Xk|2^= =tối đa(|Yk|2-σ2,0).

nhập mô tả hình ảnh ở đây
Hình 1. Ước tính Monte Carlo với cỡ mẫu là trong số: Solid: mức tăng tổng sai số vuông khi ước tínhby so với ước tính nó với dashed: mức tăng của tổng lỗi vuông khi ước tính bằng so với ước tính với chấm: tăng tổng lỗi vuông khi ước tính theo so với ước tính vớiĐịnh nghĩa của từ (3) được sử dụng.105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eTôitranh luận(Yk)Yk.|Xk|2^

Câu hỏi: Có ước tính khác vềhoặc cải thiện (2) và (3) mà không phụ thuộc vào phân phối của ?|Xk||Xk|2Yk

Tôi nghĩ vấn đề này tương đương với việc ước tính bình phương của tham số của phân phối Rice (Hình 2) với tham số đã biết được đưa ra một quan sát duy nhất.νRTôiceσRTôice= =22σ,

nhập mô tả hình ảnh ở đây
Hình 2. Phân phối gạo là phân phối khoảng cách đến điểm xuất phát từ một điểm theo phân phối chuẩn đối xứng tròn bivariate với giá trị tuyệt đối của trung bình phương sai và phương sai thành phầnRνRTôice,2σRTôice2= =σ2σRTôice2= =12σ2.

Tôi tìm thấy một số tài liệu có vẻ phù hợp:

  • Jan Sijbers, Arnold J. den Dekker, Paul Scheunders và Dirk Van Dyck, "Ước tính khả năng tối đa của các thông số phân phối Rician" , Giao dịch của IEEE về hình ảnh y tế (Tập: 17, Số phát hành: 3, Tháng 6 năm 1998) ( doi , pdf ).

Kịch bản Python A cho các đường cong ước tính

Kịch bản này có thể được mở rộng để vẽ đồ thị đường cong ước tính trong các câu trả lời.

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

Tập lệnh Python B cho Hình 1

Kịch bản này có thể được mở rộng cho các đường cong đạt được lỗi trong các câu trả lời.

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
Gosh Olli, một câu hỏi làm rõ: "Đây chỉ là bối cảnh, vì vậy việc chuẩn hóa không quan trọng. Tiếng ồn sau đó được giảm bằng phép trừ phổ, theo đó độ lớn của mỗi bin Yk được giảm độc lập trong khi vẫn giữ nguyên pha ban đầu (trừ khi giá trị bin đi về 0 trong việc giảm cường độ). "Điều gì khiến bạn nói đây là hoạt động giảm nhiễu? Nếu tiếng ồn có thể đi theo bất kỳ hướng nào, đối với tôi, dường như điều này sẽ có khả năng khuếch đại bất kỳ tiếng ồn nào như là làm giảm nó.
Cedron Dawg

1
Điều này có hữu ích không? dsp.stackexchange.com/questions/24170/ Kẻ
Cedron Dawg

2
@CedronDawg: Nếu chúng ta giả sử sự độc lập của tín hiệu và nhiễu, công suất của chúng sẽ được thêm vào, do đó tín hiệu (công suất) có được bằng cách trừ đi công suất nhiễu ước tính. Vì vậy, về sức mạnh, tiếng ồn chỉ có thể đi theo một hướng.
Matt L.

1
@OlliNiemitalo: Bạn có biết bài viết cơ bản này của Ephraim và Malah không? Họ lấy được một công cụ ước tính tối ưu cho biên độ tín hiệu, đây là một cải tiến so với phép trừ phổ đơn giản.
Matt L.

1
@OlliNiemitalo: Các hệ số DFT được giả sử là Gaussian (đối với tín hiệu mong muốn cũng như đối với nhiễu), do đó biên độ có phân bố Rayleigh. Cf. Các phương trình (5) và (6) trong bài báo.
Matt L.

Câu trả lời:


7

Ước tính khả năng tối đa (ML)

Ở đây sẽ có được một công cụ ước tính khả năng tối đa về sức mạnh của tín hiệu sạch, nhưng dường như nó không cải thiện mọi thứ về lỗi bình phương gốc, đối với bất kỳ SNR nào, so với phép trừ công suất quang phổ.

Giới thiệu

Chúng ta hãy giới thiệu biên độ sạch đã chuẩn hóa và cường độ nhiễu bình thường chuẩn hóa bởi độ lệch chuẩn nhiễuamσ:

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

Công cụ ước tính trong phương trình. 3 câu hỏi đưa ra ước tính of là:a^a

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

Ước tính khả năng tối đa

Để làm một công cụ ước tính có thể tốt hơn của phương trình. 2, chúng tôi làm theo thủ tục của Sijbers et al. 1998. (xem câu hỏi) để xây dựng công cụ ước tính khả năng tối đa (ML)Nó đưa ra giá trị của tối đa hóa xác suất của giá trị đã cho củaaa^ML.am.

Bản PDF củalà Rician với tham sốvà tham số (sẽ được thay thế sau này cho rõ ràng)|Yk|νRice=|Xk|σRTôice= =12σ:

(3)PDF(|Yk|)= =|Yk|σRTôice2điểm kinh nghiệm(-(|Yk|2+|Xk|2)2σRTôice2)Tôi0(|Yk||Xk|σRTôice2),

Trong đó là hàm Bessel được sửa đổi thuộc loại thứ nhất . Thay thế vàTôiα|Xk|= =σmột, |Yk|= =σm,σRTôice2= =12σ2:

(3.1)= =PDF(σm)= =2mσe-(m2+một2)Tôi0(2mmột),

và biến đổi:

(3.2)PDF(m)= =σPDF(σm)= =2me-(m2+một2)Tôi0(2mmột).

PDF Rician của tham số hóa bởi độc lập với phương sai tạp âmTối đa khả năng ước lượng của tham số là giá trị của nhằm tối đa hóa . Đây là một giải pháp của:mmộtσ2.một^MLmộtmộtPDF(m)

(4)mTôi1(2mmột^ML)Tôi0(2mmột^ML)-một^ML= =0.

Giải pháp cho phương trình. 4 có tài sản rằng:

(5)một^ML= =0 nếu m1.

Nếu không, nó cần phải được giải quyết bằng số.

nhập mô tả hình ảnh ở đây
Hình 1. màu xanh lam, phía trên: công cụ ước tính khả năng tối đa và màu cam, thấp hơn: công cụ ước lượng trừ phổ công suất của câu hỏi có biên độ sạch bình thường , như chức năng của cường độ nhiễu bình thườngmột^MLmột^mộtm.

σmột^ML là công cụ ước tính khả năng tối đa của và bằng cách bất biến chức năng của ước tính khả năng tối đa, là công cụ ước tính khả năng tối đa của|Xk|,σ2một^ML2|Xk|2.

Chuỗi thực nghiệm Laurent của công cụ ước tính ML

Tôi đã cố gắng tính toán bằng số (xem thêm tập lệnh bên dưới) loạt của Laurent nhưng dường như nó không hội tụ cho phạm vi cần thiết. Đây là một đoạn ngắn của loạt Laurent theo như tôi đã tính toán:một^ML2,m

(6)một^ML2m2-121m0-123m2-325m4-1227m6-5729msố 8-309211m10-1884213m12-12864215m14-98301217m16-839919219m18-7999311221m20

Tôi không thể tìm thấy các chuỗi số nguyên tử số hoặc mẫu số trong Từ điển bách khoa trực tuyến về chuỗi số nguyên (OEIS). Chỉ trong năm thuật ngữ công suất âm đầu tiên, các hệ số tử số phù hợp với A027710 . Tuy nhiên, sau khi gửi chuỗi được tính toán ( ) cho OEIS Superseeker , tôi đã nhận được điều này trong thư trả lời (từ đó tôi đã xác nhận ba số được đề xuất tiếp theo bằng cách tính toán mở rộng):1,-1,-1,-3,Giáo dục-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]

Ước tính xấp xỉ và ước tính lỗi đạt được

Một bảng nội suy tuyến tính (xem các tập lệnh bên dưới) chứa mẫu được phân phối không đồng đều của đưa ra một xấp xỉ với sai số tối đa khoảng124071một^ML2-m26×10-11.

Bình phương gần đúng nhất của công cụ ước tính ML

Một xấp xỉ bình phương tối thiểu (với trọng số tăng thêm tại ) của các mẫu của đường cong ước lượng đã được tạo ra, dưới dạng lấy cảm hứng từ các thí nghiệm loạt Laurent (xem thêm kịch bản Octave). Thuật ngữ không đổi được thay đổi để loại bỏ khả năng âm tại Phép gần đúng có giá trị cho và có sai số tối đa khoảng (Hình . 3) trong xấp xỉm2= =1- 0.5- 0.49999998237308493999một2m2= =1.m212×10-5một^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

nhập mô tả hình ảnh ở đây
Hình 3. Lỗi về xấp xỉ bình phương nhỏ nhất củamột^ML2.

Kịch bản dường như có khả năng xử lý tăng số lượng công suất âm của liên tục đưa ra các lỗi nhỏ hơn và nhỏ hơn, với số lượng lỗi cực đoan ngày càng tăng, nhưng với sự phân rã lỗi tối đa khá chậm. Giá trị gần đúng là gần bằng, nhưng vẫn có lợi một chút từ sàng lọc trao đổi Remez .m2,

Sử dụng phép tính gần đúng, các đường cong đạt được lỗi dự kiến ​​sau đây đã thu được:

nhập mô tả hình ảnh ở đây
Hình 2. Các ước tính của Monte Carlo với cỡ mẫu là trong số: Solid: mức tăng tổng sai số vuông khi ước tínhby so với ước tính nó với dashed: mức tăng của tổng lỗi vuông khi ước tính bằng so với ước tính với chấm: tăng tổng lỗi vuông khi ước tính theo so với ước tính vớiMàu xanh dương: Công cụ ước tính ML, màu cam: phép trừ công suất quang phổ kẹp.105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.

Đáng ngạc nhiên, công cụ ước tính ML kém hơn so với phép trừ công suất quang phổ bị kẹp ở hầu hết các khía cạnh, ngoại trừ việc ước tính tín hiệu tốt hơn ở SNR> khoảng 5 dB và ước tính biên độ ở SNR> khoảng 3 dB. Tại các SNR đó, hai công cụ ước tính tệ hơn là chỉ sử dụng tín hiệu nhiễu làm ước tính.

Kịch bản Python A cho Hình 1

Kịch bản này mở rộng kịch bản của câu hỏi A.

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)

Kịch bản Python để tính toán số lượng của chuỗi Laurent

Kịch bản này tính toán số lượng một vài thuật ngữ đầu tiên của loạt LaurentNó dựa trên kịch bản trong câu trả lời này .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

Tập lệnh Python để lập bảng của công cụ ước tính ML

Tập lệnh này tạo một bảng được lấy mẫu không đồng đều của các cặp phù hợp với phép nội suy tuyến tính, đưa ra lỗi nội suy tuyến tính tuyệt đối tối đa được xác định của xấp xỉ cho phạm viKích thước bảng được tự động tăng lên bằng cách thêm mẫu vào các phần khó, cho đến khi sai số cực đại đủ nhỏ. Nếu bằng cộng với một sức mạnh nguyên của sau đó tất cả các khoảng thời gian lấy mẫu sẽ được quyền hạn của Vào cuối của bảng sẽ có một sự chuyển tiếp gián đoạn miễn phí đến một mô lớn xấp xỉ[m2,a^ML2]a^ML2m=0mmax.mmax22,2.ma^ML2=m212.Nếu cần , tôi đoán là tốt hơn là nội suy bảng như vậy và sau đó thực hiện chuyển đổia^MLa^ML=a^ML2.

Để sử dụng kết hợp với tập lệnh tiếp theo, đặt đầu ra > 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('];')

Kịch bản Python B cho Hình 2

Kịch bản này mở rộng kịch bản câu hỏi B.

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

Kịch bản Octave cho hình vuông nhỏ nhất

Kịch bản Octave này (một bản phóng tác của câu trả lời này ) thực hiện tối thiểu các bình phương phù hợp với quyền hạn của thành . Các mẫu được chuẩn bị bởi kịch bản Python một chút ở trên.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}")

Tập lệnh Python A2 để tính gần đúng bằng cách sử dụng đa thức Ch Quashev

Tập lệnh này mở rộng tập lệnh A và đưa ra một xấp xỉ thay thế của công cụ ước tính ML bằng cách sử dụng đa thức Ch Quashev. Nút Ch Quashev đầu tiên là tại và số lượng đa thức Ch Quashev sao cho gần đúng là không âm.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

Cập nhật:

Tôi rất tiếc phải nói rằng thử nghiệm cho thấy lập luận sau đây dường như bị phá vỡ dưới tiếng ồn lớn. Đây không phải là những gì tôi mong đợi, vì vậy tôi chắc chắn đã học được điều gì đó mới. Thử nghiệm trước đây của tôi đều nằm trong phạm vi SNR cao vì trọng tâm của tôi là tìm kiếm các giải pháp chính xác trong trường hợp không ồn ào.


Olli,

Nếu mục tiêu của bạn là tìm các thông số của âm thuần trong tín hiệu nhiễu, bạn nên nói như vậy. Vấn đề này, tôi có rất nhiều kinh nghiệm và chuyên môn trong.

Bạn nói rằng bạn đang tìm kiếm biên độ (và pha đi kèm với nó) vì vậy tôi cá rằng bạn đang xếp hàng DFT của mình để có toàn bộ số chu kỳ. Đây là cấu hình tồi tệ nhất cho tình huống này khi bạn đang xử lý tín hiệu của mình chỉ trong một thùng chống lại nhiễu trong thùng đó.

Như bạn đã trình bày ở trên, SNR càng lớn thì thủ thuật của bạn càng tệ, đến mức gây bất lợi hoặc xa hơn. Chà, thùng quan tâm của bạn sẽ là người có SNR cao nhất.

Những gì bạn muốn làm là căn chỉnh khung DFT của bạn trên toàn bộ một nửa chu kỳ. Điều này sẽ truyền tín hiệu của bạn qua càng nhiều thùng càng tốt. Sau đó, bạn có thể tìm thấy pha và biên độ như được mô tả trong bài viết trên blog của tôi về chủ đề Tính toán pha và biên độ cho một giai điệu thực sự thuần khiết trong DFT: Phương pháp 1 .

Nói tóm lại, bạn coi bộ thùng gần đỉnh là không gian vectơ phức tạp. Sau đó biết tần số, bạn xây dựng một tập các vectơ cơ sở cho tín hiệu của bạn. Các hệ số của vectơ hoạt động như một thùng ảo sẽ cho bạn biết biên độ của tín hiệu cũng như pha. Bằng cách tìm ra vectơ phù hợp nhất trên một số thùng, kỹ thuật không cho phép tiếng ồn trong bất kỳ thùng cụ thể nào quá nổi trội và loại cung cấp một "đòn bẩy" mà tiếng ồn phải cân bằng xung quanh. Các hiệu ứng giảm nhiễu tương tự như khi các biến ngẫu nhiên được tính trung bình cùng nhau.

Xây dựng các vectơ cơ sở có nghĩa là lấy DFT của sin và cos theo tần số của bạn. Tôi có một công thức cho tính toán trực tiếp của họ mà bỏ qua việc phải thực hiện tổng kết. Bài viết cho điều đó được liên kết từ bài viết trên.

Tôi sẽ quan tâm đến việc tìm hiểu xem kỹ thuật của bạn có cải thiện kết quả của phương pháp này không. Tôi đã quen làm việc ở SNR cao hơn >> 1 vì vậy tôi chưa bao giờ thực sự kiểm tra mức độ tiếng ồn mà bạn đang xử lý.

Tóm tắt của phương pháp:

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

Bởi vì DFT là một toán tử tuyến tính:

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

Trong ký hiệu vectơ:

Z=aA+bB+W

Bạn chỉ đơn giản là giải và bằng cách sử dụng đại số tuyến tính tiêu chuẩn để cung cấp cho bạn sự phù hợp nhất. Một phần thưởng là bạn cũng có được ước tính của W. Do đó, bạn có thể thử phương pháp "ném bum ra" và loại bỏ hoàn toàn tiếng ồn ước tính trong thùng lắp xấu nhất và sau đó tính toán lại. Rửa sạch, lặp lại. Hoặc giảm tiếng ồn trong mỗi thùng bằng một số công thức khác. Nếu bạn thực hiện theo tỷ lệ, kết quả của bạn sẽ vẫn giống như W trực giao với A và B. Nhưng phép trừ không đổi dọc theo W, thay vì Z (như phương pháp của bạn) cũng sẽ cải thiện kết quả.ab

Thông thường, tôi thực hiện bốn thùng quanh đỉnh, nhưng bạn có thể muốn kéo dài đến 6 hoặc thậm chí 8. Tại một số điểm, nhiều thùng hơn cho kết quả tồi tệ hơn khi bạn mang lại nhiều tiếng ồn hơn tín hiệu.

Bạn chỉ phải tính các thùng lãi DFT.


Tôi nghĩ nên có một câu hỏi khác trong đó phương pháp của bạn và các phương pháp khác có thể được so sánh.
Olli Niemitalo

@OlliNiemitalo, chúng ta hãy làm điều đó và đăng kết quả tại đây. Giá trị hợp lý cho số lượng mẫu trên mỗi chu kỳ là gì? Đối với vấn đề đó, có bao nhiêu chu kỳ trên mỗi khung?
Cedron Dawg

Không ở đây xin vui lòng, trong một câu hỏi khác.
Olli Niemitalo

@OlliNiemitalo, Được rồi, nếu bạn khăng khăng, nhưng nó thực sự không phải là một câu hỏi. Vì tò mò, đây có phải là một vấn đề bạn đang cố gắng giải quyết thực sự, hay nó là một bài tập học thuật hơn?
Cedron Dawg

Tôi nghĩ rằng kết quả có thể hữu ích theo nghĩa chung vì vậy nó khiến tôi thích thú với nó.
Olli Niemitalo

2

Một giải pháp gần đúng thú vị của bài toán ước lượng khả năng tối đa (ML) có được bằng cách sử dụng công thức tiệm cận

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

Sử dụng ký hiệu và công thức từ câu trả lời của Olli , ước tính ML tối ưu của biên độ tín hiệu sạch được chuẩn hóa thỏa mãn

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

Sử dụng và lưu ý rằng , chúng tôi có được xấp xỉ(1)I1(x)=I0(x)

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

Xấp xỉ này có sai số tương đối nhỏ hơn % cho .1x>4.5

Cắm vào cho giải pháp gần đúng(3)(2)

(4)a^12(m+m21)

Với và chúng ta thu đượcm=|Yk|/σa=|Xk|/σ

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

đó đơn giản là trung bình số học của quan sát nhiễuvà ước tính thu được từ phép trừ công suất quang phổ.|Yk|


BIÊN TẬP:

Tôi sẽ rất vui khi có một xấp xỉ như hoạt động trên toàn bộ phạm vi . Một ứng cử viên cho một xấp xỉ như vậy là họ các hàm(3)x[0,)

(6)f(x)=xc1+c2x2

Sự lựa chọn đúng về mặt lý thuyết của các hằng số là và , xem xét các thuộc tính của xung quanh và . Tuy nhiên, đối với phạm vi thực tế của , một xấp xỉ tốt hơn trong phạm vi đó có thể đạt được bằng cách điều chỉnh các hằng số đó một chút.c1=4c2=1f(x)x=0xx

Sử dụng phép tính gần đúng với và kết quả trong ước tính sau:(6)c1=4c2=1

(7)a^=m11m4

hoặc, tương đương,

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


Chỉnh sửa của Olli:

nhập mô tả hình ảnh ở đây
Hình 1. (màu cam) và các xấp xỉ của nó được xác định bởi biểu thức. 4 (màu xanh) và phương trình. 7 (màu xanh lá cây), như chức năng củaTất cả các đường cong tiếp cận là (xem hình bên phải cho lớn ). tiệm cận phương pháp tiếp cận của nó cắt ngắn Laurent loạt là mang đến cho các kết quả tò mò rằng mặc dù xấp xỉ của bất thường tiếp cận nó dưới dạng , bình phương của phương trình. 7 có lỗi liên tục trong việc xấp xỉ làa^MLm.a=mmma^ML2m212m,a^MLma^ML2mbởi vì số hạng 0 không đổi của chuỗi Laurent của nó khác với của chuỗi Laurent của (xem câu trả lời của công cụ ước tính ML của Olli) và chuỗi Laurent của hình vuông Phương trình 4. Lỗi không đổi biến mất trong ước tính do thực tế là12a^ML2ca^MLlimm(m2+cm)=0.

Kịch bản Python cho hình 1

Tập lệnh này yêu cầu tập lệnh của câu hỏi để nhập mô-đun và cho chức năng vẽ biểu đồ plot_estvà định nghĩa hàm est_a_MLtừ câu trả lời ML của 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: Tôi đã điều chỉnh công thức của mình cho phù hợp.
Matt L.

2

Ước tính sai số trung bình tối thiểu bất biến tỷ lệ (MMSE) không phù hợp ước lượng trước của biên độ biến đổi

Câu trả lời này trình bày một công cụ ước lượng bất biến quy mô gia đình, được tham số hóa bởi một tham số duy nhất kiểm soát cả phân bố biên độ trước của Bayes và chuyển đổi biên độ sang thang đo khác. Các công cụ ước tính là công cụ ước tính sai số trung bình bình phương (MMSE) tối thiểu trong thang biên độ được chuyển đổi. Một đồng phục không phù hợp trước khi biên độ biến đổi được giả định. Các phép biến đổi có sẵn bao gồm thang đo tuyến tính (không biến đổi) và có thể tiếp cận thang đo logarit, theo đó công cụ ước tính tiến tới 0 ở mọi nơi. Các công cụ ước tính có thể được tham số hóa để đạt được tổng sai số thấp ở tỷ lệ nhiễu tín hiệu âm (SNR) âm.

Ước tính Bayes

Công cụ ước tính khả năng tối đa (ML) trong câu trả lời đầu tiên của tôi thực hiện khá kém. Công cụ ước tính ML cũng có thể được hiểu là công cụ ước tính tối đa Bayesian (MAP) với phân phối xác suất trước thống nhất không phù hợp. Ở đây, không đúng có nghĩa là trước đó kéo dài từ 0 đến vô cùng với mật độ vô hạn. Bởi vì mật độ không phải là một số thực, trước đó không phải là một phân phối thích hợp, nhưng nó vẫn có thể cung cấp một phân phối sau đúng theo định lý Bayes mà sau đó có thể được sử dụng để có được ước tính MAP hoặc MMSE.

Định lý của Bayes về các hàm mật độ xác suất (PDF) là:

(1)PDF(một|m)= =PDF(m|một)PDF(một)PDF(m)= =PDF(m|một)PDF(một)0PDF(m|một)PDF(một)dmột.

Công cụ ước tính MAP là đối số của PDF sau để tối đa hóa nó:một^BẢN ĐỒ

(2)một^BẢN ĐỒ= =mộtrgmmộtxmộtPDF(một|m).

Công cụ ước tính MMSE là giá trị trung bình sau:một^MMSE

(3)một^MMSE= =mộtrgmmộtxmột^E[(một-một^)2|m]= =E[một|m]= =0mộtPDF(một|m)dmột.

Đồng phục không phù hợp trước không phải là bất biến tỷ lệ duy nhất trước đó. Bất kỳ bản PDF nào trước đây đều thỏa mãn:

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

với số mũ thực và có nghĩa: "tỷ lệ thuận với", là bất biến tỷ lệ theo nghĩa là sản phẩm của và hằng số dương vẫn tuân theo cùng phân phối (xem Lauwers et al. 2010 ).ε-1,αXk

Một gia đình ước tính

Một họ các công cụ ước tính sẽ được trình bày, với các tính chất sau:

  1. Bất biến tỷ lệ: Nếu bin sạch phức tạp hoặc tương đương biên độ sạch và độ lệch chuẩn tiếng ồn đều được nhân với cùng một hằng số dương, thì biên độ ước tính sẽ được nhân lên bởi hằng số đó.Xk,|Xk|,σ|Xk|^
  2. Bình phương sai số trung bình biến đổi-biên độ.
  3. Đồng phục không đúng trước biên độ biến đổi.

Chúng ta sẽ sử dụng ký hiệu chuẩn hóa:

(5)một= =|Xk|σbình thường hóa biên độ sạch,m= =|Yk|σbình thường hóa độ ồn,1= =(σσ)2phương sai bình thường hóa của tiếng ồn,SNR= =(|Xk|σ)2= =một2tỷ lệ tín hiệu trên tạp âm (10đăng nhập10(SNR) dB),

trong đólà biên độ sạch mà chúng tôi muốn ước tính từ cường độ nhiễucủa giá trị bin whicy bằng tổng giá trị bin sạch cộng với nhiễu Gaussian phức tạp đối xứng tròn của phương saiTỷ lệ bất biến trướcđược đưa ra trong phương trình. 4 được chuyển sang ký hiệu chuẩn hóa là:|Xk||Yk|YkXkσ2.|Xk|

(6)PDF(một)αmộtε-1.

Đặt là hàm biến đổi biên độ tăng dầnĐồng phục không phù hợp trước biên độ biến đổi được ký hiệu là:g(một)một.

(7)PDF(g(một))α1.

Các phương trình. 6 & 7 cùng xác định họ biến đổi biên độ có thể. Chúng có liên quan bởi một sự thay đổi của các biến :

(số 8)g'(một)PDF(g(một))= =PDF(một)g'(một)αmộtε-1g(một)αmộtε-1dmột= =mộtεε+cg(một)= =c1mộtεε+c0.

Chúng tôi giả sử mà không có bằng chứng cho thấy việc lựa chọn các hằng số và sẽ không ảnh hưởng đến ước tính biên độ. Để thuận tiện, chúng tôi đặt:c0c1

(9)g(1)= =1g'(1)= =1c0= =ε-1εc1= =1g(một)= =mộtε+ε-1ε,

trong đó có một trường hợp tuyến tính đặc biệt:

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

và giới hạn:

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

Hàm biến đổi có thể biểu diễn thuận tiện thang đo biên độ tuyến tính (tại ) và có thể tiếp cận thang đo biên độ logarit (như ). Đối với dương sự hỗ trợ của PDF về biên độ được chuyển đổi là:ε=1ε0ε,

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

Hàm biến đổi nghịch đảo là:

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

Ước tính được chuyển đổi là sau đó, sử dụng luật của nhà thống kê vô thức :

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

trong đó là PDF sau và là một PDF sau không chuẩn hóa được định nghĩa bằng định lý Bayes (Eq. 1), Rician từ biểu thức. 3.2 của câu trả lời ước tính ML của tôi và phương trình. 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),

từ đó đã bị loại bỏ khỏi công thức của Bayes vì ​​nó không đổi trênKết hợp các phương trình. 14, 9 & 15, giải các tích phân trong Mathicala và đơn giản hóa, đưa ra: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/ε,

Trong đó là hàm gamma và là hàm Laguerre . Ước tính sụp đổ để zero ở khắp mọi nơi như vì vậy nó không có ý nghĩa để sử dụng tiêu cực mà sẽ nhấn mạnh giá trị nhỏ của xa hơn nữa và đưa ra một phân bố sau không đúng. Một số trường hợp đặc biệt là:Γ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,

xấp xỉ ở lớn bằng ( xem tính toán ) một chuỗi Laurent bị cắt ngắn:m

(19)a^uni-MMSEm14m732m359128m5,

Phép tính gần đúng tiệm cận này có sai số biên độ cực đại tuyệt đối nhỏ hơn cho106m>7.7.

Các đường cong ước tính được hiển thị trong Hình. 1.

nhập mô tả hình ảnh ở đây
Hình 1. Công cụ ước tính là hàm của cho các giá trị khác nhau của từ trên xuống dưới: màu xanh lam: giúp giảm thiểu lỗi công suất bình phương trung bình giả sử đồng phục không đúng trước công suất, màu cam: giúp giảm thiểu sai số biên độ trung bình bình phương giả sử đồng phục không chính xác trước biên độ, màu xanh lá cây: màu đỏ: và màu tím:a^uni-MMSE-xformmε,ε=2,ε=1,ε=12,ε=14,ε=18.

Tại các đường cong nằm ngang với giá trị:m=0

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

Ở SNR âm, công cụ ước tính uni-MMSE-xform có thể được tham số hóa bằng cách sử dụng thấp để đưa ra tổng sai số vuông thấp hơn so với công cụ ước lượng công suất quang phổ kẹp, với mức phạt tương ứng ở các giá trị SNR trung gian gần 7 dB (Hình 2 ).ε

nhập mô tả hình ảnh ở đây
nhập mô tả hình ảnh ở đây
nhập mô tả hình ảnh ở đây
Hình 2. Các ước tính của Monte Carlo với cỡ mẫu là trong số: Solid: mức tăng tổng sai số vuông khi ước tínhby so với ước tính nó với dashed: mức tăng của tổng lỗi vuông khi ước tính bằng so với ước tính với chấm: tăng tổng lỗi vuông khi ước tính theo so với ước tính vớiMàu xanh dương: công cụ ước tính uni-MMSE-xform với (trên cùng), (giữa) và105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.ε=1ε=12ε=14, màu cam: phép trừ công suất quang phổ kẹp.

Kịch bản Python cho hình 1

Kịch bản này mở rộng kịch bản của câu hỏi 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)

Kịch bản Python cho Hình 2

Tập lệnh này mở rộng tập lệnh của câu hỏi B. Hàm est_a_uni_MMSE_xform_fastcó thể không ổn định về số lượng.

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

Người giới thiệu

Leal Lauwers, Kurt Barbe, Wendy Van Moer và Rik Pintelon, Phân tích Rice phân phối dữ liệu hình ảnh cộng hưởng từ chức năng: Một cách tiếp cận Bayes , Đo. Khoa học. Công nghệ. 21 (2010) 115804 (12pp) DOI: 10.1088 / 0957-0233 / 21/11/115804 .


0

Công cụ ước tính sai số biên độ trung bình tối thiểu của biên độ

Câu trả lời này trình bày các công cụ ước tính giảm thiểu sai số biên độ log trung bình, cho một lựa chọn các linh mục không đúng của biên độ sạch: đồng nhất và tuyến tính.

Công cụ ước tính lỗi biên độ vuông góc trung bình tối thiểu (uni-MMSE-log) không đồng nhất

Trong tài liệu, một sự phát triển tiếp theo sau công cụ ước tính biên độ MMSE là công cụ ước tính biên độ log của MMSE, đặc biệt là công cụ ước tính của (Ephraim & Malah 1985, nhờ @MattL. Cho tham chiếu) giả định Rician trước biên độ sạch. Trong nỗ lực cải thiện công cụ ước tính , ở đây sẽ xuất phát một lỗi ước tính biên độ log trung bình tối thiểu (uni-MMSE-log) cho đồng phục không chính xác trước biên độ sạch.một^uni-MMSE

Sử dụng các biến được chuẩn hóa của câu trả lời của tôi "Ước lượng sai số trung bình bình phương sai số bình phương tối thiểu bất biến tỷ lệ" Eq. (5), công cụ ước tính nhật ký uni-MMSE của biên độ sạch là:

(1)một^uni-MMSE-log= =mộtrgmTôinmột^E[(đăng nhậpmột-đăng nhậpmột^)2|m]= =điểm kinh nghiệm(E[đăng nhậpmột|m]).

Sử dụng luật của nhà thống kê vô thức , sau đó viết ước tính theo thuật ngữ PDF không chuẩn hóa và đơn giản hóa :f(một|m)= =PDF(m|một),

(2)một^uni-MMSE-log= =điểm kinh nghiệm(0đăng nhập(một)PDF(một|m)dmột)= =điểm kinh nghiệm(0đăng nhập(một)f(một|m)dmột0f(một|m)dmột)= =điểm kinh nghiệm(0đăng nhập(một)PDF(m|một)dmột0PDF(m|một)dmột)= =điểm kinh nghiệm(0đăng nhập(một)2me-(m2+một2)Tôi0(2mmột)dmột02me-(m2+một2)Tôi0(2mmột)dmột)= =điểm kinh nghiệm(2me-m20đăng nhập(một)e-một2Tôi0(2mmột)dmộtme-m2πem2/2Tôi0(m2/2))= =điểm kinh nghiệm(20đăng nhập(một)e-một2Tôi0(2mmột)dmộtπem2/2Tôi0(m2/2))= =điểm kinh nghiệm(em2/2Tôi0(m22)Ψ(12)+m2F201112(3/2;1;1,1/2;2,2;;3/2;m2,m2)2em2/2Tôi0(m2/2))= =điểm kinh nghiệm(m2F201112(3/2;1;1,1/2;2,2;;3/2;m2,m2))2em2/2Tôi0(m2/2)-γ2-đăng nhập2),

Trong đó là hàm digamma , là hằng số Euler, Mascheroni và là hàm Kampé de Fériet (giống như) . Dạng hàm đặc biệt này của công cụ ước tính có thể được đánh giá bằng mpmath của Python (xem tập lệnh ở cuối câu trả lời). Ngoài ra còn có một biểu mẫu sử dụng chuỗi không yêu cầu chức năng đặc biệt:ΨγF201112

(3)= =điểm kinh nghiệm(-L-1/2(1,0)(m2)2em2/2Tôi0(m2/2)+Ψ(12)2)= =điểm kinh nghiệm(Σk= =0((1/2)km2k(1)kk!Σn= =1k12n-1)em2/2Tôi0(m2/2)+Ψ(12)2)= =điểm kinh nghiệm(Σk= =0((1/2)km2k(1)kk!Σn= =1k12n-1)Σk= =0(1/2)km2k(1)kk!-γ2-đăng nhập2),

Trong đó là hàm L của Laguerre và siêu ký tự biểu thị sự khác biệt của nó đối với tham số đăng ký và là ký hiệu Pochhammer với các trường hợp đặc biệtvàChuỗi tử số và mẫu số có thể được rút ngắn ở hàng chục số hạng để có được công cụ ước tính cho thấpĐộ chính xác cao hơn có được bằng cách xấp xỉ cả hai chuỗi bằng cách sử dụng cùng một độ dài cắt ngắn, so với việc sử dụng một hàm đặc biệt chính xác cho các đoạn cắt khác hoặc độ dài khác nhau. Rất khó để đánh giá chuỗi ở lớn vì các số hạng lớn nhất xuất hiện quanhLn(x)(1,0)(x)k(1)k= =k!(1/2)k= =(2k-1)!!/2k.m.mkm2.

Biểu thức ban đầu của chuỗi @ user150203 liên quan đến tích phân tử số cung cấp một biểu thức tương đương khác cho công cụ ước tính:

(4)= =điểm kinh nghiệm(Σk= =0m2kk!(k-12k)Ψ(k+12)2em2/2Tôi0(m2/2))= =điểm kinh nghiệm(Σk= =0m2kk!(k-12k)Ψ(k+12)2Σk= =0m2kk!(k-12k)),

trong đó biểu thị một hệ số nhị thức .(mộtb)

Đường cong của công cụ ước tính nhật ký uni-MMSE (Hình 1, đường cong thấp hơn màu cam) tương tự như công cụ ước tính uni-MMSE, nhưng có giá trị thấp hơn tạim= =0:

(5)một^uni-MMSE-log= =e-γ20,374653,nếu m= =0.

Công cụ ước tính lỗi biên độ vuông trung bình tối thiểu trước tuyến tính (lin-MMSE-log) không phù hợp

Một công cụ ước tính có liên quan có thể thu được nếu người ta lấy giới hạn của công cụ ước tính của (Ephraim & Malah 1985) ở phương sai vô hạn trước của biến phức sạch. Sau đó, hàm mật độ xác suất trước Rayleigh của biên độ sạch sẽ trở thành một đường dốc tuyến tính bằng 0 ở cường độ 0 và tăng tuyến tính với độ dốc vô hạn. Công cụ ước tính kết quả (Hình 1, đường cong trên màu xanh) là:

(6)một^lin-MMSE-log= =điểm kinh nghiệm(12m2e-ttdt)m= =điểm kinh nghiệm(-Ei(-m2)2)m= =điểm kinh nghiệm(Γ(0,m2)2)m,
(7)limm0+một^lin-MMSE-log= =e-γ/20,749306,

trong đó là tích phân hàm mũ và là hàm gamma không hoàn chỉnh trên .Ei(x)Γ(0,x)

nhập mô tả hình ảnh ở đây
Hình 1. Công cụ ước tính lỗi biên độ log trung bình tối thiểu: màu xanh lam, trên: với một tuyến tính không chính xác trước và màu cam, thấp hơn: với một bộ đồng phục không phù hợp trước. Biên độ sạch ước tính là hàm của độ ồn với nhiễu phụ gia đơn vị phương sai.một^lin-MMSE-logmột^uni-MMSE-logmột^m

Kịch bản Python cho hình 1

Tập lệnh này mở rộng tập lệnh của câu hỏi A. Hàm est_a_uni_MMSE_logkhông ổn định về số lượng 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)

Người giới thiệu

Y. Ephraim và D. Malah, Tăng cường lời nói bằng cách sử dụng công cụ ước tính biên độ phổ log-bình phương sai số trung bình tối thiểu , Giao dịch của IEEE về Xử lý âm thanh và xử lý tín hiệu , tháng 5 năm 1985, DOI: 10.1109 / TASSP.1985.1164550 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.