自适应噪声对消器的信号模型如下图所示
Matlab代码如下:
clear;
clc;
Ts=0.1;
num=100;%?采样点数?
k=1:num;
x=10*cos(2*pi*k*Ts+0.25*pi);%正弦干扰
%s=0.5*randn(1,num);
%x=x+s;
xr=cos(2*pi*k*Ts);%参考信号
p=2;%滤波器长度
xita=zeros(p,num-p+1); %保存权值
err=zeros(1,num-p+1); %保存误差
kn=zeros(2,num-p+1);
lamda=0.99; %遗忘因子
diag_I=[1,0;0,1];
for i=1:num-p+1
if i==1
hn=[xr(1,i);0];
corr=10^5*diag_I;
kn(:,1)=(corr*hn)./(lamda^i+(hn')*corr*hn);%是列向量
err(1,i)=x(1,i)-xita(1,1)*xr(1,i);
xita(:,i)=err(1,i).*kn(:,i);
corr=(diag_I-kn(:,i)*hn')*corr;
aaa=1;
else
hn=[xr(1,i); xr(1,i-1)];
kn(:,i)=(corr*hn)./(lamda^i+(hn')*corr*hn);%是列向量
% fprintf( '%d',(lamda^i+(hn')*corr*hn));
err(1,i)=x(1,i)-xita(:,i-1)'*hn;
fprintf('xi=%d tmp=%d\n',x(1,i),xita(:,i-1)'*hn);
disp(err(1,i));
xita(:,i)=xita(:,i-1)+err(1,i).*kn(:,i);
corr=(diag_I-kn(:,i)*hn')*corr;
disp(corr);
end
end
subplot(2,1,2);
plot(k(1,1:num-p+1),xita,'r-');
subplot(2,1,1);
plot(k(1,1:num-p+1),err,'b-');
C++代码如下:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <fstream>
#include "_Matrix.h"
using namespace std;
const double pi = 3.14159;
int main()
{
cout<<"基于最小二乘自适应滤波算法的正弦信号干扰对消实验"<<endl;
double Ts=0.1;//采样间隔
int num = 200;//样本点数
double *x=new double[num];
double *xr=new double[num];
int i,j;
for (i=0;i<num;i++){
xr[i]=cos(2.0*pi*double(i+1)*Ts);//参考信号
}
int mode;
cout<<"实验1:普通正弦干扰信号对消"<<endl;
cout<<"实验2:幅值和相位差中途变化的正弦干扰信号对消"<<endl;
cout<<"请输入数字1或2(若输入数字不为2,则默认进行实验1):";
cin >>mode;
if (mode==2){