使用递推最小二乘法(RLS算法)进行自适应噪声对消

本文介绍了如何使用递推最小二乘法(RLS算法)实现自适应噪声对消。通过信号模型分析,配合Matlab代码示例,详细阐述了RLS算法在噪声对消过程中的具体应用。
摘要由CSDN通过智能技术生成

自适应噪声对消器的信号模型如下图所示





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){
	
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值