Matlab: 白噪声与曲线拟合
在信号处理中常常需要用到曲线拟合,这里介绍一下利用最小二乘拟合一般曲线的方法,并对滤掉信号中白噪声的方法作些介绍。
为了测试拟合算法的好坏,先模拟出一个信号作为检验算法的例子:
- 用白噪声产生模拟信号:
对于理论信号y=y(x),一般可用rand(size(x))和randn(size(x))生成随即噪声信号,两者的区别在于rand生成的噪声信号都是正值,而randn生成的噪声信号则是正负跳跃分布的,所以randn作为白噪声信号,更符合实际情况:
f0=@(c,x)( (x>=0&x<c(1))*0 + (x>=c(1)&x<c(2))*c(3)/(c(2)-c(1)).*(x-c(1)) + (x>=c(2)&x<c(4)).*( (c(5)-c(3))/(c(4)-c(2))*(x-c(2))+c(3) ) + (x>=c(4)&x<c(6))*c(5)/(c(4)-c(6)).*(x-c(6)) + (x>=c(6))*0 );
disp('real c0');
c0=[1, 2, 1, 5, 2, 6]
x_int=0:0.002:10;
y_int=f0(c0,x_int);
%(x_int, y_int) is perfect zigzag signal
%sig=y_int+0.5*rand(size(x_int));
sig=y_int+0.5*randn(size(x_int));


- 最小二乘折线拟合
考虑到需要拟合的函数是个分段的折线函数,需要首先建立含有固定参数的折线函数的数学模型,算法如下图:

按照这个算法,用matlab搭建的代码如下:
% try zigzag fitting
f2=@(c,x)( (x>=0&x<c(1))*0 + (x>=c(1)&x<c(2))*c(3)/(c(2)-c(1)).*(x-c(1)) + (x>=c(2)&x<c(4)).*( (c(5)-c(3))/(c(4)-c(2))*(x-c(2))+c(3) ) + (x>=c(4)&x<c(6))*c(5)/(c(4)-c(6)).*(x-c(6)) + (x>=c(6))*0 );
c0=[1.1, 1.5, 1.8, 5.4, 2.5, 5.6];
c_fit=nlinfit(x_int,sig,f2,c0);
y2=f2(c_fit,x_int);
figure();
plot(x_int,sig,'blue');
hold on
plot(x_int,y2,'red --','linewidth',2);
legend('sig','zigzag fitting');

真实参数:1,2,1,5,2,6
拟合参数:1.0237,2.06,1.0107,4.9479,2.1101,6.0005
可以看到,拟合的参数多少和真实的参数存在一些差异,但是已经非常接近。
- 优化:傅立叶变换降噪
如果要进一步提高拟合的精度,需要设法降低白噪声的干扰。因为白噪声是一种宽谱的干扰,所以常用的带通滤波处理是不可行的,这里可以考虑对信号进行傅立叶变换,滤掉其中强度较弱的白噪声频域成分。
Fs=1/(x_int(2)-x_int(1));
nfft=length(sig);
sig_fft_comp=fft(sig);
sig_fft_real=2*abs(sig_fft_comp)/nfft;
% adjust the distribution of spectrum according to double frequency direction
sig_fft_real_adjust=[sig_fft_real(round(nfft/2+1):end),sig_fft_real(1:round(nfft/2))];
f_double=linspace(-Fs/2,Fs/2,nfft);
% apply the A(f) strength filter
Af_level=0.01;
Af_lim=Af_level*max(sig_fft_real);
i_fd=find(sig_fft_real<Af_lim);
sig_fft_fit=sig_fft_comp;
sig_fft_fit(i_fd)=0;
figure();
plot(f_double,sig_fft_real_adjust);
xlabel('f(Hz)');
ylabel('A(f)');
xlim([f_double(1),f_double(end)]);
hold on
plot(f_double,Af_lim*ones(size(f_double)),'red --','linewidth',1);
legend('spectrum','Af limit');
% reconstruct the signal with filtered spectrum
sig_fit=ifft(sig_fft_fit);
% perform fitting for the A filtered signal
disp('fit c0 after A filter');
c_fit3=nlinfit(x_int,sig_fit,f2,c0)
y3=f2(c_fit3,x_int);
% compare signal and fitted signal
figure();
plot(x_int,sig,'black',x_int,sig_fit,'red');
hold on
plot(x_int,y3,'green --','linewidth',2);
legend('sig','Fourier fit','zigzag fit');
傅立叶降噪后结果如下:


此时算得的拟合系数是:
1.0677,1.8680, 0.9665,5.0140,1.9736,5.9895
这比降噪前的效果稍好了一些,更贴近与真实的折线系数。但是编程的复杂度上升了很多,在对拟合的精度要求不是太高的情况下,可以不用作傅立叶降噪的处理。
- 补充:matlab多项式拟合函数(polyfit)
[p,s,mu]=polyfit(x,y,n)
x,y是被拟合的离散曲线点,n是需要拟合的多项式次数(默认的多项式是幂级数形式的),其中p是个多项式各次项的系数,是按照指数从高到低排列的。mu(1)是y的平均值,mu(2)是单位标准偏差(unit standard deviation,可缩写成STD)
\(SDT=\frac{y-mean(y)}{\sigma}\)
Matlab: 白噪声与曲线拟合的更多相关文章
- Matlab单一变量曲线拟合-cftool
2.启动曲线拟合工具箱>cftool 3.进入曲线拟合工具箱界面“Curve Fitting tool”(1)点击“Data”按钮,弹出“Data”窗口:(2)利用X data和Y data的下 ...
- 基于MATLAB的多项式数据拟合方法研究-毕业论文
摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...
- MATLAB中白噪声的产生
rand产生的是[0,1]上的均匀分布的随机序列randn产生均值为0,方差为1的高斯随机序列,也就是白噪声序列 rand产生的是均匀分布白噪声序列randn产生的是正态分布的白噪声序列 MATLAB ...
- MATLAB中白噪声的WGN和AWGN函数的使用
MATLAB中白噪声的WGN和AWGN函数的使用如下: MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一 信号 ...
- Matlab的曲线拟合工具箱CFtool使用简介
http://phylab.fudan.edu.cn/doku.php?id=howtos:matlab:mt1-5 一. 单一变量的曲线逼近Matlab有一个功能强大的曲线拟合工具箱 cftool ...
- Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类
Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类 内容大纲 加性高斯白噪声信道(AWGN)下的digital调制格式识别分类 (1. PSK; 2. QPSK; 3.8 ...
- [转] Matlab中给信号加高斯白噪声的方法
MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声. 1. WGN:产生高斯白噪声 y = ...
- matlab 曲线拟合小记
在matlab中经常需要对数据进行曲线拟合,如最常见的多项式拟合,一般可以通过cftool调用曲线拟合工具(curve fit tool),通过图形界面可以很方便的进行曲线拟合,但是有些时候也会遇到不 ...
- [ZZ] MATLAB曲线拟合
MATLAB曲线拟合 http://blog.sina.com.cn/s/blog_5db2286f0100enlo.html MATLAB软件提供了基本的曲线拟合函数的命令: 多项式函数拟合: a ...
随机推荐
- SMD晶振发展和智能手机的普及总是惊人的相似!
其实触屏手机在2002年前后就已经出现了,但那个时候的触屏手机不算是现在的这种智能手机,有人说最早发行触屏手机的是诺基亚,也有人说是苹果还有人认为摩托罗拉.总之众说纷纭,小编那里还太小也并不是很了解, ...
- LR11 scan correlation 卡死解决方案
LR11 scan correlation 卡死解决方案 笔者在录制脚本时是勾选Enable correlation during recording的,导致后续每次脚本回放都会弹出scan corr ...
- 开涛spring3(3.4) - DI 之 3.4 Bean的作用域
3.4 Bean的作用域 什么是作用域呢?即“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围.而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围. ...
- GRPC在NET上的实践(记录篇)
GRPC是什么? GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffer ...
- 从插上网线到web页面请求,究竟发生了哪些过程?(计算机网络篇)
一.说在前头 好久没有更新博客了,汗颜,最近忙于各种实验与报告,但是还是要抽时间总结一下学的东西.欢迎转载,但是要注明出处哦(=^ ^=). 最近学了计算机网络,正好总结一下.本篇博客的大部分是跟计算 ...
- Drools 6.5 Final 入门
Drools 6.5 Final学习笔记 最近项目中要涉及到使用规则对数据进行操作,想到自己实现一个完整且能灵活满足业务需求的规则系统太难了,就想了解一下有没有开源的规则引擎可以使用,后来发现Droo ...
- linux新学篇
[学会使用快捷键] Ctrl + C:这个是用来终止当前命令的快捷键,当然你也可以输入一大串字符,不想让它运行直接Ctrl + C,光标就会跳入下一行. Tab: 这个键是最有用的键了,也是笔者敲击概 ...
- js的event事件
一 . 焦点:使浏览器能够区分区分用户输入的对象,当一个元素有焦点的时候,那么他就可以接收用户的输入. 我们可以通过一些方式给元素设置焦点 1.点击 2.tab 3.js 不是所有元素都能够接受 ...
- loadrunner提高篇-结果分析实践
分析图合并 一.分析图合并原理 选择view->merge graphs,弹出如图1所示对话框 图1(设置合并图) 1.选择要合并的图.选择一个要与当前活动图合并的图,注意这里只能选择X轴度量单 ...
- python中defaultdict的用法
初识defaultdict 之前在使用字典的时候, 用的比较随意, 只是简单的使用dict. 然而这样在使用不存在的key的时候发生KeyError这样的一个报错, 这时候就该defaultdict登 ...