当前位置:首页 > MATLAB
  • 基于MATLAB的“信号与系统”虚拟实验系统的研究

    摘要:针对“信号与系统”课程理论性强、概念抽象、直观性较差等特点,利用MATLAB软件构建实现信号与系统虚拟实验仿真平台,通过对相关参数进行设置,在交互式平台上直观显示仿真实验结果,克服硬件实验系统的局限性,促进时抽象理论的快速理解,培养学生的创新意识和创新能力,实现更好的实验效果。 关键词:MATLAB;信号与系统;虚拟实验系统;GUI;仿真     信号与系统课程是电子信息类专业重要的专业基础课,它以高等数学、线性代数、电路分析以及工程数学等课程为基础,同时又是后续如通信原理、数字信号处理以及研究生阶段现代数字信号处理、随机信号分析等专业课程的基础,在整个专业教育体系中起着承上启下的作用。该课程理论性强、概念抽象且难以理解、公式推导复杂计算繁琐、实验内容丰富等特点,使得其成为一门数学方法、专业理论和工程应用密切相结合的课程。因此,教学效果成败的关键不在于学生认识和记忆了多少定义定理的条文,而应注重正确引导学生运用数学工具分析典型的实际问题。     实验教学是该课程理论学习中必不可少的部分。但是,在实验教学中面临很多问题,诸如高校需要花费大量的经费购置实验仪器;硬件实验仪器易于损坏、操作复杂、中间过程可视性差等。虚拟实验技术的出现使上述问题迎刃而解。虚拟实验是指借助于多媒体、仿真和虚拟现实等技术在计算机上营造可辅助、部分替代甚至全部替代传统实验各操作环节的相关软硬件操作环境,实验者可以像在真实的环境中一样完成各种实验项目,所取得的实验效果等价于甚至优于在真实环境中所取得的效果。虚拟实验建立在一个虚拟的实验环境(平台仿真)之上,并且注重实验操作的交互性和实验结果的仿真性。虚拟实验是现代实验教学的发展模式,它能够有效地补充和完善硬件实验,缓解实验设备不足和滞后等问题;允许出现误操作,获得“零”维护保障,便于开展设计型、综合型实验;二次开发和维护容易。因此,研究信号与系统虚拟实验技术能够有效地补充完善课程的实验教学。 1 开发工具MATLAB简介     MATLAB作为虚拟实验仿真最常用软件之一,在进行实验项目开发时能够有效弥补某些传统硬件实验箱的不足,利用其图形用户界面设计技术和强大的仿真功能完成原来在物理设备上所要完成的理论实验,不仅可将抽象理论知识运用图形、文字、数据等多种形式展现,更为实验教学提供一个界面友好、操作简便的虚拟环境。     MATLAB是英文MATrix LABoratory(矩阵实验室)的缩写,是美国MathWorks公司推出的商业化科技应用软件,是一套适合多学科的、功能强大的工程计算和系统仿真软件。它也是一种面向对象的交互式程序设计语言,具有友好的用户界面及接近数学表达式的自然化语言、高效的数值计算及符号计算功能、完备的图形处理功能以及功能丰富的应用工具箱等特点。在利用其进行工程计算和系统仿真时,可以略去复杂的理论推导过程,使得编程快捷方便,易于实现。     MATLAB的GUI工具是一种包含多种图形对象的界面,主要包括图形显示、功能按钮控件以及用户自定义的功能菜单等,利用属性、事件过程、菜单等编辑器,可以构建一个功能完善,界面良好的交互式操作平台,实现人机信息的交互。在设计界面内,用户可以根据提示完成整个工程,而不必关心工程内部如何进行工作。GUI设计主要依附于MATIAB环境提供的基本科学计算,同时也可利用GUIDE进行设计,方便的穿件各种图形句柄对象,实现仿真平台的 用户界面设计。 2 虚拟实验系统设计     笔者借助于MATLAB软件及其GUI工具,开发设计可视化的信号与系虚拟实验平台,通过简单友好的交互式界面,完善实验教学。 2.1 系统模块结构     从信号与系统的理论教学内容着手分析,结合传统的信号与系统硬件实验箱实现的实验项目,将信号与系统虚拟实验系统分为信号实验和系统实验两大部分,然后针对每部分实验再分别从连续时间和离散时间两个方面进行虚拟仿真实现。信号实验方面主要包括:信号的表示和仿真、信号的时域运算、信号的变换(傅里叶变换、拉普拉斯变换、Z变换);系统实验方面主要包括系统的时域分析、频域分析、S域分析以及Z域分析。同时兼顾连续和离散两种特性,对虚拟实验系统进行模块划分逐一实现,系统模块结构划分如图1所示。 2.2 系统GUI界面设计     GUI界面是由窗口、菜单、按钮、文字说明等对象构成的用户界面,用户通过一定的方法激活这些图形对象,使计算机产生某些动作或变化。本系统的GUI界面设计主要是利用MATLAB中的GUIDE工具进行设计。设计中用到的控件有:静态文本框(Static text)、可编辑文本框(Editabletext)、框架(Frames)、命令按钮(Push buttons)、列表框(Listboxes)等;设计中涉及到的GUI界面主要包括虚拟实验平台主界面、每一个具体实验项目界面以及对应的仿真实例子界面等,其中进入虚拟实验系统主界面如图2所示。 3 仿真实例分析 3.1 实例一:信号波形仿真     在该课程的理论学习中,对常用的连续信号和离散信号一直没有比较直观的认识,很多只是停留在信号的数学表达式层面,并对由硬件实验箱实现的信号波形持有怀疑态度。虚拟实验仿真平台的设计,使得可以选择想要观察学习的信号,通过输入相关参数进行计算仿真,便可以直观地观察到信号的波形。以正弦信号f(t)=Asin(ωt+θ)和正弦序列f(k)=Asin(wk+n)为例,对两种信号分别输入相应的参数值,计算输出的信号仿真波形分别如图3和图4所示,并且从两图中能直观地看出信号的三要素,即幅值A、频率ω和初相θ(或n)。 3.2 实例二:系统时域分析     对于线性时不变系统,连续时间系统以常系数微分方程来描述,离散时间系统以常系数差分方程来描述。如果系统的输入信号及初始状态已知,通过数学方法便可以很容易求出系统的冲激响应、阶跃响应、零输入响应和零状态响应。由于运用数学工具进行求解,得出的结果仍为数学表达式,学生很难直观地认识系统的激励和响应之间的关联。在本虚拟实验系统中,可以对激励和响应进行仿真输出,这样使得我们对其具有实时性、直观性和逼真性认识和理解。     以二阶LTI连续时间系统为例,其微分方程为:         取C0=1,C1=7,C2=10,E0=1,E1=1,E2=2,系统的激励e(t)=2sin(πt),起始状态r(0)=-6/5,r’(0)=2,输入相应参数,系统输出仿真结果如图5所示。 4 结论     主要介绍了基于MATLAB的信号与系统虚拟实验系统的设计思路和方法,并对具体实例虚拟仿真实现。该系统的实现对信号与系统课程的理论教学起到很好的辅助作用,通过虚拟仿真实现,摆脱了抽象的数学公式,加深了对复杂理论的理解和掌握,并且系统操作简单快捷,大大地提高了实验教学效果。

    时间:2012-04-16 关键词: 系统 matlab 信号与系统 虚拟实验

  • matlab的BP神经网络例子程序

    1. BP神经网络的设计实例     例1. 采用动量梯度下降算法训练BP 网络。  训练样本定义如下:  输入矢量为      p =[-1 -2 3  1;-1  1 5 -3]  目标矢量为   t = [-1 -1 1 1]  解:本例的 MATLAB 程序如下:   close all   clear   echo on   clc   % NEWFF——生成一个新的前向神经网络   % TRAIN——对 BP 神经网络进行训练   % SIM——对 BP 神经网络进行仿真   pause          %  敲任意键开始   clc   %  定义训练样本   % P 为输入矢量   P=[-1,  -2,    3,    1;       -1,    1,    5,  -3];  % T 为目标矢量   T=[-1, -1, 1, 1];   pause;   clc   %  创建一个新的前向神经网络   net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm') %  当前输入层权值和阈值   inputWeights=net.IW{1,1}   inputbias=net.b{1}   %  当前网络层权值和阈值   layerWeights=net.LW{2,1}   layerbias=net.b{2}   pause   clc   %  设置训练参数   net.trainParam.show = 50;   net.trainParam.lr = 0.05;   net.trainParam.mc = 0.9;   net.trainParam.epochs = 1000;   net.trainParam.goal = 1e-3;   pause   clc   %  调用 TRAINGDM 算法训练 BP 网络   [net,tr]=train(net,P,T);   pause   clc   %  对 BP 网络进行仿真   A = sim(net,P)   %  计算仿真误差   E = T - A   MSE=mse(E)   pause   clc   echo off  例2. 采用贝叶斯正则化算法提高 BP 网络的推广能力。在本例中,我们采用两种训练方法,即 L-M 优化算法(trainlm)和贝叶斯正则化算法(trainbr),用以训练 BP 网络,使其能够拟合某一附加有白噪声的正弦样本数据。其中,样本数据可以采用如下MATLAB 语句生成:  输入矢量:P = [-1:0.05:1];   目标矢量:randn(’seed’,78341223);   T = sin(2*pi*P)+0.1*randn(size(P));   解:本例的 MATLAB 程序如下:   close all   clear   echo on   clc   % NEWFF——生成一个新的前向神经网络   % TRAIN——对 BP 神经网络进行训练  % SIM——对 BP 神经网络进行仿真   pause          %  敲任意键开始   clc   %  定义训练样本矢量   % P 为输入矢量   P = [-1:0.05:1];   % T 为目标矢量   randn('seed',78341223); T = sin(2*pi*P)+0.1*randn(size(P));  %  绘制样本数据点   plot(P,T,'+');   echo off   hold on;   plot(P,sin(2*pi*P),':');          %  绘制不含噪声的正弦曲线   echo on   clc   pause   clc   %  创建一个新的前向神经网络   net=newff(minmax(P),[20,1],{'tansig','purelin'});   pause   clc   echo off   clc  disp('1.  L-M 优化算法 TRAINLM'); disp('2.  贝叶斯正则化算法 TRAINBR');   choice=input('请选择训练算法(1,2):');   figure(gcf);   if(choice==1)                       echo on               clc               %  采用 L-M 优化算法 TRAINLM       net.trainFcn='trainlm';               pause               clc               %  设置训练参数               net.trainParam.epochs = 500;               net.trainParam.goal = 1e-6;               net=init(net);              %  重新初始化                 pause               clc  elseif(choice==2)               echo on               clc               %  采用贝叶斯正则化算法 TRAINBR               net.trainFcn='trainbr';               pause               clc               %  设置训练参数               net.trainParam.epochs = 500;               randn('seed',192736547);               net = init(net);              %  重新初始化                 pause               clc           end       例2. % 调用相应算法训练 BP 网络  [net,tr]=train(net,P,T);  pause  clc  % 对 BP 网络进行仿真  A = sim(net,P);  % 计算仿真误差  E = T - A;  MSE=mse(E)  pause  clc  % 绘制匹配结果曲线  close all;  plot(P,A,P,T,'+',P,sin(2*pi*P),':');  pause;  clc  echo off          通过采用两种不同的训练算法,我们可以得到两种拟合结果。图中的实线表示拟合曲线,虚线代表不含白噪声的正弦曲线,“+”点为含有白噪声的正弦样本数据点。显然,经 trainlm 函数训练后的神经网络对样本数据点实现了“过度匹配”,而经 trainbr 函数训练的神经网络对噪声不敏感,具有较好的推广能力。            值得指出的是,在利用 trainbr 函数训练 BP 网络时,若训练结果收敛,通常会给出提示信息“Maximum MU reached”。此外,用户还可以根据 SSE 和 SSW 的大小变化情况来判断训练是否收敛:当 SSE 和 SSW 的值在经过若干步迭代后处于恒值时,则通常说明网络训练收敛,此时可以停止训练。观察trainbr 函数训练 BP 网络的误差变化曲线,可见,当训练迭代至 320 步时,网络训练收敛,此时 SSE 和 SSW 均为恒值,当前有效网络的参数(有效权值和阈值)个数为 11.7973。  例3 采用“提前停止”方法提高 BP 网络的推广能力。对于和例 2相同的问题,在本例中我们将采用训练函数 traingdx 和“提前停止”相结合的方法来训练 BP 网络,以提高 BP 网络的推广能力。 解:在利用“提前停止”方法时,首先应分别定义训练样本、验证样本或测试样本,其中,验证样本是必不可少的。在本例中,我们只定义并使用验证样本,即有  验证样本输入矢量:val.P = [-0.975:.05:0.975]  验证样本目标矢量:val.T = sin(2*pi*val.P)+0.1*randn(size(val.P))          值得注意的是,尽管“提前停止”方法可以和任何一种 BP 网络训练函数一起使用,但是不适合同训练速度过快的算法联合使用,比如 trainlm 函数,所以本例中我们采用训练速度相对较慢的变学习速率算法 traingdx 函数作为训练函数。 本例的 MATLAB 程序如下:  close all  clear  echo on  clc  % NEWFF——生成一个新的前向神经网络  % TRAIN——对 BP 神经网络进行训练  % SIM——对 BP 神经网络进行仿真  pause  % 敲任意键开始  clc  % 定义训练样本矢量  % P 为输入矢量  P = [-1:0.05:1];  % T 为目标矢量  randn('seed',78341223);  T = sin(2*pi*P)+0.1*randn(size(P));  % 绘制训练样本数据点  plot(P,T,'+');  echo off  hold on;  plot(P,sin(2*pi*P),':'); % 绘制不含噪声的正弦曲线  echo on  clc  pause  clc  % 定义验证样本  val.P = [-0.975:0.05:0.975]; % 验证样本的输入矢量  val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)); % 验证样本的目标矢量  pause  clc  % 创建一个新的前向神经网络  net=newff(minmax(P),[5,1],{'tansig','purelin'},'traingdx'); pause  clc  % 设置训练参数  net.trainParam.epochs = 500;  net = init(net);  pause  clc  % 训练 BP 网络  [net,tr]=train(net,P,T,[],[],val);  pause  clc  % 对 BP 网络进行仿真  A = sim(net,P);  % 计算仿真误差  E = T - A;  MSE=mse(E)  pause  clc  % 绘制仿真拟合结果曲线  close all;  plot(P,A,P,T,'+',P,sin(2*pi*P),':');  pause;  clc  echo off           下面给出了网络的某次训练结果,可见,当训练至第 136 步时,训练提前停止,此时的网络误差为 0.0102565。给出了训练后的仿真数据拟合曲线,效果是相当满意的。 [net,tr]=train(net,P,T,[],[],val);  TRAINGDX, Epoch 0/500, MSE 0.504647/0, Gradient 2.1201/1e-006  TRAINGDX, Epoch 25/500, MSE 0.163593/0, Gradient 0.384793/1e-006  TRAINGDX, Epoch 50/500, MSE 0.130259/0, Gradient 0.158209/1e-006  TRAINGDX, Epoch 75/500, MSE 0.086869/0, Gradient 0.0883479/1e-006  TRAINGDX, Epoch 100/500, MSE 0.0492511/0, Gradient 0.0387894/1e-006  TRAINGDX, Epoch 125/500, MSE 0.0110016/0, Gradient 0.017242/1e-006  TRAINGDX, Epoch 136/500, MSE 0.0102565/0, Gradient 0.01203/1e-006  TRAINGDX, Validation stop.

    时间:2019-07-10 关键词: matlab bp神经网络

  • 基于Matlab的一种小型温度检测系统

    1 前言 温度是表征环境的一个重要的参数。在工程领域,尤其像工程热力学等,温度检测非常普遍,对温度精确测量以便实时控制也显得尤为重要。 在控制系统中,上位机与下位机之间实现通信的方法和应用平台很多。目前,以VB和VC开发的通信软件较多,然而,这类软件虽然功能完善,但是数据采集到计算机后要进行各种处理(例如滤波,系统辨识,曲线拟合等)就显得不方便,编程比较复杂。Matlab具有强大的数据处理能力及功能丰富的工具箱,被广泛的应用于信号处理、自动控制等领域[1]。它编程语言简单易学,利用简单的命令就可以代替复杂的代码,极大地提高了开发效率。 本实验基于Matlab环境下设计了一个小型温度检测系统,下位机使用AT89S51单片机和DS18B20完成温度数据采集,上位机在Matlab环境下,调用设备控制箱serial类操作RS-232串口,用串行通信方式交换数据,进而借助Matlab对数据进行分析和处理,得到了温度随时间变化的函数解析式,同时介绍了基于Matlab环境下PC机与单片机串行通信的实时数据处理的实现方法。 2 系统总体设计 图1 系统结构图 温度检测系统的整体结构如图1所示。PC机串口与单片机USART口通过MAX232电平转换芯片相连,构成一个主从式通信系统。系统工作时,单片机对串口和DS18B20初始化,在读取温度的同时等待中断。PC机通过调用Matlab设备控制工具箱中的serial类及相关函数来创建串口设备对象,并以读写文件的方式实现对PC机串行口的访问,PC机通过Matlab向串行口发送特殊指令从而触发单片机中断系统,单片机调用中断服务例程,读取即使温度并将采集的数据通过串行口回送给PC机。此时,Matlab通过查询的方式,实时接收单片机发送的数据,并完成对数据的分析处理及图形显示。 3 下位机部分 下位机部分由AT89S51单片机和DS18B20温度传感器构成,主要负责温度数据的采集工作,并通过串行通信实时地将数据传送到上位机进行处理,PC机与MUC串口通信技术相对而言已经比较成熟。 3.1串行通信协议 串口通信协议SPCP(Serial Port Communication Protocol)设计思想是基于帧传输方式,在本实验中,设定字符格式为1个起始位,8个数据位和一个停止位,无奇偶校验,中间8位即为有效数据,波特率设置为9600,为保证数据可靠传输,在传送数据前通过握手建立连接,软件握手协议规定如下: 上位机发送握手信号0xff给下位机,下位机如果接受到上位机的信号为握手信号,则回送数据包给上位机,其中第一个数据为握手信号,以二个数据为温度传感器采集到的温度数据,此时,上位机如果接受到的第一个数据不是握手信号,则丢弃该数据包,若是,则表示握手成功,直接存储第二个数据。 3.2温度数据采集(DS18B20) 本系统中采用DALLAS生产的“一线总线”可编程数字化温度传感器DS18B20,与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,在使用中不需要任何外围元件,设计可用数据线供电,简化系统的硬件,同时支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温,使用起来非常方便。尽管如此,DS18B20是以牺牲软件资源换取硬件资源的,由于采用单总线数据出数方式,DS18B20的数据I/O均由同一根线完成,因此,对读写的操作时序要求非常严格。 根据DTASHEET,对DS18B20的编程主要注意以下几个方面: 1,精确延时问题[2]:为了保证DS18B20的严格时序,可以将延时分为2种:10us以下的短延时和10us以上的长延时。短延时可以使用C51提供的内部函数_nop_()来实现,一个nop()函数相当于一条DJNZ汇编指令,约2us;长延时主要有15us,90us,270us,540us等,这些延时均为15us的整数倍,一次可以使用nop()函数编写一个延时15us的函数delay15(n)。 2,基本操作:DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输。对DS18B20 进行所有的读写操作都是从初始化开始的,主要分为初始化操作,读操作和写操作。 基于以上分析,对DS18B20的编程源码如下: Init_DS18B20(void) //初始化函数 {DQ = 1; //DQ复位 Delay15(1); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay15(32); //精确延时 大于 480us DQ = 1; //拉高总线 Delay15(6); //延时90us x=DQ; //读存在脉冲 delay15(20); //延时约270us } Write_DS18B20(unsigned char dat)//写一个字节 { unsigned char i="0";//定义循环变量 for (i=0; i<8; i++) { DQ = 0; //复位 DQ = dat&0x01;//取数据的第i位并送出 Delay15(1);//延时 DQ = 1; //停止 dat>>=1;//右移 } } Read_DS18B20(void)//读一个字节 { unsigned char i="0"; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 复位 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80;//取位脉冲并存入dat delay15(1);//延时 } return(dat); } 4 上位机部分(PC) 上位机通过串口向下位机发送命令实现对下位机的控制,并实时地接受下位机传送过来的数据,对其分析处理,将结果用图形显示并存储,完成人机交互过程。 Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrument Control Toolbox中的serial类函数来创建串口对象,对串口对象操作就是对串口操作,使用起非常方便。同时,Matlab封装的串口对象支持对串口的异步读写操作,使得计算机在读写串口时能同时进行其他处理工作,因而能大大提高计算机执行效率。Matlab用多线程技术实现这种异步操作,通过异步读写设置,计算机在执行读写串口函数时能立即返回不必等待串口把数据传输完毕, 当指定的数据传输结束时就触发事件,执行事件回调函数,可以在事件回调函数中编程,进行数据处理,这样就不会造成因等待串口传输数据引起的时间浪费。 4.1 Matlab下串口编程 MATLAB的Instrument Control Toolbox提供了 MATLAB与仪器仪表通信的功能 ,它支持 GPIB 通用接口总线 、VISA、TCP/ IP、UDP、RS2232等多个协议 ,具有同步和异步读写功能以及事件处理和回调操作功能,可读写和记录二进制和ASCII文本数据。与串口有关的主要函数如下[3]: (1)建立串口对象函数:obj=seril(’port’,’property name’,propertyvalue……),其中主要的属性有:baudrate(波特率),databits(数据位),parity(校验方式),stopbits(终止位)等,可以在初始化时进行赋值或者使用set函数。 (2)打开串口设备对象:fopen(obj) (3) 串口读写操作:当matlab通信数据采用二进制格式时,读写串口设备的命令为fread()和fwrite();当通行数据采用文本(ASCII)格式时,读写串口设备的命令为fscanf()和fprintf()。 (4)关闭并清除设备对象: Fclose(obj);%关闭串口设备对象 Delete(obj);%删除内存中的串口设备对象 基于本系统串口通信协议,对串口对象的读写部分程序如下: Obj=serial(’com1’,’baudrate’,9600,’parity’,’none’,’databits’,8,’stopbits’,1);%初始化串口 Fopen(obj);%打开串口对象 Fwrite(obj,256);%向串口发送握手信号0xff TMP=fread(obj,3,’unit8’);%从串口读取3字节数据,后2个即是16bit温度数据 If TMP(1)= =256 %判断第一个字节受否是握手信号 For i = 1:3 Dat(i)=TMP(i+1);%剔除第一个握手信号字节 End End Fclose(obj);%关闭串口设备对象 Delete(obj);%删除内存中的串口设备对象 4.2 Matlab数据分析 单片机一般能处理简单的8位无符号数的四则运算,而DS18B20可以程序设定9~12位的分辨率,精度可达±0.5℃,温度以16bit带符号位扩展的二进制补码形式读出,如果使用单片机进行快速的实时处理则比较费力,同时单片机还要与DS18B20及上位机通信,系统资源也比较紧张。因而可以将读取的16bit温度数据直接送往PC机,由上位机来完成。Matlab强大的计算能力和绘图功能给数据分析带来了极大的方便,这不仅可以合理利用系统资源,也使得系统的通信过程更流畅。 图2所示的是用DS18B20测得的连续10个温度数据的变化曲线图。使用max()和min()函数可以求出温度的极大极小值,调用polyfit()函数还可以进行最小二乘回归分析与曲线拟合,进而求出温度变化的解析式,本实验中使用二阶拟合后,得到的温度随时间变化的函数解析式为:F(T)= 0.0125*T2 - 0.0145T+27.3083. 5 结语 Matlab是一款在控制领域应用十分广泛的软件,本实验基于Matlab环境下PC机与单片机实时通信及数据处理的方法,设计了一个小型温度检测系统,串口通信使用Matlab编程,极大的提高了开发效率,充分利用了Matlab的强大的数据分析能力,得到了温度随时间变化的函数解析式,取得了较好的效果,扩展了Matlab的使用范围,具有一定实用性。 本文作者创新观点:使用DS18B20传感器简化了硬件结构,采用Matlab编程,充分利用其数据分析能力,合理利用系统资源,提高了开发效率,扩展了Matlab的使用范围。 参考文献: [1] 赵云鹏.MATLAB串口通信在数据采集中的应用.[J]微计算机信息.2006,22(1):111~112 [2] 顾振宇.刘鲁源,杜振辉.DS18B20接口的C语言程序设计.[J] 单片机与嵌入式系统应用.2005 .12(6):22~24 [3] 向先波,徐国华. Matlab环境下PC机与单片机的串行通信及数据处理.[J] 单片机与嵌入式系统应用.2004 .12:27~31 [4] 李群芳, 张士军,黄建. 单片微型计算机与接口技术(第二版). [M].电子工业出版社.2005

    时间:2012-07-24 关键词: 系统 matlab 温度检测

  • Matlab:如何读取CSV文件以及如何读取带有字符串数据项的CSV文件

    CSV,逗号分开的文件,如果能快速的读取这些文件中的数据,无疑会帮助我们解决很多问题。 1、 只有数据的CSV文件,CSV file that includes only numbers. As an example, create a text file, named as 'data.csv' if you prefer, which includes the following data with any editor you like.1,  2,  3,  4 5,  6,  7,  8 9,  0,  1,  2   1) Read all the data into a 3X4 matrix.Mat = csvread('data.csv'); disp(Mat);  2) Read part of the data with specification of the start index. What is important is the data is accessed from index 0 in the direction of row and column.Mat = csvread('data.csv', 1, 2); disp(Mat);Result showing below.7     8 1     2  3) Read only the specified range. Mat = csvread('data.csv', 0, 1, [0,1,2,2]); disp(Mat);Note the starting index you specified in the second and third parameters is the same with the first two arguments in the fourth parameter matrix. 2、 How to read a CSV file containing string data items. Create a file, named as 'datastr.csv' if you like. Add the following data. 1, 2, 3, Mine 4, 5, 6, Yours 7, 8, 9, HisOne who try to use csvread shall encounter frustration. :( I propose another solution to solve this case. fid = fopen('datastr.csv'); dcells = textscan(fid, '%f, %f, %f, %s'); fclose(fid); dcellneeds = dcells(1:3); Mat = cell2mat(dcellneeds); disp(Mat);The result showing below.1     2     3 4     5     6 7     8     9Try it and good luck. :)

    时间:2019-07-08 关键词: matlab csv

  • [Matlab]技巧笔记

    1、将字符串作为Matlab命令执行md = 'dir'; eval(md);2、将字符串作为系统命令执行md = 'dir'; system(md);3、使显示图像的坐标轴使用相同的度量单位axis equal这个网址可以看到axis equal,axis image, axis fill等的区别。4、使得显示的图形中没有坐标显示set(gca, 'xtick', []); set(gca, 'ytick', []);5、使用不同的颜色索引doc colormap6、设置坐标显示范围axis([0 2 0 2]);7、将figure保存成eps图像时,带彩色saveas(gcf, 'ttt.eps', 'psc')使用 doc saveas 查看更多关于eps颜色设置的说明。8、生成多维高斯随机向量序列R=mvnrnd(MU,SIGMA)

    时间:2019-07-08 关键词: matlab

  • Matlab:如何查找给定目录下的文件

    我们有很多目录,每个目录下都有些有用的文件,比如图像文件,如何自动的扫描这些文件呢?可以使用dir函数来完成这个任务。比如假设给定目录 baseDir,它是一个字符串,包含的是某个目录,例如'./Data/'现在我们的问题转化成了,如何扫描Data目录下的文件。假设Data目录下有N001.m和N002.m,还有其它目录baseDir = './Data/'; contains = dir(baseDir); for k = 1:length(contains)     if (contains(k).isdir)         continue;     end     disp(contains(k).name); end执行上面的程序,就会看到了,只有那两个文件显示。了解更多:> doc  dir

    时间:2019-07-08 关键词: matlab

  • 如何使用Matlab产生对称矩阵

    有时候做实验需要使用对称矩阵,这里介绍如何使用Matlab产生随机的对称矩阵。用例子说明一下:我要产生4X4的随机矩阵,要求是对称矩阵。产生对称矩阵A = rand(4); B = tril(A,-1)+triu(A',0);方法一:B是A的下三角矩阵改造的对称矩阵A = rand(4); B = triu(A,0) + tril(A',-1);方法二:B是A的上三角矩阵改造的对称矩阵验证对称矩阵只需要这样验证:sum(sum(B==B'))==numel(B)只要上面的代码输出结果是1就对了附带一个5X5的实对称正定矩阵    2.1012,0.1300,-1.6081,-1.1935,0.3851,     0.1300,0.6209,-0.2666,-0.3431,-0.5251,     -1.6081,-0.2666,2.6402,1.0969,-0.5009,     -1.1935,-0.3431,1.0969,3.3753,-0.6894,     0.3851,-0.5251,-0.5009,-0.6894,1.5310

    时间:2019-07-08 关键词: matlab 对称矩阵

  • MATLAB 2017a \b、2016a\b等高版本,打开函数帮助文档需要登录MATHworks账户且需要绑定产品

    MATLAB 2017a \b、2016a\b等高版本,打开函数帮助文档需要登录MATHworks账户且需要绑定产品

    我们MATLAB 2017a b、2016ab等高版本,打开某些函数帮助文档时,在帮助浏览器界面会跳出需要登录MATHworks账户的提示:“To access this documentation, you must be associated with a license or trial.To view this documentation, log in to your MathWorks Account.”登录MATHworks账户之后,且需要绑定产品许可证号,如下图:解决方法:1、点击帮助浏览器设置按钮:2、选择文档位置  安装在本地即可

    时间:2019-07-08 关键词: matlab

  • MATLAB Support Package for Arduino Hardware 安装当中的一些问题

    纠结于matlab和arduino的联姻已经好久了,下面介绍两种办法。 第一种: 第一种相对比较简单。直接下载一个arduino和matlab的兼容包,名字叫做ArduinoIO,http://pan.baidu.com/s/1qYQlLQO,解压之后里面有readme和几个文件夹,英文比较好的可以稍微看一下,里面有对这个兼容包的介绍,英文不好的也没关系,主要有用的就是下面这一部分: The following sketches are provided with the package: -) adio.pde     : analog and digital IO, plus basic serial commands only -) adioe.pde    : adio.pde + encoders support -) adioes.pde   : adioe.pde + servo support -) motor_v1.pde : adioes.pde + afmotor v1 shield -) motor_v2.pde : adioes.pde + afmotor v2 shield 由上往下走功能依次提升,对速度没有要求的可以直接烧写第三个就行,直接第五个也ok,(我用的是第三个,因为目前还不玩儿舵机),把adioes.pde通过arduinoIDE烧进arduino里面,插上usb,打开matlab然后定义接口,a=arduino('COM3');其中'COM3'为接口的名字,可以根据自己的电脑接口的不同而改变。matlab当中显示串口成功连接之后就可以直接在matlab之中进行编程,把arduino当做执行机进行操作了。 第二种: 第二种是在matlab当中直接下载Support Package for Arduino Hardware安装包,然后进行安装。其中在2011a-2013b之间的版本里面只有针对simulink forardunio的安装包,2014a以上的就有matlab和simulink的两种的兼容安装包。 如果你的网速比较好而且能够直接翻墙国外网站的话那就比较简单了,直接参考视频http://v.youku.com/v_show/id_XMTMxNzk1MDU3Mg==.html就能解决您的问题。或者直接下载这个兼容包安装引导程序,直接拖进matlab的命令窗口就行了,链接:http://pan.baidu.com/s/1cwmkjG 密码:ptye。如果您的网速不好(硬伤),或者不会翻墙的,也没关系,这里提供2015b的安装包,里面有matlab和simulink的,在网盘上下载就行了,链接:http://pan.baidu.com/s/1jH64X9c 密码:ofrn。把download文件放到matlab的安装文件夹下面,然后再窗口选择get hardware package 就可以进行下一步的操作了,接下来选择downloads文件夹,如果说找不到则可以依次选择arduino_download,,arduinoio_download分别进行安装。  总结:安装的过程中会有好多的小问题,要有耐心,慢慢的就会了,如果有什么问题可以及时的进行交流。 这里有一个网络安装不成功的帖子,有兴趣的同志可以看一下,有问题也欢迎交流! 

    时间:2019-06-11 关键词: Arduino matlab

  • 在MATLAB环境中调用DLL对硬件资源访问的方法

    摘要:MATLAB是一款高性能的科学与工程计算软件,具有强大的数值计算和分析能力,但其对硬件的访问能力较弱。在MATLAB环境中实现对硬件资源的直接访问可以极大的方便对数据的处理及算法的验证,基于这种目的提出一种扩展MATLAB访问硬件的方法,通过MATLAB外部函数接口调用第三方器件商提供的动态链接库导出函数,在MATLAB平台下实现对一般硬件的访问,并具体介绍了该方法在气压高度计原型系统设计中的应用。该方法简化了MATLAB与硬件的数据交互,对于原型系统设计和算法的验证提供了一种有效的手段。 关键词:MATLAB;动态链接库;硬件访问;数据采集     MATLAB是美国MathWorks公司开发的高性能的科学与工程计算软件,凭借其强大的科学计算和绘图功能、大量稳定可靠的算法库和简洁高效的编程语言,被科技工作者们广泛应用于自动控制、数学运算、信号分析、图像处理等各行各业。尽管MATLAB本身是一个完整的、自成体系的编程和数据处理环境,但由于语言的特性使其访问硬件的能力相对较差,这在一定程度上限制了它的使用。对于那些涉及复杂算法同时又需要对硬件资源进行访问的系统,一般的做法是在一个通用的编程平台(如Visual C++、Visual Basic、Delphi等)上实现对硬件资源的访问,而后调用MATLAB算法对数据进行处理。这种方法优点是通用性好,程序运行效率高,适用大多数场合,但对开发人员编程能力有较高要求,开发周期较长。在一些需要快速的验证模型和算法的场合,为充分发挥MATLAB强大的数值计算能力,以MATLAB作为主开发平台来得更为合适。随着模块化的设计思想在越来越多的产品中得到体现,器件生产厂商们一般都会提供该产品的二次开发函数库,方便了开发者们对硬件操作的同时,也使得MATLAB通过外部程序接口实现对硬件的访问成为可能。     文中具体论述一种基于动态链接库调用实现MATLAB访问一般硬件的方法,并将该方法用于对高精度气压传感器MS5803的数据采集,实现了MATLAB与硬件的无缝结合,极大的方便了数据的后续处理。 1 动态链接库     在具体阐述MATLAB环境下调用动态链接库函数访问外部硬件之前,有必要对动态链接库做简要介绍。动态链接库英文为Dynamic Linka ble Library,缩写DLL,最初是为了解决代码共享的问题而提出的.通俗的理解可以把DLL看成一种仓库,它提供一些可以直接拿来使用的变量、函数或类。动态链接库可以使用不同编程语言来编写,只要符合标准即可。为了加深对动态链接库函数调用的理解,下面以C/C++语言为例简要介绍动态链接库的编写步骤。首先介绍两组关键字:     1)_declspec(dllimport)     这组关键字表示从DLL中导入函数或者数据,一般用在DLL对应的头文件中。     2)_declspec(dllexport)     这组关键字表示从DLL中导出函数或者数据,一般用在DLL对应的工程文件中。     编写动态链接库函数的方法与编写一般函数的方法基本相同,只不过要对库中的可导出函数进行必要的申明。下面以VC环境下一个最简单的DLL工程dll_test进行说明,工程包含dll_test.h和dll_test.cpp两个文件。         编译上述dll_test工程即可得到动态链接库dll_test.dll(在Debug或Release目录下),此动态链接库实现了add和sub函数的功能。在解决一些实际问题过程中,有时会遇到只有DLL而没有与之相对应的头文件的情况,而MATLAB在调用DLL文件中的函数之前,必须具备头文件中的函数声明才行,这样根据上述DLL的编写规范可以很容易的编写出与所调用的DLL相对应的头文件。 2 MATLAB调用C/C++动态链接库     从Matlab6.5(R13)起,Matlab提供了对动态连接库DLL文件的接口。利用这个接口,可以在Matlab中调用动态连接库导出的函数。MAT LAB加载和使用动态链接库函数仅通过7~8个函数就可以实现,只要掌握这些函数的使用方法,就掌握了加载和应用动态链接的基本方法,从而可以在MATLAB平台下轻松实现对硬件的访问。     利用MATLAB共享库接口实现对外部DLL库的调用主要有以下几个步骤。     1)加栽动态链接库文件 在使用动态链接库之前,必须将所需的动态链接库加载到MATLAB工作空间中,之后MATLAB才能调用动态库中的函数。函数lodalibrary用于加载动态链接库,其使用语法如下:     loadlibrary(‘shdib’,‘hfile’)     loadlibrary函数有两个输入参数,参数shrlib表示库文件的名称,参数hfile为对应库的C语言头文件,C语言的头文件用于向MATLAB提供基本的函数说明。下面以一示例说明loadlibrary的用法,在命令提示窗口中输入如下命令:     >>loadlibrary(‘dll_test’,‘dll_test.h’)        (1)     通过以上命令即将dll_test.dll加载到MATLAB工作空间中。     2)浏览动态库中的函数     成功加载动态链接库后便可调用库中提供的函数。与函数使用类似,在调用函数之前首先要明确函数各输入输出参数的含义及数据类型。一般情况下动态库编写者会提供相应函数的帮助文档,以便用户理解函数的含义并对其进行调用。动态链接库大多使用C或者C++语言编写,然而标准的C或C++数据类型与MATLAB所使用的数据类型不尽相同,因此调用函数前首先要弄清被调用函数参数对应于MATLAB环境下的数据类型。使用函数libfunctions可在MATLAB环境下查看动态库中函数的声明,并将原C函数中参数类型以对应MATLAB参数类型显示,之后便能正确的按照MATLAB语法规则进行调用。libfunctions用法如下:     libfunctions(‘libname’,‘-full’)     参数libname为已加载到MATLAB工作空间的动态库文件名,-full为可选参数用于输出函数的详细说明。     >>libfunctions(‘dll_test’,‘-full’)              (2)     输入语句(2)后命令行中会显示所有dll_test库中的函数,如下:     Functions in library dll_test:     int32 add(int32,int32)     int32 sub(int32,int32)     3)调用动态库中的导出函数     明确了动态库中函数的参数类型后,便可利用MATLAB提供的calllib接口函数对库中函数进行调用。calllib函数使用方法如下:     [x1,…,xN]=calllib(‘libname’,‘funcname’,arg1,…,argN)     参数libname表示被调用函数所在的库文件名,funcname为被调用的函数名称,arg1,…,argN为函数funename的输入参数,x1,…,xN为函数funcname的返回值。以下为dll_test.dll中add函数的调用示例:     >>calllib(‘dll_test’,‘add’,1,2)     ans=        3     4)卸载动态链接库     当不再需要对动态库中的函数进行访问后,应及时将动态库从MATLAB工作空间中卸载。与加载动态库类似MATLAB也提供对应的卸载动态库的命令unloadlibrary,例如:     >>unloadlibrary(‘dll_test’)     通过以上4步便可实现在MATLAB环境下对动态链接库导出函数的调用。在实际应用中通过调用硬件商提供的动态链接库或者将其提供的API函数编译为动态链接库,便可实现在MATLAB平台下实现对硬件资源的访问。 3 用MATLAB实现传感器的数据采集     MS5803是瑞士Intersema公司生产的一款集成有压阻式压力传感器和ADC接口的SMD混合集成电路,具有体积小(6.2x6.4 mm)、稳定性好、低功耗(1μA)、高分辨率、高精度等特点,其内置的24位A/D转换器可实现对压力和温度的采样,通过标准I2C和SPI接口与外部设备通信。本设计以MATLAB为软件开发平台,MS5803为目标器件,通过DLL调用方式实现对传感器的数据采集,并对气压高度算法进行快速测试与验证。气压高度计的原型系统结构框图如图1所示。     图1中GY7502为USB转SPI适配器,一端与笔记本相连,另一端与MS5803连接,MS5803选择工作在SPI接口模式。该原型系统通过一个简单的接口适配器便建立了PC与传感器的连接,之后即可按照一定的通信规则进行编程完成对MS5803数据采集,轻松的实现了数据由目标器件到上位机的传输,后续借助于PC强大的运算功能快速的对算法和模型进行测试。     下面以MATLAB环境下实现对MS5803数据的采集为例,具体介绍前述关于扩展MATLAB硬件访问能力的方法。     GY7502型USB-SPI适配器以动态链接库的方式提供了开发所需的接口函数并提供了各功能函数的头文件定义,开发者只需要熟悉各个接口函数的定义及其功能便能方便的实现对SPI接口器件的操作,而无需关注底层硬件的具体实现。以下为本设计中使用到了库函数声明。     pGY7502_CONFIG_INFO和pGY7502_DATA_INFO为GY7502.h定义的两种结构体数据类型分别用于配置GY7502适配器工作模式和作为接收或发送数据的缓存。     MS5803在出产的时候生产厂商已经对其进行了初始标定,并将标定系数C1~C6固化在内部的128位PROM中,传感器采样转换输出的原始数据D1和D2需要经过系数C1~C6按照MS5803数据手册提供的模型进行修正,才能计算出真实意义上的压力值和温度值。为此传感器每次上电后系统需要先读取出系数C1~C6,之后才能进行压力和温度的采样,基本工作流程如图2所示。     下面给出在MATLAB环境下通过调用动态链接库的方法实现传感器数据采集的关键程序段。         完成数据采集之后,便可进行压力与高度换算。由于数据直接引入到MATLAB工作环境,借助于MATLAB强大的数值计算功能,极大地方便了后续算法及模型的测试工作,同时也降低了开发者的工作强度。 4 结论     MATLAB强大的数值计算能力深受广大科技工作者的喜爱,但其对硬件的支持能力相对较弱。文中通过调用动态链接库的方法,增强了MAT LAB对硬件的访问能力,使得开发者可以在MATLAB环境下直接对硬件进行操作,极大地方便了系统算法和模型的测试。

    时间:2013-07-24 关键词: 环境 matlab 访问 dll

  • matlab  的plot

    matlab 的plot

    1.    plot(x) 当x 为一向量时,以x 元素的值为纵坐标,x 的序号为横坐标值绘制曲线。当x 为一实矩阵时,则以其序号为横坐标,按列绘制每列元素值相对于其序号的曲线例如:此处用  x=0:pi/20:2*pi;  y1=sin(x);  plot(x,y1); 2.       1, plot(x,y) 以x 元素为横坐标值,y 元素为纵坐标值绘制曲线。   2,plot(x,y1,x,y2,…)以公共的x 元素为横坐标值,以y1,y2,… 元素为纵坐标值绘制多条曲线。 x=0:pi/20:2*pi; y1=sin(x); y2=cos(x); plot(x,y1,x,y2); 3.    可以在画的图像中添加栅格,用命令grid on,这样可以方便你对齐某条线或是对比比较方便,看下图可以上图对比,看下有什么不同,测试代码如下: x=0:pi/20:2*pi; y1=sin(x); y2=cos(x); plot(x,y1,x,y2); grid on 4.    添加坐标轴信息,这样做可以很快的让人明白你在做什么,测试代码如下 x=0:pi/20:2*pi; y1=sin(x); y2=cos(x); plot(x,y1,x,y2); grid on xlabel('变量 X') ylabel('变量 Y1 & Y2') 5.    除了坐标轴信息外还可以添加其它的信息,如所画曲线的信息等:测试代码如下 x=0:pi/20:2*pi; y1=sin(x); y2=cos(x); plot(x,y1,x,y2); grid on xlabel('变量 X') ylabel('变量 Y1 & Y2') title('正弦余弦波形')    %添加图像标题 text(1.5,0.3,'cos(x)')   %将cosx这个注解加到坐标中的某个位置 gtext('sin(x)')      % 用鼠标的光标定位,将sinx这个注解放在你鼠标点击的地方功能二维曲线绘图语法plot(Y) plot(X1,Y1,…) plot(X1,Y1,LineSpec,…) plot(…,’PropertyName’,PropertyValue,…) plot(axes_handle,…) h = plot(…) hlines = plot(‘v6’,…)描述plot(Y)如果Y是m×n的数组,以1:m为X横坐标,Y中的每一列元素为Y坐标,绘制n条曲线;如果Y是n×1或者1×n的向量,则以1:n为横坐标,Y为坐标表绘制1条曲线;如果Y是复数,则plot(Y)等效于plot(real(Y),imag(Y));其它使用情况下,忽略坐标数据中的虚部。plot(X1,Y1,…)如果X和Y都是数组,按列取坐标数据绘图,此时它们必须具有相同的尺寸;如果X和Y其中一个是向量另一个为数组,X和Y中尺寸相等的方向对应绘制多条曲线;如果X和Y其中一个是标量另一个为向量,那么将绘制垂直X或者Y轴离散的点。  plot(X1,Y1,LineSpec,…)通过参数LineSpec指定曲线的曲线属性,它包括线型、标记符和颜色。plot函数支持同时绘制任意组图形plot(X1,Y1,LineSpec1,X2,Y2,LineSpec2,…)此时完全等效于plot(X1,Y1,LineSpec1,…)hlod allplot(X2,Y2,LineSpec2,…)MATLAB中提供的线型属性有:  需要说明的是,LineSpec中设置曲线线型、标识符和颜色三项属性时,控制符的顺序不受限制并可以省略或者部分省略。也就是说’r-.*’、’-.r*’、’*-.r’等形式是等效的,都表示使用红色点划线连接各个节点,各节点使用“*”标识。plot(…,’PropertyName’,PropertyValue,…)设置由plot创建的所有曲线句柄对象的属性,Line对象属性和属性值参见附录,具体设置参考下面的实例,当然可以使用set/get进行设置。plot(axes_handle,…)指定坐标系,也就是在axes_handle坐标系中绘图,在没有指定时默认为gca。h = plot(…)返回由plot创建的所有曲线句柄对象的句柄。每条曲线对应一个句柄,如果有n条曲线,则h为n×1的数组。注意在同时绘制多条曲线时,如果没有指定曲线属性,plot按顺序循环使用当前坐标系中ColorOrder和LineStyleOrder两个属性。默认情况,MATLAB在每次调用plot函数时将ColorOrder和LineStyleOrder自动重置为DefaultAxesColorOrder和DefaultAxesLineStyleOrder。Default**属性我们可以自定义,有效期至MATLAB关闭,Matlab下次启动时将Default**属性重置为厂家设置(Factory)set(0,’DefaultAxesColorOrder’,’r|g|b|k’,…’DefaultAxesLineStyleOrder’,’-|-.|–|:’)使用holdall命令可以阻止调用plot函数时自动重置ColorOrder和LineStyleOrder属性,而是循环使用。注意hold on只是使多次绘制的图形叠加(相当于NextPlot),但不能阻止属性重置。另外我们可以通过下面四个属性设置标识符的颜色和大小LineWidth——指定线宽MarkerEdgeColor——指定标识符的边缘颜色MarkerFaceColor——指定标识符填充颜色MarkerSize——指定标识符的大小注意上面四个属性是针对当前坐标系中所有曲线的实例X=1:10; % 两个都是数组,必须具有相同的尺寸 X1=[X;X;X]’;%10×3 Y1=rand(10,3)+1;%10×3% 其中一个为向量,另一个为数组,自动匹配尺寸相等方向 X2=1:0.1:10;%1×91 Y2=[sin(X2);cos(X2)]’;%91×2% 其中一个是标量,另一为矢量,绘制垂直坐标轴的离散点 X3=1:10; Y3=-0.5; fh=figure(‘numbertitle’,’off’,’name’,’PLOT Usability Demo’);%创建figure对象 ah=axes;%创建axes对象 h=plot(…%返回所有曲线句柄 ah,…%指定坐标系,可以省略,此时默认gca X1,Y1,…%坐标数据 ‘-.^’,…%曲线属性,可以省略或部分省略,此时自动选择 X2,Y2,… ‘m-‘,… X3,Y3,… ‘o’,…%注意此组数据设置线型和颜色无效,因为默认绘制离散点 ‘LineWidth’,2,…%线宽 ‘MarkerEdgeColor’,’k’,…%标识符边缘颜色 ‘MarkerFaceColor’,’r’,…%标识符填充颜色 ‘MarkerSize’,8)%标识符大小

    时间:2019-06-14 关键词: matlab

  • MATLAB做两个figure

    MATLAB做两个figure

    matlab使用figure(1), figure(2)...可以作出多幅图。示例如下:1 2 3 4 5 6theta=linspace(0,2*pi,400);rou=4*sin(2*theta);figure(1)polar(theta,rou);figure(2);ezplot('x^(2/3)+y^(2/3)-2^(2/3)')

    时间:2019-07-04 关键词: matlab

  • 快速傅里叶变换(FFT)结果的物理意义是什么?(附Matlab程序)

     FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。 虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什么意思、如何决定要使用多少点来做FFT。 现在就根据实际经验来说说FFT结果的具体物理意义。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此罗嗦了。 采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。 假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。 假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流分量,幅度即为A1/N。 由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。 好了,说了半天,看着公式也晕,下面以一个实际的信号来做说明。 假设我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下: S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180) 式中cos参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?我们来看看FFT的结果的模值如图所示。 FFT的结果 从图中我们可以看到,在第1点、第51点、和第76点附近有比较大的值。我们分别将这三个点附近的数据拿上来细看: 1点: 512+0i 2点: -2.6195E-14 - 1.4162E-13i 3点: -2.8586E-14 - 1.1898E-13i 50点:-6.2076E-13 - 2.1713E-12i 51点:332.55 - 192i 52点:-1.6707E-12 - 1.5241E-12i 75点:-2.2199E-13 -1.0076E-12i 76点:3.4315E-12 + 192i 77点:-3.0263E-14 +7.5609E-13i 很明显,1点、51点、76点的值都比较大,它附近的点值都很小,可以认为是0,即在那些频率点上的信号幅度为0。接着,我们来计算各点的幅度值。分别计算这三个点的模值,结果如下: 1点: 512 51点:384 76点:192 按照公式,可以计算出直流分量为:512/N=512/256=2;50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来的幅度是正确的。 然后再来计算相位信息。直流信号没有相位可言,不用管它。先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再计算75Hz信号的相位,atan2(192, 3.4315E-12)=1.5708弧度,换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。根据FFT结果以及上面的分析计算,我们就可以写出信号的表达式了,它就是我们开始提供的信号。 总结:假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以N);该点的相位即是对应该频率下的信号的相位。相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,这在一些实际的应用中是不现实的,需要在较短的时间内完成分析。解决这个问题的方法有频率细分法,比较简单的方法是采样比较短时间的信号,然后在后面补充一定数量的0,使其长度达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。具体的频率细分法可参考相关文献。 [附录:本测试数据使用的matlab程序] close all; %先关闭所有图片 Adc=2; %直流分量幅度 A1=3; %频率F1信号的幅度 A2=1.5; %频率F2信号的幅度 F1=50; %信号1频率(Hz) F2=75; %信号2频率(Hz) Fs=256; %采样频率(Hz) P1=-30; %信号1相位(度) P2=90; %信号相位(度) N=256; %采样点数 t=[0:1/Fs:N/Fs]; %采样时刻 %信号 S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180); %显示原始信号 plot(S); title('原始信号'); figure; Y = fft(S,N); %做FFT变换 Ayy = (abs(Y)); %取模 plot(Ayy(1:N)); %显示原始的FFT模值结果 title('FFT 模值'); figure; Ayy=Ayy/(N/2); %换算成实际的幅度 Ayy(1)=Ayy(1)/2; F=([1:N]-1)*Fs/N; %换算成实际的频率值 plot(F(1:N/2),Ayy(1:N/2)); %显示换算后的FFT模值结果 title('幅度-频率曲线图'); figure; Pyy=[1:N/2]; for i="1:N/2" Pyy(i)=phase(Y(i)); %计算相位 Pyy(i)=Pyy(i)*180/pi; %换算为角度 end; plot(F(1:N/2),Pyy(1:N/2)); %显示相位图 title('相位-频率曲线图');

    时间:2014-12-31 关键词: matlab 时域 频域

  • NI推出LabVIEW新特性和新功能,进一步推动创新加速

    新闻发布—2019年6月17日-NIWeek-NI作为一家软件定义平台供应商,致力于帮助用户加速自动化测试和自动化测量系统的开发及性能,今日宣布推出最新版 LabVIEW 2019和LabVIEW NXG。这些新版本表明NI一直持续投入到下一代 LabVIEW 和系统工程软件的研发中。NI仍将继续致力于优化关键领域的测试和测量流程,这些领域包括测试开发集成、高效自动化测试以及数据和系统访问等。最新版 LabVIEW 2019 提供更好的IDE可视性、强大的调试增强功能以及新的图形化语言数据类型,旨在帮助开发人员进一步提高工作效率。此外,LabVIEW 2019 还解决了工程师的一个关键痛点:采用分散的非标准化方法来克服代码部署过程中的常见挑战——依赖关系管理和版本控制。借助LabVIEW 2019 软件包安装程序的新发布选项,用户现在可以使用软件固有的版本管理和自动依赖关系管理功能,标准化程序发布方法,从而自信地复制和共享系统软件。最新版 LabVIEW NXG 简化了自动化测试和测量应用中最耗时的任务,比如更快速部署和发布代码、导入和导出MATLAB® 数据(.mat)以提高与第三方软件的互操作性,同时新增的Web VI功能使用户能够更好地操作和控制其应用程序。这些增强功能可让工程师快速设置和连接仪器,可与其他编程语言和工具包之间互操作,避免了过去与第三方IP的集成瓶颈,并通过增强网络支持方便了对重要数据的访问。“借助WebVI,我们可以随时随地为用户提供测试管理数据库接口,而且我们只需要使用核心LabVIEW技能就能够开发Web界面。 不仅我们节省了开发时间,而且用户也可以即时查看数据或更改测试标准。”GSystems公司工程团队主管Jeremy Marquis说道。NI已在软件方面持续投入超过30年,未来这些 LabVIEW 版本仍将持续更新,以进一步将其工程能力从设计扩展到测试领域。 无论是第一次购买 LabVIEW,还是多年的老用户,都可以轻松使用 LabVIEW 2019 和 LabVIEW NXG,而且将看到立竿见影的效果。

    时间:2019-06-17 关键词: LabVIEW matlab ide

  • MathWorks 公司获得《控制工程》中文版杂志 2019 年度编辑推荐奖

    MathWorks 公司获得《控制工程》中文版杂志 2019 年度编辑推荐奖

    中国北京 – 2019 年 12月 11 日 – MathWorks公司今日宣布,Simulink 获得《控制工程》中文版杂志 2019 年度“编辑推荐奖”。Simulink 凭借其电力电子器件控制设计解决方案斩获“工业软件和平台”类大奖殊荣。这一奖项由《控制工程》中文版杂志全球编辑团队评选得出。 一年一度的《控制工程》中文版杂志评奖是中国工业控制、自动化和仪器仪表领域最具权威性的产品评选活动。2019 年,来自国内外的厂商共提交了 200 多项产品参与本奖项的角逐。其中有 26 个产品获得《控制工程》中文版杂志颁发的“编辑推荐奖”,并一展独特风采。  “我们非常荣幸能获得‘工业软件和平台年度大奖’这项殊荣”, MathWorks 中国区总经理曹新康说,“我们相信,对于使用 Simulink 为可再生能源、工业自动化和电动汽车领域开发电力电子器件控制系统的工程师们而言,这一奖项正是对他们所给予评价的准确印证。” Simulink提供一个用于动态系统建模、仿真以及综合分析的集成环境。电力电子工程师使用 MATLAB®和 Simulink®开发电机、功率变流器和电池系统的数字控制系统,并可以轻松实现如下工作流程: •         使用 Simulink 对调度和闭环控制算法进行仿真并生成代码,与传统手工编码和在硬件上测试相比,缩短项目时间 50%。•         访问成千上万随时可用的电气建模元件和用于桌面仿真的例程。•         使用附加工具箱进行控制设计、定点设计、信号处理和认证。•         获得对 Speedgoat 和其他实时硬件平台的实时仿真支持。•         为主流微控制器、FPGA 和 SoC 生成 ANSI C 和处理器优化的 C 和 HDL 代码。

    时间:2019-12-11 关键词: mathworks matlab simulink

  • 声卡和Matlab的虚拟信号发生器的工作原理

    声卡从话筒中获取声音模拟信号,通过模数转换器(ADC),将声波振幅信号采样转换成一串数字信号,存储到计算机中。重放时,这些数字信号送到数模转换器(DAC),以同样的采样速度还原为模拟波形,放大后送到扬声器发声,这一技术称为脉冲编码调制技术(PCM)。作为多媒体计算机系统中最基本最常用的硬件之一,其技术已经发展成熟,他同时具有A/D和D/A转换功能,经济方便,目前已经被广泛应用于数据采集和虚拟仪器系统的设计[1,2]。Matlab是一个数据分析和处理功能十分强大的工程实用软件,他的数据采集工具箱(dataacquisitiontoolbox)为实现数据的输入和输出提供了十分方便的函数和命令,利用这些函数和命令可以很容易地实现对外部物理世界的信号输出和输入。根据声卡输出信号的原理,采用Matlab软件编程,可以方便地利用声卡输出所需要的三角波、正弦波、方波等多种信号,有效地实现信号发生器的基本功能。 1基于Matlab和声卡的虚拟信号发生器的设计与实现 1.1系统实现原理 通常PC机配置的声卡提供了麦克风输入和扬声器输出2个接口,他集成了信号输入/输出需要的模/数转换器(ADC)和数/模转换器(DAC),因此,利用Matlab软件产生的各种虚拟信号通过声卡的DAC单元就可以直接输出。 只需要用音频线将软件系统产生的信号由线性输出(lineout)接口引出,就可以通过声卡直接作为信号源输出,显然,在这种虚拟信号发生器系统中,只需要一台带有普通多媒体声卡并安装了Matlab软件的PC机就可以满足要求实现虚拟信号的输出,系统结构简单方便。 1.2基于Matlab的信号发生器的实现方法 Matlab的数据采集工具箱(DAT)提供了一系列的函数和命令来实现实时模拟信号的输出,通过调用这些函数和命令可以直接控制声卡输出虚拟信号,在Matlab中用声卡产生虚拟信号的过程. Matlab的数据采集工具箱提供的控制声卡输出模拟信号的主要函数和命令如下: (1)初始化操作 Matlab将声卡等设备都作为对象处理,其后的一切操作都不与硬件直接相关,而是通过对该对象的操作来作用对象,所以,首先要为声卡建立一个设备对象。 ao=analogouput('winsound') analogouput()为模拟输出设备对象建立函数,通过该函数将声卡映射为Matlab环境中的一个模拟输出设备对象句柄。winsound为声卡设备驱动程序。 (2)添加数据输出通道操作 Matlab中用于添加数据输出通道操作的函数为addchannel,其函数格式如下: chan=addchanel(ao,ch) 其中:ao为声卡对象的句柄(下同),ch为声卡通道号,最大为2通道。 (3)输出数据操作 Matlab中用于输出数据操作的函数为putdata,其函数格式如下: putudata(ao,data) 其中:data为所需要输出的数据。 (4)启动并触发声卡设备操作 当完成输出数据操作后,并没有真正输出数据,必须启动声卡,才能对外输出信号,启动并触发声卡设备操作的命令如下: start(ao) (5)停止并删除声卡设备操作 Matlab的数据采集工具箱和图形用户接口提供了十分简便的实现声卡输出功能的命令和函数,利用Matlab和声卡设计虚拟信号发生器十分方便,而在硬件上只需要一块声卡,无需添加任何其他设备,价格十分便宜。虽然声卡的设计是以产生声音为目的,有效的音频范围和输出电压的幅度在一定程度上限制了他的使用,但这已完全能满足产生基本信号源的要求。在本设计的基础上,通过进一步的Matlab编程或硬件上的改进和扩展,可以实现一些常规仪器设备不能产生的信号,这在实际应用中具有广泛的推广应用前景。 信号输出完成后,声卡设备仍然保留在计算机系统中,若不将声卡设备停止并删除,计算机系统中仍会保留该设备,在下次启动虚拟信号发生器系统时将会发出声卡设备仍然在使用的错误信息。

    时间:2018-08-03 关键词: matlab 声卡 虚拟信号发生器

  • matlab与labview结合使用

    时间:2018-08-21 关键词: LabVIEW matlab 结合使用

  • 学习LabVIEW(四)——MATLAB script节点

    LabVIEW可以在程序中通过MATLAB script节点的方式实现G语言和MATLAB语言的混合编程,这是妇孺皆知的。大家都喜欢它,因为对于一些复杂的公式,用LabVIEW提供的运算节点在框图中拖拖拽拽的确实不太方便。MATLAB script节点插入到程序框图之后,会有一个文本编辑区域,可以在其中编写代码,如下图所示:这个节点实际上对应了一个MATLAB Automation Server,该Server的Command Window在运行程序之后也会出现。一个程序模块想要发挥作用,必然会有输入和输出端口。我们可以通过MATLAB script节点的右键菜单进行配置,如下图所示:添加了端口之后需要指定名字,这个名字在MATLAB脚本中作为变量名来使用,如下图所示但是这样还不能和LabVIEW其它节点的数据流对接。图形语言怎么分类我不太清楚,但LabVIEW给我的感觉比较像Static Type Language,想要让MATLAB script节点顺利接入到LabVIEW框图的数据流上,需要指定输入/输出端口的类型。在端口上点右键,选择类型即可,如下图所示:作为练习,编写了一个根据Look and Say序列第n个元素计算第n+1个元素的程序。什么是Look and Say序列?答案可以在https://en.wikipedia.org/wiki/Look-and-say_sequence找到。代码中用到的算法可以参考《快使用sort-diff-find组合技》。程序框图如下:程序界面如下:值得注意的是,在界面上添加数组控件之后,还要往数组控件里放入一个数值控件,表明这个数组是一个数值数组。所以说LabVIEW G语言有种Static Type的感觉。看一下运行的效果:由于MATLAB script节点中的MATLAB代码都是在MATLAB的Automation Server中执行的,因此我们可以在Server的Command Window中查看各个变量的值:

    时间:2018-11-12 关键词: LabVIEW matlab script节点

  • 学习LabVIEW(十)——关于Matlab的eps函数(十三)

    时间:2018-07-25 关键词: LabVIEW matlab eps函数

  • Matlab与TDS系列数字示波器的通信过程

    时间:2018-07-13 关键词: matlab 数字示波器 tds系列 通信过程

发布文章

技术子站

更多

项目外包

更多

推荐博客