ノイズのスペクトル減算を改善するための推定器


8

クリーンな信号に依存しない、真のゼロ平均ガウスホワイトノイズ x 既知の分散が追加されます x ノイズの多い信号を生成する y. 離散フーリエ変換(DFT) Y ノイズの多い信号の次のように計算されます。

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

これは単なるコンテキストであり、周波数領域でノイズ分散を定義するため、正規化(またはその欠如)は重要ではありません。時間領域のガウスホワイトノイズは、周波数領域のガウスホワイトノイズです。質問:「ホワイトガウスノイズの離散フーリエ変換の統計とは何ですか?」を参照してください。したがって、次のように書くことができます。

Yk=Xk+Zk,

どこ X そして Z クリーンな信号とノイズのDFTであり、 Zk 分散の円対称複素ガウス分布に従うノイズビン σ2。それぞれの実数部と虚数部Zk ガウス分散の分散を個別に追跡する 12σ2。ビンの信号対雑音比(SNR)を定義しますYk なので:

SNR=σ2|Xk|2.

次に、スペクトル減算によってノイズを低減する試みが行われます。これにより、各ビンの大きさが Yk元の位相を保持しながら、独立して減少します(大きさの減少でビン値がゼロにならない限り)。削減は見積もりを形成します|Xk|2^ 広場の |Xk|2 クリーン信号のDFTの各ビンの絶対値:

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

どこ σ2各DFTビンにおける既知のノイズの分散です。簡単にするために、私たちは考慮していませんk=0, または k=N/2 でも N、これは実際の特別なケースです x. SNRが低い場合、(2)の定式化により負の値になる場合があります |Xk|2^. この問題を取り除くには、推定値を下からゼロにクランプし、再定義します。

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

ここに画像の説明を入力してください
サンプルサイズが図1モンテカルロ推定ソリッド:の推定における平方誤差の和のゲインでそれを推定することと比較して、 破線:推定における平方誤差の和のゲインによってをでそれを推定することに比べて、点線:二乗誤差の和の利得を推定するすることによってでそれを推定することに比べて(3)のの定義が使用されます。105,|Xk||Xk|^|Yk|,|Xk|2|Xk|2^|Yk|2,Xk|Xk|^eiarg(Yk)Yk.|Xk|2^

質問:別の見積もりはありますか?またはは、の分布に依存せずに(2)および(3)をますか?|Xk||Xk|2Yk

問題は、既知のパラメータを使用して、ライス分布(図2)のパラメータの二乗を推定することと同等であると思います単一の観測が与えられます。νRiceσRice=22σ,

ここに画像の説明を入力してください
図2.ライス分布は、平均の絶対値が分散がある2変量の円対称正規分布に従う点から原点までの距離分布です。およびコンポーネント分散RνRice,2σRice2=σ2σRice2=12σ2

関連していると思われる文献をいくつか見つけました。

  • Jan Sijbers、Arnold J. den Dekker、Paul Scheunders、Dirk Van Dyck、「ライス分布パラメータの最尤推定」IEEE Transactions on Medical Imaging(Volume:17、Issue:3、June 1998)doipdf)。

推定曲線用のPythonスクリプトA

このスクリプトは、回答に推定曲線をプロットするために拡張できます。

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

図1のPythonスクリプトB

このスクリプトは、回答のエラーゲイン曲線用に拡張できます。

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:「これはコンテキストのため、正規化は重要ではありません。ノイズはスペクトル減算によって低減されます。これにより、各ビンYkの大きさは元の位相を維持しながら個別に低減されます(ビンの値がマグニチュードリダクションでゼロに変更します)。ノイズが任意の方向に進む可能性がある場合、これはノイズを減衰させるのと同じようにノイズを増幅する可能性が高いようです。
Cedron Dawg

1
これは役に立ちましたか? dsp.stackexchange.com/questions/24170/...
Cedron仲の良い友達

2
@CedronDawg:信号とノイズの独立性を仮定すると、それらのパワーが追加されるため、信号(パワー)は推定されたノイズパワーを差し引いて得られます。したがって、電力に関しては、ノイズは一方向にしか伝わりません。
Matt L.

1
@OlliNiemitalo:エフライムとマラによるこの基本的な論文を知っていますか?これらは、信号振幅の最適な推定量を導き出します。これは、単純なスペクトル減算よりも優れています。
Matt L.

1
@OlliNiemitalo:DFT係数はガウス分布であると想定されるため(希望する信号とノイズに対して)、振幅はレイリー分布になります。Cf. 論文の式(5)と(6)。
Matt L.

回答:


7

最尤(ML)推定量

ここでは、クリーンな信号のパワーの最尤推定量が導出されますが、スペクトルパワー減算と比較して、SNRの二乗平均平方根誤差に関しては改善されていないようです。

前書き

正規化されたクリーンな振幅を紹介しましょう a 正規化されたノイズの大きさ m ノイズ標準偏差で正規化 σ:

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

式の推定量。質問の3つは見積もりを与えるa^a なので:

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

最尤推定量

のより良い推定量を作るために a式より 2、我々はSijbersらの手順に従います。1998.(質問を参照)最尤(ML)推定量を構築するa^ML. それはの価値を与える a 与えられた値の確率を最大にする m.

のPDF |Yk|あるライスパラメータを持ちますνRice=|Xk| とパラメータ(後でわかりやすくするために置き換えます) σRice=12σ:

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

どこ Iαある第一種の変形ベッセル関数。代用|Xk|=σa, |Yk|=σm, そして σRice2=12σ2:

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

そして変換:

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

のライスPDF m によってパラメータ化 a ノイズ分散とは無関係です σ2. 最尤推定量 a^ML パラメータの a の値です a 最大化する PDF(m)それはの解決策です:

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

式の解。4には次の特性があります。

(5)a^ML=0 if m1.

それ以外の場合は、数値的に解決する必要があります。

ここに画像の説明を入力してください
図1.青、上:最尤推定量 a^ML オレンジ色の下:質問のパワースペクトル減算推定量 a^ 正規化されたクリーンな振幅の a、正規化されたノイズの大きさの関数として m.

σa^ML の最尤推定量です |Xk|そして最尤推定の機能的不変性によって、σ2a^ML2 の最尤推定量です |Xk|2.

ML推定量の経験的ローランシリーズ

私は数値で計算しようとしました(以下のスクリプトを参照)。a^ML2, しかし、次の範囲では収束していないようです。 m必要。以下は、私が計算した限りでは、ローランシリーズの一部を省略しています。

(6)a^ML2m2121m0123m2325m41227m65729m8309211m101884213m1212864215m1498301217m16839919219m187999311221m20

整数シーケンスのオンライン百科事典(OEIS)で分子または分母の整数シーケンスを見つけることができませんでした。最初の5つの負のべき項についてのみ、分子係数はA027710と一致します。ただし、計算されたシーケンス(1,1,1,3,)OEIS Superseekerへの返信でこれを受け取りました(そこから次の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]

表形式の近似と推定誤差ゲイン

以下を含む線形補間されたテーブル(以下のスクリプトを参照) 124071 不均一に分布したサンプル a^ML2m2 約の最大誤差で近似を与える 6×1011.

ML推定量の最小二乗近似

最小二乗近似(追加の重みで m2=1)の推定曲線のサンプルが作成され、Laurentシリーズの実験に触発された形で作成されました(下のOctaveスクリプトを参照)。負の可能性を排除するために定数項- 0.5が変更され- 0.49999998237308493999ましたa2m2=1. 近似は、 m21 約の最大誤差があります 2×105 (図3)近似 a^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

ここに画像の説明を入力してください
図3.の最小二乗近似の誤差 a^ML2.

スクリプトは、増加する負のパワーの数を処理できるようです m2,エラーの極値の数は増え続けますが、最大エラーの減衰は非常に遅くなり、エラーはますます小さくなります。近似はほぼ等リップルですが、Remezの交換の改良により多少のメリットが得られます。

近似を使用して、以下の予想誤差ゲイン曲線が得られました。

ここに画像の説明を入力してください
図2.サンプルサイズがのモンテカルロ推定 105, of:Solid:推定における二乗誤差の合計のゲイン |Xk| 沿って |Xk|^ で推定するのと比較して |Yk|, 破線:推定における二乗誤差の合計のゲイン |Xk|2 沿って |Xk|2^ で推定するのと比較して |Yk|2, 点線:推定における二乗誤差の合計のゲイン Xk 沿って |Xk|^eiarg(Yk) で推定するのと比較して Yk. 青:MLエスティメータ、オレンジ:クランプされたスペクトルパワー減算。

驚くべきことに、ML推定器は、SNR>約5 dBでの信号推定とSNR>約3 dBでの振幅推定がわずかに優れていることを除いて、ほぼすべての点でクランプスペクトルパワー減算よりも劣っています。これらのSNRでは、2つの推定量はノイズの多い信号を推定値として使用するよりも劣ります。

図1のPythonスクリプトA

このスクリプトは、質問のスクリプト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)

Laurentシリーズの数値計算用Pythonスクリプト

このスクリプトは、ローランシリーズの最初の数項を数値で計算します。 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

MLエスティメータを集計するためのPythonスクリプト

このスクリプトは、不均等にサンプリングされたテーブルを作成します [m2,a^ML2] 線形補間に適したペア。近似の定義された最大絶対線形補間誤差をほぼ与えます。 a^ML2 範囲 m=0mmax.ピーク誤差が十分小さくなるまで、困難な部分にサンプルを追加することにより、テーブルサイズが自動的に増加します。もしmmax 等しい 2 プラス整数の累乗 2, 次に、すべてのサンプリング間隔は、 2. 表の最後に、不連続性のない大規模なm 近似 a^ML2=m212. もし a^ML が必要です、私の推測では、テーブルをそのまま補間してから変換する方が良いと思います a^ML=a^ML2

次のスクリプトと組み合わせて使用​​するには、出力をパイプします> 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('];')

図2のPythonスクリプトB

このスクリプトは、質問のスクリプト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])

最小二乗のオクターブスクリプト

このオクターブスクリプト(この回答の適応)は、m2a^ML2(m212)。サンプルは少し上のPythonスクリプトによって準備されました。

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スクリプトA2

このスクリプトはスクリプトAを拡張し、チェビシェフ多項式を使用してML推定器の代替近似を提供します。最初のチェビシェフノードは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

更新:

テストでは、次の議論が激しいノイズの下で失敗するように見えることを示していると申し訳ありません。これは私が期待したものではないので、私は間違いなく何か新しいことを学びました。私の以前のテストはすべて、ノイズのないケースで正確なソリューションを見つけることに重点を置いていたため、高いSNR範囲でした。


オリ

ノイズの多い信号で純粋なトーンのパラメータを見つけることが目的の場合は、そうする必要があります。この問題には、多くの経験と専門知識があります。

あなたは振幅を探している(そして位相もそれに付随している)と言っているので、DFTを整列して、サイクル数を整数にすると思います。これは、単一のビン内のノイズに対して単一のビン内の信号を処理するため、この状況では最悪の構成です。

上で示したように、SNRが大きいほど、トリックのパフォーマンスが低下し、有害またはそれ以上になります。まあ、あなたの関心のあるビンは、最高のSNRを持つものになるでしょう。

あなたがしたいことは、あなたのDFTフレームを全体でプラス半サイクルに整列させることです。これにより、信号ができるだけ多くのビンに分散されます。次に、ブログの記事「DFTでの純粋なリアルトーンの位相と振幅の計算:方法1」で説明されているように、位相と振幅を見つけることができます。

つまり、ピーク近くのビンのセットを複素ベクトル空間として扱います。次に、周波数を知って、信号の基本ベクトルのセットを作成します。ベクトルの係数は、信号の振幅と位相を通知する仮想ビンとして機能します。複数のビンにわたって最適なベクトルを見つけることにより、この手法では、特定のビンのノイズが支配的になりすぎないようにし、ノイズのバランスを取る必要がある「レバー」を提供します。ノイズ低減効果は、確率変数が一緒に平均化される場合と同様です。

基底ベクトルを作成するということは、周波数で正弦と余弦のDFTをとることを意味します。直接計算するための公式があります。これは、合計を行う必要がないバイパスです。そのための記事は上記の記事からリンクされています。

あなたのテクニックがこの方法の結果を改善するかどうか知りたいです。私はより高いSNR >> 1で作業することに慣れているので、処理しているノイズレベルで実際にテストしたことはありません。

アプローチの概要:

バツ[]=acosω+bω+wg[]

DFTは線形演算子であるため、次のようになります。

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

ベクトル表記:

Z=aA+bB+W

あなたは単に a そして b標準の線形代数を使用して最適なフィットを与えます。おまけは、Wの推定値も得られることです。したがって、「火傷を投げる」アプローチを試して、最悪のフィッティングビンで推定されたノイズを完全に排除してから、再計算できます。すすぎ、繰り返します。または、他の式で各ビンのノイズを減らします。比例的に行うと、WがAおよびBに直交するため、結果は同じままです。ただし、(メソッドのように)ZではなくWに沿って一定に減算すると、結果も改善されます。

通常、ピークの周囲で4つのビンを実行しますが、6つまたは8つまで拡張することもできます。ある時点で、ビンが増えると、信号よりもノイズが多くなるため、結果が悪くなります。

必要なDFTビンを計算するだけです。


あなたと他の方法を比較できる別の質問があると思います。
Olli Niemitalo

@OlliNiemitalo、両方やってみましょう。ここに結果を投稿してください。サイクルあたりのサンプル数の公正価値は何ですか?さらに言えば、フレームあたり何サイクルですか?
Cedron Dawg

ここではありません、別の質問で。
Olli Niemitalo

@OlliNiemitalo、そう、あなたが主張すれば、それは本当に質問ではないでしょう。好奇心から、これはあなたが実際に解決しようとしている問題ですか、それとももっと学術的な演習ですか?
Cedron Dawg

結果は一般的な意味で役立つかもしれないと思うので、それに取り組むことに興味があります。
Olli Niemitalo

2

最尤(ML)推定問題の興味深い近似解は、漸近式を使用して取得されます。

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

Olliの回答の表記法と公式を使用して、正規化されたクリーンな信号振幅の最適なML推定は、

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

使用する (1) それに注意して I1(x)=I0(x)、近似値を取得します

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

この近似の相対誤差は 1% ために バツ>4.5

差し込み 2 近似解を与える

(4)a^12メートル+メートル21

メートル=|Yk|/σ そして a=|バツk|/σ 私達は手に入れました

(5)|バツ|k^12|Yk|+|Yk|2σ2

これは単にノイズの多い観測値の算術平均です |Yk| そして、スペクトルパワー減算から得られた推定。


編集:

私は次のような近似を持っているといいでしょう それは全範囲で機能します バツ[0。そのような近似の候補は関数のファミリーです

(6)fバツ=バツc1+c2バツ2

定数の理論的に正しい選択は c1=4 そして c2=1、の特性を考慮 fバツ 周りに バツ=0 そして バツ。ただし、現実的な範囲のバツ、その範囲でのより良い近似は、それらの定数を少し調整することで達成できるかもしれません。

近似を使用する 6c1=4 そして c2=1 結果は次のようになります。

(7)a^=メートル11メートル4

または、同等に、

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


オリーの編集:

ここに画像の説明を入力してください
図1。 a^ML(オレンジ)とその近似式で定義されます。4(青)とEq。7(緑)、関数としてm. すべての曲線アプローチ a=m なので m (大きい場合は右の図を参照) m)。 a^ML2 切り捨てられたローランシリーズに漸近的に近づく m212 なので m, これは奇妙な結果を与えますが、 a^ML 漸近的にそれに近づく m、方程式の二乗。7は近似に一定の誤差がありますa^ML2 なので mための定数項0 のローラン級数の異なっから12 ローランシリーズの a^ML2(OlliのML推定器の回答を参照)と式2乗のLaurentシリーズ 4.この一定のエラーc の推定で消える a^ML 事実によるもの limm(m2+cm)=0。

図1のPythonスクリプト

このスクリプトには、モジュールのインポートとプロット関数の質問のスクリプトplot_est、およびest_a_MLOlliのML回答からの関数定義が必要です。

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:私はそれに応じて式を調整しました。
Matt L.

2

変換された振幅のスケール不変な最小平均二乗誤差(MMSE)の不適切な一様事前推定量

この回答は、振幅のベイジアン事前分布と振幅の別のスケールへの変換の両方を制御する単一のパラメーターによってパラメーター化された、家族スケール不変推定量を示しています。推定量は最小二乗平均誤差です形質振幅スケールで(MMSE)推定器。変換された振幅の前に不適切な均一の仮定されます。利用可能な変換には線形スケール(変換なし)が含まれ、対数スケールに近づくことができます。これにより、推定量はどこでもゼロに近づきます。推定量は、負の信号対雑音比(SNR)で二乗誤差の合計が低くなるようにパラメーター化できます。

ベイズ推定

私の最初の答えの最尤(ML)推定量は、かなり不十分に実行されました。ML推定量は、不適切な均一事前確率分布が与えられた場合のベイジアン最大事後(MAP)推定量としても理解できます。ここで、不適切とは、事前分布がゼロから無限小の密度で無限小に及ぶことを意味します。密度は実数ではないため、事前分布は適切な分布ではありませんが、ベイズの定理によって適切な事後分布が得られ、MAPまたはMMSE推定値を取得するために使用できます。

確率密度関数(PDF)に関するベイズの定理は次のとおりです。

(1)PDFa|メートル=PDFメートル|aPDFaPDFメートル=PDFメートル|aPDFa0PDFメートル|aPDFada

MAPエスティメータ a^地図 最大化する事後PDFの引数です。

(2)a^地図=argメートルaバツaPDFa|メートル

MMSEエスティメータ a^MMSE 事後平均です。

(3)a^MMSE=argメートルaバツa^E[aa^2|メートル]=E[a|メートル]=0aPDFa|メートルda

不適切な均一事前分布は、唯一のスケール不変の事前分布ではありません。以前に満足していたPDF:

(4)PDF|バツk|α|バツk|ε1

実際の指数で ε1 そして α 意味:「に比例する」は、次の積の意味でスケール不変です。 バツk正の定数は依然として(参照同じ分布に従うLauwers 2010)。

推定者の家族

推定者の家族は、これらの特性とともに提示されなければならない:

  1. スケール不変性:複雑なクリーンビンの場合バツk または同等にクリーンな振幅 |バツk| とノイズの標準偏差 σ それぞれが同じ正の定数で乗算され、次に推定振幅も乗算されます |バツk|^ その定数が乗算されます。
  2. 最小平均二乗変換振幅エラー。
  3. 変換された振幅の前の不適切な均一。

正規化表記を使用します。

(5)a=|バツk|σ正規化されたクリーンな振幅、メートル=|Yk|σ正規化されたノイズの大きさ、1=σσ2ノイズの正規化分散、SNR=|バツk|σ2=a2信号対雑音比(10ログ10SNR dB)、

どこ |バツk| ノイズのある大きさから推定したいクリーンな振幅です |Yk| ビン値の Yk whicyはクリーンビン値の合計に等しい バツk 分散の円対称複素ガウスノイズ σ2 の前のスケール不変 |バツk|式で与えられます。4は次のように正規化表記に引き継がれます。

(6)PDFaαaε1

しましょう ga 振幅の増加する変換関数であること a 変換された振幅の不適切な事前均一性は、次のように示されます。

(7)PDFgaα1。

式 6と7は一緒に、可能な振幅変換のファミリーを決定します。それらは変数の変更によって関連付けられています

(8)gaPDFga=PDFagaαaε1gaαaε1da=aεε+cga=c1aεε+c0

証明なしで、定数の選択は c0 そして c1振幅推定には影響しません。便宜上、次のように設定します。

(9)g1=1そしてg1=1c0=ε1εそしてc1=1ga=aε+ε1ε

特別な線形ケースがあります:

(10)ga=aもしε=1

そして限界:

(11)リムε0ga=ログa+1。

変換関数は、線形振幅スケール( ε=1)、対数振幅スケールに近づくことができます( ε0)。ポジティブε 変換された振幅のPDFのサポートは次のとおりです。

(12)0<a<ε1ε<ga<

逆変換関数は次のとおりです。

(13)g1ga=εgaε+11/ε=a

変換された推定は、無意識の統計学者の法則を使用して次のようになります

(14)a^uni-MMSE-xform=argメートルa^E[gaga^2|メートル]=g1E[ga|メートル]=g10gaPDFa|メートルda=g10gafa|メートルda0fa|メートルda

どこ PDFa|b 事後PDFであり、 fa|メートル は、ベイズの定理(式1)を使用して定義された正規化されていない事後PDFであり、ライス PDFメートル|a=2メートルeメートル2+a202メートルa式から 私のML推定量の答えの3.2、および式 6:

(15)PDFa|メートルαPDFメートル|aPDFaα2メートルeメートル2+a202メートルa×aε1αea202メートルaaε1=fa|メートル

そこから PDFメートル それは一定であるため、ベイズの式から削除されました a式を組み合わせる Mathematicaで積分を解き、単純化すると、14,9,15は次を与える:

(16)a^uni-MMSE-xform=g10aε+ε1ε×ea202メートルaaε1da0ea202メートルaaε1da=ε12εΓεLεメートル2+ε1Γε/2Lε/2メートル212Γε/2Lε/2メートル2ε+11/ε=ΓεLεメートル2+ε1Γε/2Lε/2メートル2Γε/2Lε/2メートル2ε+11/ε=ΓεLεメートル2Γε/2Lε/2メートル21/ε

どこ Γガンマ関数であり、Lあるラゲール関数が。推定量は、次のようにどこでも0に折りたたまれます。ε0 ネガティブを使うのは意味がありません ε の小さな値を強調する aさらに、不適切な事後分布を与えます。いくつかの特殊なケースは次のとおりです。

(17)a^uni-MMSE-xform=メートル2+1もし ε=2

(18)a^ユニMMSE=a^uni-MMSE-xform=eメートル2/2π0メートル2/2もし ε=1

概算 メートル切り捨てられたローランシリーズ(計算を参照):

(19)a^ユニMMSEメートル14メートル732メートル59128メートル5

この漸近近似の絶対最大振幅誤差は、 106 ために メートル>7.7。

推定曲線を図1に示します。

enter image description here
図1. Estimator a^uni-MMSE-xform の機能として メートル 異なる値の ε 上から下へ:青: ε=2 これは、パワーの前に不適切な均一の均一性を仮定すると、平均二乗パワーエラーを最小化します。 ε=1 これは、振幅の前に不適切な均一の緑を想定して、平均二乗振幅誤差を最小化します。緑: ε=12 赤: ε=14 と紫: ε=18

メートル=0 曲線は水平で、値は次のとおりです。

(20)a^uni-MMSE-xform=211/εΓ1+ε21/επ1/2εもし メートル=0。

負のSNRで、uni-MMSE-xform推定量は、低を使用してパラメーター化できます。 ε クランプされたスペクトルパワー減算推定器と比較して二乗誤差の合計が低くなり、7 dBに近い中間SNR値で対応するペナルティが生じます(図2)。

enter image description here
enter image description here
enter image description here
図2.サンプルサイズがのモンテカルロ推定 105 of:Solid:推定における二乗誤差の合計のゲイン |バツk| 沿って |バツk|^ で推定するのと比較して |Yk| 破線:推定における二乗誤差の合計のゲイン |バツk|2 沿って |バツk|2^ で推定するのと比較して |Yk|2 点線:推定における二乗誤差の合計のゲイン バツk 沿って |バツk|^eargYk で推定するのと比較して Yk 青:ユニMMSE-xform推定器 ε=1 (上)、 ε=12 (中央)、および ε=14 オレンジ:クランプされたスペクトルパワー減算。

図1のPythonスクリプト

このスクリプトは、質問のスクリプト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)

図2のPythonスクリプト

このスクリプトは質問のスクリプトBを拡張します。関数est_a_uni_MMSE_xform_fastは数値的に不安定である可能性があります。

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

参考文献

Lieve Lauwers、Kurt Barbe、Wendy Van Moer、およびRik Pintelon、ライス分散機能的磁気共鳴画像データの分析:ベイジアンアプローチMeas。サイエンス。テクノール。21(2010)115804(12pp) DOI:10.1088 / 0957-0233 / 21/11/115804


0

振幅の最小平均二乗対数振幅誤差推定量

この答えは、クリーンな振幅の不適切な事前分布を選択するために、平均二乗対数振幅エラーを最小化する推定量を示します。

不適切な以前の最小最小二乗平均対数振幅誤差(単一MMSEログ)推定量

文献では、MMSE振幅推定器の後の次の開発は、MMSE対数振幅推定器、特に(Ephraim&Malah 1985、@ MattL。のおかげで参照用)の推定器であり、ライスの振幅がクリーンであることを前提としています。推定量を改善する試みでa^ユニMMSE 、ここで、クリーンな振幅の前に不適切な均一の場合の最小平均二乗対数振幅誤差(uni-MMSE-log)推定量が導出されます。

私の回答の正規化された変数を使用して、「変換された振幅のスケール不変最小平均二乗誤差均一事前推定量」式。(5)、クリーンな振幅のuni-MMSE-log推定量は次のとおりです。

(1)a^ユニMMSEログ=argメートルa^E[ログaログa^2|メートル]=expE[ログa|メートル]

無意識の統計学者の法則を使用して、正規化されていないPDFの観点から推定値を記述しますfa|メートル=PDFメートル|aそして簡素化

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

where Ψ is the digamma function, γ is the Euler–Mascheroni constant, and F201112 is a Kampé de Fériet (-like) function. This special function form of the estimator can be evaluated in Python's mpmath (see script at the end of the answer). There is also a form using series that requires no special functions:

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

where Ln(x) is Laguerre's L function and superscript (1,0) denotes differentiating it with respect to the subscript parameter, and (x)k is a Pochhammer symbol with special cases (1)k=k! and (1/2)k=(2k1)!!/2k. The numerator and denominator series can be truncated at tens of terms to obtain the estimator for low m. Better accuracy is obtained by approximating both series using the same length truncation, compared to using an exact special function for the other, or different length truncations. It is difficult to evaluate the series at large m because the largest terms appear around km2.

@user150203's original expression of the series related to the numerator integral gives another equivalent expression for the estimator:

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

where (ab) denotes a binomial coefficient.

The curve of the uni-MMSE-log estimator (Fig. 1, orange lower curve) is similar to that of the uni-MMSE estimator, but with a lower value at m=0:

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

Improper linear prior minimum mean square log-amplitude error (lin-MMSE-log) estimator

A related estimator can be obtained if one takes the limit of the estimator of (Ephraim & Malah 1985) at infinite prior variance of the clean complex variable. Then, the Rayleigh prior probability density function of the clean amplitude becomes a linear ramp that is zero at zero magnitude and rises linearly with an infinitesimal slope. The resulting estimator (Fig. 1, blue upper curve) is:

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

where Ei(x) is the exponential integral, and Γ(0,x) is the upper incomplete gamma function.

enter image description here
Figure 1. Minimum mean square log-amplitude error estimators: blue, upper: a^lin-MMSE-log with an improper linear prior and orange, lower: a^uni-MMSE-log with an improper uniform prior. Estimated clean amplitude a^ as function of noisy magnitude m with unit-variance additive noise.

Python script for Fig. 1

This script extends the question's script A. The function est_a_uni_MMSE_log is numerically unstable at large 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)

References

Y. Ephraim and D. Malah, Speech enhancement using a minimum mean-square error log-spectral amplitude estimator, IEEE Transactions on Acoustics Speech and Signal Processing, May 1985, DOI: 10.1109/TASSP.1985.1164550.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.