4.6  曲线拟合

在上一节,已经介绍了数据插值,它要求原始数据是精确的,或具有较小的误差。事实上,由于种种原因,实验或测量中所获得的数据总会有一定的误差。在这种情况下,如果强求构造的函数(曲线)通过各插值节点,显然是不合理的。为此,人们设想构造一个函数(曲线)y=g(x)去拟合f(x),但它不必通过各插值节点,而只是使该曲线从这些插值节点中穿过,且使它在某种意义下最优。

MATLAB的曲线拟合是用常见的最小二乘原理,所构造的g(x)是一个次数小于拟合节点个数的多项式。

4.6.1  最小二乘原理及其曲线拟合算法

设测得离散的n+1个节点的数据如下:

构造一个如下的m次拟合多项式函数g(x)为 (m≤n):

所谓曲线拟合的最小二乘原理,就是使上述拟合多项式在各数据点处的偏差的平方之和达最小。

上式中的均为已知值,而式中的系数为个未知数,故可以将其看做是的函数,即。于是我们可以把上述曲线拟合归结成对多元函数的求极值问题。为使取极小值,必须满足以下方程组:

经过简单的推导,可以得到一个m+1阶线性代数方程组Sa=t,其中Sm+1阶系数矩阵,t为右端项,而a为未知数向量,即欲求的m次拟合多项式的m+1个系数。这个方程组也称为正则方程组。至于正则方程组的具体推导,可参阅有关数值计算方法的教材。

4.6.2  曲线拟合的实现

在MATLAB中,可以用polyfit函数来求最小二乘拟合多项式的系数,另外可以用polyval函数按所得的多项式计算指定值。

polyfit函数的调用语法是:

[p,s]=polyfit(x,y,m)

输入参数x,y为测量而得的原始数据,为向量;m为欲拟合的多项式的次数。polyfit (x,y,m)将根据原始数据x、y得到一个m次拟合多项式P(x)的系数,该多项式能在最小二乘意义下最优地近似函数f(x),即有p(xi)≈f(xi)≈yi。

返回的结果中p为m次拟合多项式的系数,而s中的数据则是一个结构数组,代入polyval函数后可以得到拟合多项式相关的误差估计。s最常用的写法可以是:p=polyfit(x,y,M)。

polyval的函数功能是按多项式的系数计算指定点所对应的函数值。

【例4-43】  曲线拟合示例。

本例首先在多项式的基础上加入随机噪声,产生测试数据,然后对测试数据进行数据曲线拟合:

>> clear

>> rand('state',0)

>> x=1:1:10;

>> y=-0.9*x.^2+10*x+20+rand(1,10).*5; %  产生测试数据

>> plot(x,y,'o')                  %  绘图并标出原始数据点

>> p=polyfit(x,y,2)

>> xi=1:0.5:10;

>> yi=polyval(p,xi);                     % 计算拟合的结果

>> hold on

>> plot(xi,yi);                   %  绘制拟合结果图

>> hold off

运行以上命令,得到的结果如图4-10所示。另外得到的多项式系数为:

p =

-0.8923    9.8067   23.6003

也就是说通过曲线拟合,得到了多项式。通过比较系数和观察图形,可以看出本次曲线拟合结果的精度是比较高的。

图4-10  曲线拟合

4.7  Fourier分析

傅立叶(Fourier)分析在信号处理领域有着广泛的应用,现实生活中大部分的信号都包含有多个不同的频率组件,这些信号组件频率会随着时间或快或慢的变化。傅立叶级数和傅立叶变换是用来分析周期或者非周期信号的频率特性的数学工具。从时间的角度来看,傅立叶分析包括连续时间和离散时间的傅立叶变换,总共有4种不同的傅立叶分析类型:连续时间的傅立叶级数、连续时间的傅立叶变换、离散时间的傅立叶级数、离散时间的傅立叶变换等。

频谱分析是在数据中识别频率组成的处理过程。对于离散数据,频谱分析的计算基础是离散傅立叶变换(DFT)。DFT将time-based或者space-based数据转换为frequency-based数据。

一个长度为n的向量x的DFT,也是一个长度为n的向量:

其中是n阶复数根:

在此表达式中,i表示虚数单位 。

DFT有一种快速算法FFT,称为快速傅立叶变换。FFT并不是与DFT不同的另一种变换,而是为了减少DFT运算次数的一种快速算法。它是对变换式进行一次分解,使其成为若干个小数点的组合,从而减少运算量。常用的FFT是以2为基数的,其长度用N表示,N为2的整数倍。

MATLAB中采用的就是FFT算法。MATLAB提供了函数fft和ifft等来进行傅立叶分析。

1.函数fft和ifft

函数fft和ifft对数据作一维快速傅立叶变换和傅立叶反变换,函数fft的调用语法有如下几种。

(1)Y=fft(X):如果X是向量,则采用快速傅立叶变换算法作X的离散傅立叶变换;如果X是矩阵,则计算矩阵每一列的傅立叶变换。

(2)Y=fft(X,n):用参数n限制X的长度,如果X的长度小于n,则用0补足;如果X的长度大于n,则去掉长出的部分。

(3)Y=fft(X,[ ],n)或Y=fft(X,n,dim):在参数dim指定的维上进行操作。

函数ifft的用法和fft完全相同。

2.fft2和ifft2

函数fft2和ifft2对数据作二维快速傅立叶变换和傅立叶反变换。数据的二维傅立叶变换fft2(X)相当于fft(fft(X)’)’,即先对X的列做一维傅立叶变换,然后对变换结果的行做一维傅立叶变换。函数fft2的调用语法有如下几种。

(1)Y=fft2(X):二维快速傅立叶变换。

(2)Y=fft2(X,MROWS,NCOLS):通过截断或用0补足,使X成为MROWS*NCOLS的矩阵。

函数ifft2的用法和fft2完全相同。

3.fftshift和ifftshift

函数fftshift(Y)用于把傅立叶变换结果Y(频域数据)中的直流分量(频率为0处的值)移到中间位置:

(1)如果Y是向量,则交换Y的左右半边;

(2)如果Y是矩阵,则交换其一三象限和二四象限;

(3)如果Y是多维数组,则在数组的每一维交换其“半空间”。

函数ifftshift相当于把fftshift函数的操作逆转,用法相同。

【例4-44】  生成一个正弦衰减曲线,进行快速傅立叶变换,并画出幅值(amplitude)图、相位(phase)图、实部(real)图和虚部(image)图。

>> tp=0:2048;                             %  时域数据点数N

>> yt=sin(0.08*pi*tp).*exp(-tp/80);      %  生成正弦衰减函数

>> plot(tp,yt), axis([0,400,-1,1]),      %  绘正弦衰减曲线

>> t=0:800/2048:800;                       %  频域点数Nf

>> f=0:1.25:1000;

>> yf=fft(yt);                             %  快速傅立叶变换

>> ya=abs(yf(1:801));                      %  幅值

>> yp=angle(yf(1:801))*180/pi;            %  相位

>> yr=real(yf(1:801));                    %  实部

>> yi=imag(yf(1:801));                     %  虚部

>> figure

>> subplot(2,2,1)

>> plot(f,ya),axis([0,200,0,60])        %  绘制幅值曲线

>> title('幅值曲线')

>> subplot(2,2,2)

>> plot(f,yp),axis([0,200,-200,10])     %  绘制相位曲线

>> title('相位曲线')

>> subplot(2,2,3)

>> plot(f,yr),axis([0,200,-40,40])      %  绘制实部曲线

>> title('实部曲线')

>> subplot(2,2,4)

>> plot(f,yi),axis([0,200,-60,10])      %  绘制虚部曲线

>> title('虚部曲线')

本例首先生成正弦衰减函数yt,绘制的正弦衰减曲线如图4-11所示。然后对yt进行了快速傅立叶变换,结果如图4-12所示。

图4-11  正弦衰减曲线图

图4-12  傅立叶变换结果

matlab fft变换后的相位精度问题_MATLAB曲线拟合及Fourier分析相关推荐

  1. 故障诊断数据预处理之1-D振动信号FFT变换后的2-D灰度图转换

    文章目录 前言 一.转换原理 二.Matlab代码展示 前言 目前,基于数据驱动的故障诊断方法通常采用深度神经网络来挖掘采集数据中隐藏的信息,实现故障分类.然而,它们大多利用原始的一维时域信号作为DN ...

  2. Matlab FFT变换细节(信号采样频率,FFT变换点数,频率分辨率)

    问题: 在做深度学习的故障诊断中,发现代码直接将原始信号fft之后直接将实频域信号输入网络中进行诊断,虽说效果比较不错95% 但因为输入的是双边谱且频率范围远超故障特征频率同时由于单个样本的点数只有1 ...

  3. matlab中的fft变换后的频率的缩放系数问题。

    本文的目的在于说明fft变换之后的幅值对应的真实频率到底是多少. 为了方便大家理解fft的基础知识,在下面附上<小波分析与傅里叶变换基础>的pdf,dft,fft相关在第三章. 链接:ht ...

  4. 离散正(余)弦信号的时域与FFT变换后所得频域之间的关系(幅值和相角)

    正弦信号在信号处理中是很常见的,比如通信领域的载波.由于正弦与余弦只是相差π/2的初相,因此这里统称正弦信号.给出连续正弦信号的表达式: 式中,A为振幅,Ω为模拟角频率(rad/s),φ为初相,f为模 ...

  5. 离散信号经过FFT处理后,幅度,相位,功率的计算

    <1> : 每点对应的实际幅度等于fft后对应点实部和虚部的平方根再乘以2/N,N是采样点数,不过直流分量即第一点须除N 幅值:(假设你只须分析x次以下谐波) for(i=0;i<x ...

  6. 深入浅出解释FFT(四)——fft分析信号频率和相位

    很基础的问题往往很重要,做仿真时候有一个点的差错都会导致结果的错误.在网上找了前人写的东东,总结下希望对大家有帮助,让大家少走一些弯路. 1.  信号的时域采样点N和频域采样点数相同 %####### ...

  7. matlab fft(x dim),matlab的fft函数

    matlab中fft的用法及注意事项_调查/报告_表格/模板_实用文档.本文是笔者整理的如何使用matlab的fft函数及fftshift函数,希望对大家有所帮助!... C 语言.MATLAB 实现 ...

  8. 干货 | 使用FFT变换自动去除图像中严重的网纹

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 这个课题在很久以前就已经有所接触,不过 ...

  9. 【算法随记五】使用FFT变换自动去除图像中严重的网纹。

    这个课题在很久以前就已经有所接触,不过一直没有用代码去实现过.最近买了一本<机器视觉算法与应用第二版>书,书中再次提到该方法:使用傅里叶变换进行滤波处理的真正好处是可以通过使用定制的滤波器 ...

  10. matlab fft谱分析实验报告,数字信号处理实验报告-FFT算法的MATLAB实现.doc

    数字信号处理实验报告-FFT算法的MATLAB实现.doc 数字信号处理 实验报告实验二FFT算法的MATLAB实现一.实验目的通过本实验的学习,掌握离散傅立叶变换的理论,特别是FFT的基本算法以及其 ...

最新文章

  1. 如果我的接口必须返回Task,那么实现无操作的最佳方法是什么?
  2. DOMINO的JDBC和ODBC连接方法
  3. run sequence between odata request and controller init
  4. Java解析json出现双引号变成转义字符解决办法
  5. BZOJ 2843 极地旅行社
  6. Database2Sharp重要更新之生成Winform框架界面代码
  7. 运筹学在不同环境下的决策 -- 学习记录
  8. LeetCode962. 最大宽度坡
  9. Angular.js学习笔记(1)
  10. 集成电路封测行业科普
  11. 关于高等数学、线性代数、数理统计和概率论
  12. 一文搞懂程序流程图详解
  13. Excel怎么快速制作二维码并保存本地?
  14. google服务框架 闪退_没Google服务闪退?教你解决手游谷歌服务问题
  15. 江苏开票系统安全接入服务器地址,江苏省增值税发票查询平台网址.doc
  16. winpe 能否修复服务器系统盘,U盘WINPE、光盘WINPE系统(启动修复盘)制作图文教程...
  17. Namecheap无法登录
  18. Linux 访问superio 寄存器,ITE Super IO 学习 - GPIO
  19. STM32CUBE+自平衡车实践篇3.4-STM32cueb配置编码器+车轮速度测量代码实现
  20. Robotstudio软件:ABB机器人机器视觉位姿引导虚拟仿真

热门文章

  1. vmware给linux虚拟机添加新的分区
  2. 将PDF转为TXT文本格式提取中文
  3. 190408每日一句
  4. 10 Love Quotes Touch Your Soul at First Sight
  5. 如何保证软件质量?汽车软件基于模型开发的十个问题与质量工具推荐
  6. atitit software sys 软件技术领域工业体系.docx 目录 1. 技术领域一级大类10大类 2 2. 理论与软件设计方法学 2 2.1. 计算机原理 计算机科学导论 2 2.2.
  7. Atitit sql的执行功能 目录 1. 主要流程 1 1.1. 获取conn,执行sql取得结果, 1 1.2. Orm类的执行(hb mybatis为例 1 2. 常见sql执行框架与类库 1
  8. Atitit 泛型的知识点 目录 1. 为什么需要泛型 why 2 2. 定义分类 what 2 2.1. 编辑类型参数 2 2.2. 模板 2 2.3. 简单理解 占位符 代替object、 3
  9. Atitit js通讯技术 jsbridge ajax bomext Atitit jsbridge 与jsrpc 的联系与区别 JSBridge——Web与Native交互 侧重本
  10. Atitit uke消防防火规范 attilax总结