Matlab滤波器仿真误差

Matlab滤波器仿真误差,matlab,Matlab,我在matlab中做了一个维纳滤波器的仿真,但似乎我在代码中犯了一个错误,因为结果是不正确的。如果有人浏览一下代码并指出错误,我将不胜感激 代码如下: 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 = fi

我在matlab中做了一个维纳滤波器的仿真,但似乎我在代码中犯了一个错误,因为结果是不正确的。如果有人浏览一下代码并指出错误,我将不胜感激

代码如下:

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_帽的镜像。 这肯定是不对的

提前谢谢。

没问题

我完全不知道你想做什么。但是如果你想做的是得到一些信噪比,并试图通过一些线性一阶系统来模拟这些效应,你应该修正你的P和G多项式,如果是这样的话,它们是完全错误的。键入help filter并查看A和B定义

这是正确的代码:

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不是为了解决你的家庭作业,而是为了帮助你找到光明

投票结束:让陌生人通过检查发现代码中的错误是没有效果的。您应该通过使用调试器或print语句来识别或至少隔离问题,然后在将问题缩小到5行后返回一个更具体的问题。是的,但这不是Java或C代码。如果有人想帮忙,他可以把它粘贴到matlab中,自己看看。我只提供了所有必要的信息。调试是你应该自己做的事情。堆栈溢出适用于当您用尽了解决问题的传统方法时,也就是说,一旦您将问题缩小到某一行代码,而该行代码的行为与预期不符时。