信号降噪方法——基于自适应神经模糊推理系统(ANFIS)的降噪处理

主要是对matlab的模糊推理系统工具箱中的这个例子做一些探讨说明:
在这里插入图片描述
这个例子的模型是,有一个有用信号记为x,这个有用信号x必须在有噪声源n1的环境中才能测量出来,而一般我们能测量到的信号m可以看作是有用信号x和噪声源信号n1经过环境信道(从噪声源到传感器)后的噪声信号n2的叠加。即:
m=x+n2
n2=f(n1)

在实际应用中,我们通常可以获得测量信号m,可以推测,或者说是估计噪声源信号n1,但很难说n1经过环境信道后的n2到底变成什么样子了,因为一般这个变换f是一个非线性处理的过程。但是这个n2又非常有用,因为根据m=x+n2,一旦知道n2,就知道真正的有用信号m。matlab的这个示例就是用ANFIS的方法,来估计出n2,从而估计出我们真正想要的有用信号m。
ANFIS((Adaptive Network-based Fuzzy Inference System:自适应神经模糊推测系统),是一种将模糊逻辑和神经元网络有机结合的新型的模糊推理系统结构,采用反向传播算法和最小二乘法的混合算法调整前提参数和结论参数,并能自动产生If-Then规则。matlab中提供了anfis 和 genfis两个指令函数,直接调用这个方法。
在这个示例中,给了一个6秒采样率为100的有用信号x:

time = (0:0.01:6)';
x = sin(40./(time+0.01));
plot(time,x)

在这里插入图片描述假定噪声源为高斯白噪声n1:

n1 = randn(size(time));
plot(time,n1)

randn是产生标准正态分布随机数序列,默认均值为0,时域上的幅值成正态分布,均值为0,对应频域中是均匀分布的,功率谱也是均匀的,因此实际上是产生了高斯白噪声。
在这里插入图片描述假定从噪声源n1到干扰信号n2的非线性过程方程是:

在这里插入图片描述
n2是关于n1(k)和n1(k-1)的函数,因为从噪声源到传感器采集首先有噪声源信号的传播过程,然后会混杂环境中的一些加性、乘性噪声造成非线性。n2这样假定兼顾了噪声源信号传播即时移带来的n1(k-1)和其他噪声导致的非线性。
以n1(k)和n1(k-1)作为两个信号维度,查看n2的分布特征:

domain = linspace(min(n1),max(n1),20);
[xx,yy] = meshgrid(domain,domain);
zz = 4*sin(xx).*yy./(1+yy.^2);

surf(xx,yy,zz);
xlabel('n_1(k)','fontsize',10);
ylabel('n_1(k-1)','fontsize',10);
zlabel('n_2(k)','fontsize',10);
title('Unknown Interference Channel Characteristics','fontsize',10);

meshgrid函数用于构建网络矩阵,surf用于绘制高维平面图。
在这里插入图片描述

依据方程绘制出n1和n2的信号对比图:
n1d0 = n1; % n1 with delay 0
n1d1 = [0; n1d0(1:length(n1d0)-1)]; % n1 with delay 1
n2 = 4*sin(n1d0).*n1d1./(1+n1d1.^2); % interference

subplot(2,1,1)
plot(time,n1);
ylabel(‘noise n_1’,‘fontsize’,10);
subplot(2,1,2)
plot(time,n2);
ylabel(‘interference n_2’,‘fontsize’,10);
在这里插入图片描述真正得到的测量信号m=x+n2,再把测量信号绘制出来:

m = x + n2;             % measured signal
subplot(1,1,1)
plot(time, m)
title('Measured Signal','fontsize',10)
xlabel('time','fontsize',10)
ylabel('m','fontsize',10)

在这里插入图片描述

对信号有了基本的认识后,下边通过构建ANFIS模型,估计出从n1到n2的这种非线性处理过程关系。
假设非线性信道的阶数已知(在本例中为2),因此可以使用2输入ANFIS模型进行训练。训练的输入数据为n1(k)、n1(k-1)以及测量信号m。虽然n2不直接可用,但可以假设m是用于培训的n2的“污染”版本,因为m=n2+x,即在ANFIS训练模型的非线性拟合中,把x视为噪声,n2=m-x。

delayed_n1 = [0; n1(1:length(n1)-1)];
data = [delayed_n1 n1 m];

产生初始的fis模型对象,默认采用网格区分算法,网格划分算法对每个输入变量使用两个隶属函数,从而生成四个模糊规则进行学习。算法设定与数据特征,数据类型有关,除了示例中使用的基于网格的划分聚类算法GridPartition,还可选择减法聚类SubtractiveClustering,FCMClustering模糊C均值聚类(Fuzzy C-means)。
设定好模型对象后,使用genfis指令由数据生成模糊推理系统:

genOpt = genfisOptions('GridPartition');
inFIS = genfis(data(:,1:end-1),data(:,end),genOpt);

使用anfis命令调整FIS,初始训练步长为0.2,然后开始训练:

trainOpt = anfisOptions('InitialFIS',inFIS,'InitialStepSize',0.2);
outFIS = anfis(data,trainOpt);

在这里插入图片描述利用训练好的ANFIS模型,由初始的n1(k)和n1(k-1)信号,得到估计的信号n2*,然后将估计的n2信号与实际的n2信号绘制出,进行对比:

estimated_n2 = evalfis(outFIS,data(:,1:2));
subplot(2,1,1)
plot(time, n2)
ylabel('n_2 (unknown)'); 

subplot(2,1,2)
plot(time, estimated_n2)
ylabel('Estimated n_2');

在这里插入图片描述有了估计信号n2*,则估计有用信号x*=m-n2*,绘制出估计的有用信号x*和实际的有用信号x,进行对比:

figure
plot(time,estimated_x,'b',time,x,'r')
legend('Estimated x','Actual x (unknown)','Location','SouthEast')

在这里插入图片描述
可以看出使用ANFIS模型给出了实际信号x在趋势上十分接近的估计值。

  • 0
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值