麻烦说说EMD有什么地方不好~

麻烦说说EMD有什么地方不好~,第1张

问题:

1. 分量c1,c2,c3...cn分别包含了从高到低不同的频率断,每一段频率成分是不同的,而且随信号x(t)变换而变化,rn则表示了信号x(t)的中心趋势

对于这句话 有点不解 c1 c2...cn是不是严格按照频率从高 到低, 而且rn说表示中心趋势 我看有的说误差 看来应该是分情况而定的把??

2. 对于黄的程序 暂时我没有仔细研读啊 ,不知道他在对于emd缺点改进方面作了那些工作,此程序在对于emd的改进如何,更确切的说 这个程序的可用度如何, 更适合分析甚么信号!

通过看imf定义,可以看到 它对于具有调幅和调频的信号 对称信号 处理应该是比较不错的,但是实际信号 比如地震信号 时域波形应该畸变 不是标准的正弦波 或者于弦 ,而我门在举例子的时候 都倾向于 举一标准的正于弦 或者 调幅 调频,如果举噪声的例子,结果又会怎么样那??

3. 对于现在搞emd的都在对黄的程序,在改进 ,结果也出了不少文章 ,在故障诊断这块 ,作的不错的 湖南大学于老师 在机械系统与信号处理 发过3-4篇 文章, 算法作了改进 ,主要故障设计 齿轮 和轴承 ,这些信号 大家都清楚 出现调幅调频的几率比较达大,处理起来效果应该还可以,但是对于别的故障,不知道大家有没有试验过,如果转速变化比较大,所采集的波形波动比较大时,效果是不是还比较好呢?? 我现在还是觉得 信号略处于稳态的 处理效果比较好些, 期待大家 讨论?

答案1. c1 c2 ... cn 的确是严格按照频率从高到低产生的,不过这里有一个误区,其意思并不是说c1的频率一定比c2的高,正确的理解是c1中的某个局部的频率比c2中相同局部的频率要高,这也正好反映了EMD算法局部性强的本质所在,也跟黄的说法“相邻的分量可能包含相同时间尺度的振荡,但是相同时间尺度的振荡绝对不会出现在两个不同的IMF分量的同一个位置”一致。至于分解过程造成的误差(主要是包络方式的选取、边界效应的处理和滤波停止条件的设计),会不断累积到下一层分解中,并不一定是最后一个余量(趋势项)。

2.

a) 黄的源程序其实我们都没有得到(这个不是免费的,因为黄已经在NASA中申请了专利),一般大多数人使用的都是Flandrin提供的源代码,也就是LS提到的G.Rilling的方法(之所以有两种不同说法是因为网站提供的源代码是Flandrin的,但是emd.m提到的文章是G.Rilling作为第一作者的,也许外国人不像我们那样通过次序来区分贡献,呵呵)。程序基本上可靠,可以用来分析各种数据,但是效果如何,就要看是否满足你的需要了。至于适合什么样的数据,现在还没有定论,其一,EMD算法还没有建立一个合适的数学模型,也就缺乏严格的数学基础,很多诸如收敛性、唯一性、正交性等数学问题根本无法进行,甚至连“什么信号能进行EMD分析”目前也无法解释。其二,算法本身是 *** 作性的,到目前为止也是经验的(正如算法的名称一样),在没有找到其理论支撑之前,无从考究。其三,一种算法,不可能对任何信号都有效,所以不要指望EMD可以处理任何信号。

b) 从IMF的定义看的确要求IMF是对称的,但是这不意味着要求信号本身具有这样的特性,也并不要求信号是正弦、余弦等的合成,我想,之所以EMD能引起那么多人关注,除了所谓的“传销”得当以外,更重要的是它在实际中的表现,如果只能处理规则的信号,那么它的影响(包括好的和也许坏的)远不可能如此成功。

c) EMD从高到低产生各IMF的特性就意味着它可以用来去噪,而并非在使用EMD之前用其他方法进行噪声处理。举个例子吧,我这段时间做的脑功能激活区检测,本质上就是去除信号的噪声,把原始的刺激恢复出来的这么一个过程。实现结果是很不错的,无论对于加性的服从规则分布(例如高斯分布、均匀分布等)的随机信号,还是对于乘性的服从规则分布(我只测试了poisson分布)的随机信号。当然了,后者的结果当然比不上前者,不过足以超过用于检测的传统方法。个人认为EMD之所以在实际中那么有效,是因为它能处理非平稳、非线性的时间序列。

3. 目前对EMD方法的改进分为两个方面,一个是实验层面的,另一个是理论层面的,相对来说,后者少之又少。

a) 前者主要包括是两个部分。实际上,这是大家在利用EMD进行信号分解时采取的一些主观规则。其一是根据对零均值条件的主观理解,使用了不同的方法作为IMF滤波停止条件;其二是利用三次样条计算信号的上、下包络时,根据信号两端的走势,使用了特定的端点延拓方法。当使用EMD进行非平稳和非线性信号分解时,在上述两点上使用不同的规则将导致不同的EMD分解结果。2003年G. Rilling等人对Huang的EMD算法进行的改进就属于第一种,个人认为该条件比Huang原来的条件合理。而国内学者诸如2001年邓拥军等提出的神经网络方法、2003年黄大吉等提出的镜像闭合法和极值点延拓法以及2004年刘慧婷等提出的多项式拟合算法等,是属于第二种。至于这两年的研究成果,我还没有整理,呵呵。

b) 后者主要是2004年谌球辉等人提出利用“滑动平均”的方法代替传统的“包络平均”的方法来求出信号的低频。他们试图借助B样条函数已有的良好性质来为建立EMD的数学基础作进一步推进。另外,2006年初黄对EMD算法得到的IMF提出了一个后处理算法(本质上是对IMF进行规范化),其目的是为了更加准确的得到瞬时频率和振幅(个人认为这才是真正的包络和瞬时频率,来京之前我试图从局部意义上来证明这个算法的收敛性,但只得到阶段性结果,最近听说我的一个师弟已经从全局意义上基本上证明出来了,待我回去以后再看看具体成果吧,呵呵),算法的思想是把两者尽量分开,把调幅的影响从调频中脱离出来。该处理方法完全抛弃了Hilbert变换,使得瞬时频率和瞬时振幅更加准确、更有意义

总的来说,EMD乃至HHT虽然有很多缺点,但是也并非一无所用,在理论上的证明和进一步完善需要更多的关注,而在实验中的用处就看你的需要和如何发挥它的潜力了。

整个项目的结构图:

编写DetectFaceDemo.java,代码如下:

[java] view

plaincopyprint?

package com.njupt.zhb.test

import org.opencv.core.Core

import org.opencv.core.Mat

import org.opencv.core.MatOfRect

import org.opencv.core.Point

import org.opencv.core.Rect

import org.opencv.core.Scalar

import org.opencv.highgui.Highgui

import org.opencv.objdetect.CascadeClassifier

//

// Detects faces in an image, draws boxes around them, and writes the results

// to "faceDetection.png".

//

public class DetectFaceDemo {

public void run() {

System.out.println("\nRunning DetectFaceDemo")

System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath())

// Create a face detector from the cascade file in the resources

// directory.

//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath())

//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath())

//注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误

/*

* Detected 0 faces Writing faceDetection.png libpng warning: Image

* width is zero in IHDR libpng warning: Image height is zero in IHDR

* libpng error: Invalid IHDR data

*/

//因此,我们将第一个字符去掉

String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1)

CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath)

Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1))

// Detect faces in the image.

// MatOfRect is a special container class for Rect.

MatOfRect faceDetections = new MatOfRect()

faceDetector.detectMultiScale(image, faceDetections)

System.out.println(String.format("Detected %s faces", faceDetections.toArray().length))

// Draw a bounding box around each face.

for (Rect rect : faceDetections.toArray()) {

Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0))

}

// Save the visualized detection.

String filename = "faceDetection.png"

System.out.println(String.format("Writing %s", filename))

Highgui.imwrite(filename, image)

}

}

package com.njupt.zhb.test

import org.opencv.core.Core

import org.opencv.core.Mat

import org.opencv.core.MatOfRect

import org.opencv.core.Point

import org.opencv.core.Rect

import org.opencv.core.Scalar

import org.opencv.highgui.Highgui

import org.opencv.objdetect.CascadeClassifier

//

// Detects faces in an image, draws boxes around them, and writes the results

// to "faceDetection.png".

//

public class DetectFaceDemo {

public void run() {

System.out.println("\nRunning DetectFaceDemo")

System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath())

// Create a face detector from the cascade file in the resources

// directory.

//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath())

//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath())

//注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误

/*

* Detected 0 faces Writing faceDetection.png libpng warning: Image

* width is zero in IHDR libpng warning: Image height is zero in IHDR

* libpng error: Invalid IHDR data

*/

//因此,我们将第一个字符去掉

String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1)

CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath)

Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1))

// Detect faces in the image.

// MatOfRect is a special container class for Rect.

MatOfRect faceDetections = new MatOfRect()

faceDetector.detectMultiScale(image, faceDetections)

System.out.println(String.format("Detected %s faces", faceDetections.toArray().length))

// Draw a bounding box around each face.

for (Rect rect : faceDetections.toArray()) {

Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0))

}

// Save the visualized detection.

String filename = "faceDetection.png"

System.out.println(String.format("Writing %s", filename))

Highgui.imwrite(filename, image)

}

}

3.编写测试类:

[java] view

plaincopyprint?

package com.njupt.zhb.test

public class TestMain {

public static void main(String[] args) {

System.out.println("Hello, OpenCV")

// Load the native library.

System.loadLibrary("opencv_java246")

new DetectFaceDemo().run()

}

}

//运行结果:

//Hello, OpenCV

//

//Running DetectFaceDemo

///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml

//Detected 8 faces

//Writing faceDetection.png

package com.njupt.zhb.test

public class TestMain {

public static void main(String[] args) {

System.out.println("Hello, OpenCV")

// Load the native library.

System.loadLibrary("opencv_java246")

new DetectFaceDemo().run()

}

}

//运行结果:

//Hello, OpenCV

//

//Running DetectFaceDemo

///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml

//Detected 8 faces

//Writing faceDetection.png


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11782032.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存