matlab で Wiener フィルターのシミュレーションを行いましたが、結果が正しくないため、コードを間違えたようです。誰かがコードをちらりと見てエラーを指摘してくれたらありがたいです。
コードは次のとおりです。
k = 1:100;
sigma = 0.1;
s1 = randn(1,100);
n1 = randn(1,100) * sigma;
Pnum = [1 0.1];
Pdenum = [1 0.9];
Gnum = [1 0.9];
Gdenum = [1 0.1];
n = filter(Pnum, Pdenum, n1);
s = filter(Gnum, Gdenum, s1);
x = n + s;
rxx = xcorr(x);
rxs = xcorr(x,s);
toeplitz_rxx = toeplitz(rxx);
wopt = inv(toeplitz_rxx) * rxs;
wopt = inv(toeplitz_rxx) * transpose(rxs);
s_hat = filter(wopt,1,x);
error = x - s_hat; %this is where the wrong result is being calculated
plot(k,error, 'r',k,s_hat, 'b', k, x, 'g');
問題は、計算されたエラーが正確に s_hat の鏡像であることです。確かにこれは正しいとは言えません。
前もって感謝します。