deconv
最小二乗法による逆畳み込みと多項式の除算
説明
多項式の長除法
最小二乗法による逆畳み込み
R2023b 以降
[
は、前述の構文の入力引数の任意の組み合わせに加え、1 つ以上の名前と値の引数を使用してオプションを指定します。x
,r
] = deconv(___,Name=Value
)
deconv(__,Method=algorithm)
を使用して逆畳み込み手法を指定できます。ここで、algorithm
は"long-division"
または"least-squares"
にすることができます。deconv(__,RegularizationFactor=alpha)
を使用して、逆畳み込み手法の最小二乗解に対する Tikhonov 正則化係数を指定することもできます。
例
多項式除算
多項式 および の係数をそれぞれ含む 2 つのベクトル y
および h
を作成します。y
から h
の逆畳み込みを計算することで、最初の多項式を 2 つ目の多項式で除算します。逆畳み込みにより、多項式 に対応する商の係数と に対応する剰余の係数が得られます。
y = [2 7 4 9]; h = [1 0 1]; [x,r] = deconv(y,h)
x = 1×2
2 7
r = 1×4
0 0 2 2
完全に畳み込みが行われた信号の最小二乗法による逆畳み込み
R2023b 以降
ガウス分布の形状の信号 x
を作成します。ランダム ノイズから成るインパルス応答 h
によってこの信号の畳み込みを行います。
N = 200;
n = 0.1*(1:N);
rng("default")
x = 2*exp(-0.5*((n-10)).^2);
h = 0.1*randn(1,length(x));
y = conv(x,h);
元の信号、インパルス応答、および畳み込みが行われた信号をプロットします。
figure tiledlayout(3,1) nexttile plot(n,x) title("Original Signal") nexttile plot(n,h) title("Impulse Response") nexttile plot(0.1*(1:length(y)),y) title("Convolved Signal")
次に、既定の多項式の長除法を使用して、インパルス応答 h
について信号 y
の逆畳み込みを求めます。この手法では、逆畳み込みの計算は不安定であり、結果が急激に増加することがあります。
[x1,r1] = deconv(y,h); x1(end)
ans = 7.5992e+90
代わりに、数値的に安定した計算を行うために、最小二乗法を使用して逆畳み込みを求めます。
[x2,r2] = deconv(y,h,Method="least-squares");
両方の逆畳み込みの結果をプロットします。ここでは、最小二乗法により、ガウス分布の形状をもつ元の信号が正しく返されています。
figure tiledlayout(2,1) nexttile plot(n,x1) title("Deconvolved Signal Using ""long-division"" Method") nexttile plot(n,x2) title("Deconvolved Signal Using ""least-squares"" Method")
畳み込み信号の中央部分の最小二乗法による逆畳み込み
R2023b 以降
2 つのベクトルを作成します。xin
と h
の畳み込みについて、xin
と同じサイズの中央部分を求めます。畳み込みが行われた信号 y の中央部分の長さは、完全な長さ length(xin)+length(h)-1
、つまり 10 ではなく、7 です。
xin = [-1 2 3 -2 0 1 2];
h = [2 4 -1 1];
y = conv(xin,h,"same")
y = 1×7
15 5 -9 7 6 7 -1
インパルス応答 h
について信号 y
の最小二乗法による逆畳み込みを求めます。"same"
オプションを使用して、畳み込みが行われた信号 y
が中央部分のみであることを指定します (y = conv(x,h,"same") + r
)。deconv
により、丸め誤差内で x
に元の信号が復元されることを示します。
[x,r] = deconv(y,h,"same",Method="least-squares")
x = 1×7
-1.0000 2.0000 3.0000 -2.0000 0.0000 1.0000 2.0000
r = 1×7
10-14 ×
0 0.0888 0.1776 0 0 0 0
無限の解をもつ場合における最小二乗法による逆畳み込みの問題
R2023b 以降
それぞれ 2 つの要素をもつ 2 つのベクトルを作成し、"valid"
オプションを使用してそれらの畳み込みを行います。このオプションを使用すると、ゼロが加えられたエッジを含まずに計算された畳み込みの部分のみが返されます。この場合、畳み込みが行われた信号 y
の要素は 1 つのみです。
xin = [-1 2];
h = [2 5];
y = conv(xin,h,"valid")
y = -1
インパルス応答 h
について、畳み込みが行われた信号 y
の最小二乗法による逆畳み込みを求めます。"valid"
オプションを使用した場合、deconv
では常に元の信号が x
に返されるとは限りません。そうではなく、norm(x)
を最小化する、逆畳み込み問題の解が返されます。
[x,r] = deconv(y,h,"valid",Method="least-squares")
x = 1×2
-0.1724 -0.0690
r = -3.3307e-16
解を確認するために、h
を使用して、計算された信号 x
の完全な畳み込みを求めることができます。畳み込みが行われた信号の中央部分は、逆畳み込み問題を定義した元の y
と同じです。
yfull = conv(x,h,"full")
yfull = 1×3
-0.3448 -1.0000 -0.3448
この問題では、deconv
は元の信号とは異なる信号を返します。それは、2 変数をもつ 1 つの方程式 () の解を求めているからです。この系は "劣決定" です。つまり、この系では、変数の数が方程式の数より多くなっています。この系では、最小二乗法を使用して残差ノルム (norm(y - conv(x,h,"valid"))
) を 0 に最小化すると、無限の解が存在します。このため、deconv
では norm(x)
を最小化する解も得られます。
次の図は、この劣決定の問題の状況を示しています。青のラインは、方程式 の解の数が無限であることを示しています。オレンジ色の丸は、原点から解のラインまでの最小距離を表します。deconv
が返す解はこのラインと円の接点と一致します。これは、原点に最も近い解を表します。
ノイズを含む信号の正則化係数の指定
R2023b 以降
2 つの信号 x
と h
を作成し、それらの畳み込みを行います。y
の畳み込みが行われた信号にランダム ノイズを追加します。
N = 200;
n = 0.1*(1:N);
rng("default")
x = 2*exp(-0.8*(n - 8).^2) - 4*exp(-2*(n - 10).^2);
h = 2.*exp(-1*(n - 5).^2).*cos(4*n);
y = conv(x,h);
y = y + max(y)*0.05*randn(1,length(y));
元の信号、インパルス応答、および畳み込みが行われた信号をプロットします。
figure tiledlayout(3,1) nexttile plot(n,x) title("Original Signal") nexttile plot(n,h) title("Impulse Response") nexttile plot(0.1*(1:length(y)),y) title("Convolved Signal with Added Noise")
次に、正則化係数を指定せずに最小二乗法を使用して、インパルス応答 h
についてノイズを含む信号 y
の逆畳み込みを求めます。既定では、正則化係数は 0 です。
[x1,r1] = deconv(y,h,Method="least-squares");
元の信号と逆畳み込みが行われた信号をプロットします。ここでは、正則化係数が指定されていない関数 deconv
では、ノイズを含む信号から元の信号を復元できていません。
figure; tiledlayout(3,1); nexttile plot(n,x) title("Original Signal") nexttile plot(n,x1) title("Deconvolved Signal Without Regularization");
代わりに、正則化係数 1
を指定して最小二乗法を使用して、h
について y
の逆畳み込みを求めます。ノイズを含む信号が関係する問題など、悪条件の逆畳み込み問題では、最小二乗解で過適合が生じないように正則化係数を指定できます。
[x2,r2] = deconv(y,h,Method="least-squares",RegularizationFactor=1);
この逆畳み込みが行われた信号をプロットします。ここでは、正則化係数を指定した関数 deconv
により、元の信号が復元されています。
nexttile
plot(n,x2)
title("Deconvolved Signal Using Regularization")
入力引数
y
— 逆畳み込みを行う入力信号
行ベクトルまたは列ベクトル
逆畳み込みを行う入力信号。行ベクトルまたは列ベクトルとして指定します。
データ型: double
| single
複素数のサポート: あり
h
— 逆畳み込みに使用するインパルス応答またはフィルター
行ベクトルまたは列ベクトル
逆畳み込みに使用するインパルス応答またはフィルター。行ベクトルまたは列ベクトルとして指定します。y
と h
の長さおよびデータ型は異なっていても構いません。
y
とh
の一方または両方がsingle
型である場合、出力もsingle
型になります。それ以外の場合、出力はdouble
型です。入力の長さは
length(h) <= length(y)
を満たす必要があります。ただし、length(h) > length(y)
の場合、deconv
は出力をx = 0
およびr = y
として返します。
データ型: double
| single
複素数のサポート: あり
shape
— 畳み込みが行われた信号のサブセクション
"full"
(既定値) | "same"
| "valid"
R2023b 以降
畳み込みが行われた信号のサブセクション。次の値のいずれかとして指定します。
"full"
(既定の設定) —y
には、h
によるx
の完全な畳み込みが含まれます。"same"
—y
には、x
と同じサイズである、畳み込みの中央部分が含まれます。"valid"
—y
には、ゼロが加えられたエッジを含まずに計算された、畳み込みの部分のみが含まれます。このオプションを使用すると、length(h)
が 0 の場合を除き、length(y)
はmax(length(x)-length(h)+1,0)
となります。length(h) = 0
の場合は、length(y) = length(x)
となります。
名前と値の引数
引数のオプションのペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。
例: [x,r] = deconv(y,h,Method="least-squares",RegularizationFactor=1e-3)
Method
— 逆畳み込み手法
"long-division"
(既定値) | "least-squares"
R2023b 以降
逆畳み込み手法。次の値のいずれかとして指定します。
"long-division"
— 多項式の長除法による逆畳み込み (既定の設定)。"least-squares"
— 最小二乗法による逆畳み込み。残差信号 (剰余)r
のノルムが最小化されるように、逆畳み込みが行われた信号x
が計算されます。つまり、x
はnorm(y - conv(x,h))
を最小化する解です。
RegularizationFactor
— Tikhonov 正則化係数
0
(既定値) | 実数
R2023b 以降
最小二乗法による逆畳み込みの Tikhonov 正則化係数。実数として指定します。最小二乗法による逆畳み込み手法を使用する場合、正則化係数を alpha
として指定すると、norm(r)^2 + norm(alpha*x)^2
を最小化するベクトル x
が返されます。悪条件の問題の場合、正則化係数を指定すると、ノルムが小さい解 x
が優先されます。
既定の長除法による逆畳み込み手法を使用する場合は、RegularizationFactor
は 0
でなければなりません。
データ型: double
| single
出力引数
x
— 逆畳み込みが行われた信号 (除算の商)
行ベクトルまたは列ベクトル
逆畳み込みが行われた信号 (除算の商)。y = conv(x,h) + r
となる行ベクトルまたは列ベクトルとして返されます。
データ型: double
| single
r
— 残差信号 (除算の剰余)
行ベクトルまたは列ベクトル
残差信号 (除算の剰余)。y = conv(x,h) + r
となる行ベクトルまたは列ベクトルとして返されます。
データ型: double
| single
参照
[1] Nagy, James G. “Fast Inverse QR Factorization for Toeplitz Matrices.” SIAM Journal on Scientific Computing 14, no. 5 (September 1993): 1174–93. https://doi.org/10.1137/0914070.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
スレッドベースの環境
MATLAB® の backgroundPool
を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool
を使用してコードを高速化します。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
"least-squares"
逆畳み込み手法はサポートされていません。
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
分散配列
Parallel Computing Toolbox™ を使用して、クラスターの結合メモリ上で大きなアレイを分割します。
使用上の注意事項および制限事項:
"least-squares"
逆畳み込み手法はサポートされていません。
詳細については、分散配列を使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入R2023b: 畳み込みが行われた異なるサブセクションでの最小二乗法による逆畳み込みの実行
名前と値の引数 Method
を "least-squares"
として指定して最小二乗法による逆畳み込みを実行できるようになりました。また、最小二乗法による逆畳み込みで、畳み込みが行われた異なるサブセクションおよび Tikhonov 正則化係数を指定することもできます。
以前のリリースでは、deconv
は多項式の長除法を使用した逆畳み込みのみを行うことができます。新しい引数により、最小二乗法による逆畳み込み (Method="least-squares"
) を実行できます。この場合、既定の長除法による逆畳み込み (Method="long-division"
) よりも安定した解が返されます。
最小二乗法を使用してインパルス応答 h
について信号 y
の逆畳み込みを行った場合、deconv
は残差信号 (剰余) r = y - conv(x,h)
のノルムを最小化する信号 x
を返します。つまり、x
は norm(r)
を最小化する解です。また、悪条件の問題で、Tikhonov 正則化係数 alpha
を指定して norm(r)^2 + norm(alpha*x)^2
を最小化する解 x
を返すこともできます。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)