MVDRアルゴリズム

関数[MSC] = MVDR_new(x1、x2、L、K);

%%このプログラム
は、MVDRメソッドを使用して2つの信号%% x1とx2の間のコヒーレンス関数を計算し ます。
%%このアルゴリズムは、同じ著者による論文に基づいています:
%% J. Benesty、J。Chen、およびY. Huang、「一般化されたMVDRスペクトル」、 
%% IEEE信号処理レター、vol。12、pp.827-830、2005年12月。

%% x1、長さnの最初の信号ベクトル
%% x2、長さnの2番目の信号ベクトル
%% LはMVDRフィルターの長さまたはウィンドウの長さ
%% Kは解像度です(Kが高いほど解像度が高くなります)

%initialization
xx1 = zeros(L、1);
xx2 = zeros(L、1);
r11 = zeros(L、1);
r22 = zeros(L、1);
r12 = zeros(L、1);
r21 = zeros(L、1);

フーリエ行列の構築%
F = zeros(L、K);
l = [0:L-1] ';
f = exp(2 * pi * l * j / K);
k = 0の場合:K-1
    F(:、k + 1)= f。^ k;
終了
F = F / sqrt(L);

%サンプル数、x1およびx2の
長さに等しいn = length(x1);

for i = 1:n
    xx1 = [x1(i); xx1(1:L-1)];
    xx2 = [x2(i); xx2(1:L-1)];
    r11 = r11 + xx1 * conj(xx1(1));
    r22 = r22 + xx2 * conj(xx2(1));
    r12 = r12 + xx1 * conj(xx2(1));
    r21 = r21 + xx2 * conj(xx1(1));
終了
r11 = r11 / n;
r22 = r22 / n;
r12 = r12 / n;
r21 = r21 / n;

R11 = toeplitz(r11);
R22 = toeplitz(r22);
R12 = toeplitz(r12、conj(r21));

%正則化のため
Dt1の= 0.01 * R11(1)* DIAG(DIAG(もの(L)))。
Dt2 = 0.01 * r22(1)* diag(diag(ones(L)));

Ri11 = inv(R11 + Dt1);
Ri22 = inv(R22 + Dt2);
Rn12 = Ri11 * R12 * Ri22;

Si11 = real(diag(F '* Ri11 * F));
Si22 = real(diag(F '* Ri22 * F));
S12 = diag(F '* Rn12 * F);
%の
%マグニチュードの二乗コヒーレンス関数
MSC =実(S12 * CONJ(S12)。)./(SI11 * SI22。);

おすすめ

転載: blog.csdn.net/ccsss22/article/details/113823122