求助:自适应噪声对消
我想利用自适应噪声对消来提取混合信号中某一确定频率的正弦信号。附件数据中,采样频率为 fs=1600Hz,为一随机噪声和一频率为85.333Hz的正弦信号。我先做了下面的仿真试验,在其中加入75Hz的正弦信号,然后用自适应噪声对消,但结果误差特别大,感觉不对,是否因为步长的关系?请高手指教!
我的程序如下:
%目的用自适应对消去掉混合信号中的频率为75的正弦信号,滤波器输出y即为此正弦信号的估计。
clear all;clc;
load data;
s=data'; %输入信号
fs=1600;%采样频率
N=length(data); %总采样长度
t=0:1/fs:1/fs*(N-1); %时间的变化范围
n1=500*cos(2*pi*75*t+pi/3);%干扰信号
x=s+n1;%信号混合
%用二阶自适应滤波器,下面是两个参考信号
x1=cos(2*pi*75*t);
x2=sin(2*pi*75*t);
%初始化
w1=0;
w2=0;
e=zeros(1,N);
y=zeros(1,N);
u=0.05;%迭代步长,随便设定的
%算法
for i=1:N
y(i)=w1*x1(i)+w2*x2(i);
e(i)=x(i)-y(i);%误差信号
w1=w1+u*e(i)*x1(i);%迭代方程
w2=w2+u*e(i)*x2(i);%迭代方程
end
figure(1);
subplot(311);
plot(t,e);
title('输出信号');
subplot(312);
plot(t,s);
title('s');
subplot(313);
plot(t,s-e);
figure;
subplot(311);
plot(t,y);
subplot(312);
plot(t,n1);
subplot(313);
plot(t,y-n1); data中的数据不是已经是混合信号了吗?怎么又有x=s+n1;%信号混合
对消:输入信号;参考信号.能把你的意思大致说一下吗?
[ 本帖最后由 qinle 于 2007-3-21 21:22 编辑 ] 看了楼主的程序,这是自适应陷波器的典型方法。
1,可以适当此行调整u,例如u=0.01,可以改善e的幅值,使幅值更接近s的幅值;
2,自适应陷波器也和普通滤波器一样,对信号的输出有一个过渡过程,所以在e的初始部分有较大的起伏,但逐步趋于稳定。
3,自适应陷波器的输出e和s并不是同相位的,因此s-e便不可能趋于零,可是e的幅值和频率是与s相接近的,这也和普通滤波器一样。
回复 #2 qinle 的帖子
我担心data数据中的正弦信号的频率不准确,就人为加入一个确定的正弦信号进行模拟试验,看能否得到期望的结果,即总的输出e(n)为data中信号的估计,而滤波器的输出y(n)是对n1的估计。在这里,我把data中的数据当作有用信号,n1为噪声,x1和x2为参考信号,目的是从n1和data的混合信号中消去n1(这里只是做个模拟,并非没事找事,^_^)。不知我说明白没?个人表达能力有待提高,还请见谅。
回复 #3 songzy41 的帖子
首先谢谢你的回复!对于你说的1和2我明白。第3条,你的意思是滤波器改变了e的相位,所以s-e的误差很大吗? 是这样,主要是相位发生了变化。 for i=1:N
y(i)=w1*x1(i)+w2*x2(i);
e(i)=x(i)-y(i);%误差信号
w1=w1+u*e(i)*x1(i);%迭代方程
w2=w2+u*e(i)*x2(i);%迭代方程
end
你的算法,对e并没有做任何判断,如e到多小,然后结束循环.只是在你规定的范围内完成计算,因为是自适应的,要有个过程,你的程序还没有到解决问题的时候,所以会出现不收敛问题,另:自适应噪声抵消,参考信号和源信号中的噪声要有较强相关性才可能去噪,具体相关性达到多少才是最佳的,这个我也不清楚.可以给你以后程序参考:
% filter parameters
M=20; % number of taps
mu=0.05; % step-size parameter
e_max=500; % maximum #of epochs
% constants
pi=3.14;
Fs=0.02; % signal frequency
Fn=0.05; % noise frequency
% initialize
w=(randn(1,M)-randn(1,M))/100;
d=zeros(1,M);
u=zeros(1,M);
u_out=zeros(1,e_max-M);
f_out=zeros(1,e_max-M);
% Generate desires signal and input(signal+noise)
for t=1:M-1
d(t)=sin(2*pi*Fs*t);
u(t)=d(t)+0.5*sin(2*pi*Fn*t)+randn;
end
t=M;
epoch=0;
while epoch<e_max
% generate new input
input=sin(2*pi*Fs*t);
% shift new input into array
for i=2:M
d(M-i+2)=d(M-i+1);
u(M-i+2)=u(M-i+1);
end
d(1)=input;
% add undesired freq & random noise
u(1)=input+0.5*sin(2*pi*Fn*t)+0.09*randn;
u_out(t-M+1)=u(1);
% compute filteroutput
output=dot(w,u);
f_out(t-M+1)=output;
% LMS algorithm
% compute error
e=d(1)-output;
% update weights
for n=1:M
w(n)=w(n)+mu*u(n)*e;
end
%
in(t-M+1)=u(1);
out(t-M+1)=output;
err(t-M+1)=e;
t=t+1;
epoch=epoch+1;
end %plot noise and filtered signal
figure(1)
subplot(211);
plot(t,u(1));axis();
title('滤波器输入')';
hold on;
subplot(212);
plot(t,d(1));axis();
title('滤波器输出')';
hold on;
figure(2)
subplot(211);
plot(t,output);axis();
title('滤波输出信号')';
hold on;
subplot(212);
plot(t,e);axis();
title('误差信号')';
hold on;
回复 #3 songzy41 的帖子
还有个问题,参考信号的振幅和噪声的振幅相等时(相差不大时也出现这种情况),权系数出现Nan是怎么回事呢?通常来说,如果参考信号和噪声相同时,相关度最高,应该效果最好,可是。。。。?回复 #7 qinle 的帖子
噪声和参考信号是同频率的信号,相关度还是挺高的。至于设定误差最小的问题,我用全部数据参与运算,如何还不收敛,那么设定误差限作用也不大吧?应该是
看看,相位发生了变化 建议好好看看书很简单的问题
回复 板凳 songzy41 的帖子
我想请问一下,lz的自适应滤波使用的方法是lms还是rls方法呢,谢谢指教! 楼主用的是lms算法
页:
[1]