1

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 の鏡像であることです。確かにこれは正しいとは言えません。

前もって感謝します。

4

1 に答える 1

0

問題ない。

私はあなたがやろうとしていることについて完全に空虚な考えを持っています。しかし、あなたがやろうとしているのが信号対雑音比を得ることであり、いくつかの線形一次システムを通してそれらの効果を模倣しようとしているのであれば、完全に間違っているあなたPと多項式を修正する必要があります。との定義をG入力help filterして確認します。AB

これは正しいコードです:

k = 1:100;
sigma = 0.1;
s1 = randn(1,100);
n1 = randn(1,100) * sigma;
Pnum = [0 0.1];
Pdenum = [1 -0.9];
Gnum = [0 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) * 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');

テプリッツにはまだ不調があります。あなたはまだ対処するのが楽しいので、私はそれをそのままにしておきます。これも簡単に解決できます。

彼らは本当です。StackOverflow は宿題を解決するためのものではなく、光を見つける手助けをするためのものです。

于 2014-09-13T21:18:30.697 に答える