图像处理(三)

VC实现对不同信号波形相似程度的判别

摘要:
本文介绍了利用相关对信号波形进行相似程度的判别方法。通过该技术可以对采集到的多种类型的数据信号间的相似度进行判别。本算法由Microsoft Visual C++ 6.0实现。 
  一、 引言 
  在工程上我们经常要判断某设备产生的实际波形信号是否能同预先设计的相拟合,但由于实际产生的波形不仅仅是简单的正、余弦波形,而往往是含有较丰富频率分布的不规则波形,而设备元器件本身及外界的电磁干扰又不可避免的引入了干扰噪声,就为我们分析其与预先设计波形的拟合程度的判别增加了困难。另外,实际波形和预先设计波形间往往存在着时序上的差别,相位的改变同样也不利于信号的拟合判别。本文利用高等数学以及信号与系统方面的有关知识提出对该问题的解决方法。
  二、 信号相似程度判别的理论依据 
  在信号与系统这门学科中,相关性是一种在时域中对信号特性进行描述的重要方法。由于其通信的功率谱函数是一对傅立叶变换,在信号分析中往往利用它来分析随机信号的功率谱分布,以致不少人一提到相关性马上会联想到信号功率谱的计算,但相关在对确定信号的分析也是有一定应用。由于相关的概念是为研究随机信号的统计特性而引入的,那么从理论上我们也可以将其应用于两个确定信号(一个我们采集到的信号波形和一个理论波形)相似性的研究上。
  要比较两波形的相似程度还要从相关的概念上入手,假定两信号分别为x(t)、y(t),可以选择当倍数a使a*y(t)去逼近x(t)。再此我们可以借用误差能量来度量这对波形的相似程度,具体方法同高等数学上用来判断函数间正交性的方法基本类似:
  误差能量用x(t)-a*y(t)的平方在时域上的积分来表示;倍数a的选择必须要保证能使能量误差为最小,通过对函数求导求极值可以得知当a为x(t)*y(t)在时域的积分与y(t)*y(t)在时域的积分比值时可以满足条件,在此条件下的误差能量是可能所有条件下最小的。定义x(t)与y(t)的相关数为Pxy,其平方与1的差值为相对误差能量,即误差能量与x(t)*x(t)在时域积分的比值。其中,xy就可以用来表征两波形的相似程度。解出关于Pxy的方程,其分子为x(t)*y(t)在时域的积分;分为两信号各自的平方在时域积分之积的平方根。从数学上可以证明分子的模小于分母,也即相关数Pxy的模不会大于1。由于对于能量有限的信号而言,能量是确定的,相关系数Pxy的大小只由x(t)*y(t)的积分所决定。如果两完全不相似的波形其幅度取值和出现时刻是相互独立、彼此无关的,x(t)*y(t)=0,其积分结果亦为0,所以当相关系数为0时相似度最差,即不相关。当相关系数为1,则误差能量为0,说明这两信号相似度很好,是线形相关的。因此把相关系数作为两个信号
波形的相似性(或线形相关性)的一种度量完全是有理论依据的、合理的。
三、 算法的设计与实现 

  我们在对信号进行比较之前,先将理论波形做成一个数据文件,实际设备输出的波形也通过计算机接口采集并将数据存成数据文件。我们编写的程序通过对两个数据文件的相关性比较来得出实际波形同理论波形信号的拟合度。下面就对数据文件的读取、数据相关程度计算等关键代码作简要的绍:
  首先,要在计算相关系数前把参加运算的两序列数据从文件读取到内存(堆栈)中去,为了方便读取多种数据格式的文件使程序更加灵活,选用MFC基本类库的CFileDialog类的成员函数来选取数文件,然后再通过CFile类的相关成员函数将其读取到内存中:
……
CFileDialog dlg(TRUE,"dat","*.dat", //TRUE为"打开文件"窗口
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"信号数据文件(*.dat)|*.dat|所有文件(*.*)|*.*||",NULL);
if(dlg.DoModal()==IDOK)
{
CString FileName="";
FileName=dlg.GetPathName(); //取文件所在的完整路径
CFile file;
file.Open(FileName,CFile::modeReadWrite); //以读写方式打开文件
buf1=new char [file.GetLength()]; //为指针动态分配堆栈
file.Read(buf1,file.GetLength()); //将数据读取到内存
m_nData1Len=file.GetLength(); //获取文件长度
file.Close(); //关闭文件
}
…… 
  上述为读取一个信号文件的相关代码,其中buf1是一个char*类型的指针,该指针指向的内存存储有数据文件的数据,m_nData1Len 保存有第一个数据文件的长度。用同样的方法将第二个数据文件也读取到内存中,指向其首地址的指针为buf2,文件长度为m_nData2Len。参与运算的数据序列准备好后就可以进行这两组信号波形的相关系数的计算了,下面是有关的关键部分代码: 
……
int N=m_nData1Len>m_nData2Len?m_nData2Len:m_nData1Len; 
  由于两序列长度可能不一样,如以较长序列为准,将短序列不足部分补0,根据相关系数的概念,补0部分的x(t)*y(t)的积分为0,没有实际意义,故以较短序列为准可以避免不必要的运算,运算效较高。 
……
float A,B,C,Pxy;
A=B=C=Pxy=0.0f;
…… 
  在计算机中将积分近似按离散点取和的方式进行近似的积分:
for(int i=0;i {
A+=buf1*buf2;//对x(t)*y(t)的积分
B+=buf1*buf1;//对x(t)*x(t)的积分
C+=buf2*buf2;//对y(t)*y(t)的积分
}
Pxy=A/(sqrt(B*C));//计算出相关系数
…… 
  最后释放掉申请的内存:
delete[] buf1;
delete[] buf2; 
  四、 实验效果的检验 
  下面通过一个实际的例子来检验一下上述程序,我们想要获得的理想的波形如下图Data1所示,Data2所示波形是设备经过噪声抑制和相位纠偏等诸多措施后产生的实际波形,Data3所示波形是在没有任何保护措施下得到的粗糙的波形,显然Data2要比Data3能更好的同设计的理想波形Data1相拟合,但只是停留在定性分析上,究竟相似程度如何,定量的分析靠肉眼显然是无法完成的。先对Data1和Data2波形信号进行相关系数计算,得出其相关系数为0.793931,基本上是线形相关的,即实际的Data2信号设计的理想信号Data1的拟合程度还是可以接受的;然后再对Data1和Data3两波形信号进行相关系数计算,组信号的相关系数为 -0.013341,基本上线形不相关;再对Data2和Data3进行分析,计算结果是0.011665,结论也是基本不相关。通过上述程序对波形信号进行的定量分析同直观上的定性分析是相吻的。通过实际实验的检验证明该程序是可靠、实用的。
图像处理(三) - hackbin - 一个人的天空 
  小结:本文提出的对波形信号相似程度的判断在电子工程上有着较为广泛的应用,能准确的判断出参加比较的两波形信号的相似程度,为设备的改进、元器件的选型等提供可参考的依据。另外,在判断移动的信号是否具有线形相关性的场合,如对雷达站接收到的两个不同距离的目标的反射信号的分析等都可以用本算法。通过对本文介绍的相关算法的改进还可以对信号的功率谱进行绘制、对波形信号进行更全面
的分析。本程序在Windows 98下,由Microsoft Visual C++ 6.0编译通过。

转载于:https://www.cnblogs.com/qq78292959/archive/2010/05/20/2077051.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet3.0学习总结(四)——使用注解标注监听器(Listener)

Servlet3.0提供WebListener注解将一个实现了特定监听器接口的类定义为监听器,这样我们在web应用中使用监听器时,也不再需要在web.xml文件中配置监听器的相关描述信息了。 下面我们来创建一个监听器,体验一下使用WebListener注解标注监听器&am…

PHP ThinkPHP学习第一步(搭建及认识ThinkPHP入口文件)

ThinkPHP包下载网址&#xff1a;http://www.thinkphp.cn本人下载3.2版本中的完整版&#xff0c;解压如下取其中的ThinkPHP文件于开发网站的根目录&#xff0c;并建立入口文件index.php入口文件index.php详细内容如下&#xff1a;<?php/** 本文件为thinkPHP的入口文件&#…

iptables 基础

SNAT 和 DNAT 是 iptables 中使用 NAT 规则相关的的两个重要概念。如上图所示&#xff0c;如果内网主机访问外网而经过路由时&#xff0c;源 IP 会发生改变&#xff0c;这种变更行为就是 SNAT&#xff1b;反之&#xff0c;当外网的数据经过路由发往内网主机时&#xff0c;数据包…

Oracle11g远程连接配置 visual studio 2003

服务器端 配置&#xff1a;oracle11g R2 x64 1.设置监听 a.启动栏 -> 开始 -> 程序 -> Oracle-OraDb11g_home1 -> 配置和移植工具 -> Net Manager b.Oracle Net 配置 -> 本地 -> 监听程序 -> LISTENER &#xff0c;查看是否有本地地址在监听&#xff…

JAVA思维导图学习笔记_8张思维导图,55天学习笔记,帮你入门JavaSE

学完了Java中的基础语法&#xff0c;也就是JavaSE。对其做了一个详细的梳理&#xff0c;也便于以后回顾。其中有些知识点被自己遗漏了&#xff0c;比如正则表达式这些&#xff0c;只能以后找机会补上了。01前言对于计算机基础知识的了解、以及Java相关的软件安装。相关笔记02基…

使用MemoryStream和FileStream

使用MemoryStream和FileStream编程访问文件是通过文件流对象进行的&#xff0c;当应用程序需要访问文件时&#xff0c;必须先创建一个文件流对象&#xff0c;此流对象和文件是一一对应关系。在.NET中&#xff0c;使用抽象基类System.IO.Stream代表流&#xff0c;它提供Read和Wr…

WordPress后台的文章、分类,媒体,页面,评论,链接等所有信息中显示ID并将ID设置为第一列...

WordPress后台默认是不显示文章、分类等信息ID的&#xff0c;查看起来非常不方便,不知道Wp团队出于什么原因默认不显示这个但可以使用Simply Show IDs插件来实现 不使用插件,其他网友的实现&#xff1a; <?php /** *为WordPress后台的文章、分类等显示ID From wpdaxue.com …

进程调试--进程启动VS自动附加

程序启动VS自动附加到进程调试 1、 打开注册表regedit 2、 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image file execution options 3、 新建QQ.exe【需要调试的进程名】 4、 右键修改字符串值 5、 F2修改新生成的默认值----debugger 6、右键debugger…

#20175201 实验五 网络编程与安全

一、实验五 网络编程与安全-1 1.实验要求&#xff1a; 两人一组结对编程&#xff1a; &#xff08;1&#xff09;参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA &#xff1b; &#xff08;2&#xff09;结对实现中缀表达式转后缀表达式的功能 MyBC.java&#xff1b…

Scala学习思维导图

转载于:https://blog.51cto.com/thunderkeg/1605365

使用git上传代码到github远程仓库

一、新建代码库注册好github登录后&#xff0c;首先先在网页上新建代码库。 点击右上角“&#xff0b;”→New repository 进入如下页面&#xff1a;按照要求填写完成后&#xff0c;点击按钮创建代码库创建成功。 接下来我们查看一下刚刚创建好的代码库&#xff0c;点击右上角的…

java web开发myeclipse_【java项目实战】一步步教你使用MyEclipse搭建java Web项目开发环境(一)...

首先&#xff0c;在开始搭建MyEclipse的开发环境之前&#xff0c;还有三步工具的安装需要完成&#xff0c;只要在安装配置成功之后才可以进入下面的java Web项目开发环境的搭建。1、安装工具第一步&#xff0c;下载并安装JDK&#xff0c;到官网上下载安装即可&#xff0c;之后需…

仿淘宝首页图片切换

资料来源:http://www.cnblogs.com/cloudgamer/archive/2008/07/06/SlideTrans.html?page2#pagedcomment 效果展示: 测试环境:IE8 (待续) 程序代码&#xff1a; 代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR…

NIO学习--缓冲区

Buffer其实就是是一个容器对象&#xff0c;它包含一些要写入或者刚读出的数据。在NIO中加入Buffer对象&#xff0c;体现了新库与原I/O的一个重要区别。在面向流的I/O中&#xff0c;您将数据直接写入或者将数据直接读到Stream对象中。在NIO库中&#xff0c;所有数据都是用缓冲区…

二分图匹配之匈牙利算法

二分图的基本概念&#xff1a; 二分图又称作二部图&#xff0c;是图论中的一种特殊模型。 设G(V,E)是一个无向图&#xff0c;如果顶点V可分割为两个互不相交的子集(A,B)&#xff0c;并且图中的每条边(i&#xff0c;j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j …

使用javascript打开模态对话框

1. 标准的方法 <script type"text/javascript"> function openWin(src, width, height, showScroll){ window.showModalDialog (src,"","location:No;status:No;help:No;dialogWidth:"width";dialogHeight:"height";sc…

Go-select和switch的使用区别

Go-select和switch的使用区别 1 package main2 3 import (4 "fmt"5 "time"6 )7 8 func main() {9 i : 2 10 fmt.Print("Write ", i, " as ") //Write 2 as two 11 switch i { 12 case 1: 13 fmt.Prin…

linux 安装nginx php mysql 配置文件在哪_linux下 php+nginx+mysql安装配置

我主要是用来安装php&#xff0c;以及nginx和php的交互。一 安装插件可以选择YUM安装或者源码编译安装gccgcc-czlibpcrepcre-devellibeventlibevent-devellibxml2libxml2-devellibmcryptlibmcrypt-develcurl-devellibpng-devellibtool-ltdl-develgd-developensslopenssl-develn…

JDBC原理之层次结构

目录 JDBC的层次结构前言Collection角色Statement角色ResultSet角色JDBC工作的基本流程JDBC的层次结构 前言 JDBC API提供了以下接口和类&#xff1a; DriverManager: 这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连…

DES加密/解密

1 /// <summary>2 /// DES加密(数据加密标准&#xff0c;速度较快&#xff0c;适用于加密大量数据的场合)3 /// </summary>4 /// <param name"EncryptString">待加密的密文</param>5 /// <param name&qu…