Matlab滤波器模拟错误

时间:2012-04-29 16:49:29

标签: matlab

我在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的镜像。 当然这不对。

提前致谢。

1 个答案:

答案 0 :(得分:0)

没问题。

我完全了解了你想要做的事情。 void 。但是,如果你想要做的是获得一些信噪比,并试图通过一些线性一阶系统模拟这些效应,你应该更正你的PG多项式,这是完全的错了,如果是这样的话。输入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');

toeplitz仍有病态调节。我就是这样离开的,因为你仍然可以玩得很开心。这也很容易解决。

这些人是真的。 StackOverflow不是为了解决你的功课,而是为了帮助你找到光。