Java和Matlab混合编程及其应用

2012-09-21 07:14杨丽萍
长春大学学报 2012年10期
关键词:调用分辨率编程

王 薇,杨丽萍

(长春大学 计算机科学技术学院,长春 130022)

0 引 言

随着人工智能技术、信息技术的飞速发展和人类与计算机关系的日益密切,人们已经不在满足于计算机能播放和识别人类的语音信号,而且还希望计算机能够识别人类的语音情感信息,对人类情感的变化给出一定的判别。目前较多的语音情感研究都是从语音信号中提取出一些声学特征,然后将特征化简提取出一些更有效的特征,再用模式识别中的一些方法尝试去识别语音信号中的情感[1]。语音情感特征值的提取与分析是语音情感识别的基础,而语音情感识别是一门综合性的多领域的交叉学科,具有一定的难度,所以对情感语音信号的分析需要有一个十分方便且功能强大的工具。

MATLAB是matrix laboratory(矩阵实验室)的缩写,它自1984年由美国MathWorks公司推出后,经过不断地改进和发展,现已成为国际公认的优秀的工程应用环境,已被广泛的应用到教学、工程计算、通信、图像处理、自动化控制等领域[2]。该软件主要包括MATLAB和Simulink两大部分。MATLAB语句书写简单,功能强大,一条语句往往相当于其它高级语言中的几十条、几百条甚至几千条语句[3]。在很大程度上,MATLAB摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,为工程设计、科学研究以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,成为国际科学计算软件的先进代表。

Java是由Sun公司发布的一种纯面向对象程序设计语言。目前Sun公司已被Oracle公司收购。Java语言具有跨平台性、可移植性、多线程、分布式、安全可靠等优点。但Java程序设计语言对一些较为复杂的数值计算的编程较繁琐,编程效率较低。对于情感语音特征值的分析与处理可以采用Java及Matlab的混合编程,实现二者的优势互补。

1 Java与Matlab混合编程的方法

Java与Matlab的混合编程可以是Java程序调用Matlab,也可以采用Matlab调用Java程序。

1.1 Matlab访问Java程序

从Matlab 5.3版本起,在Matlab的安装程序中集成了Java虚拟机JVM(Java Virtual Machine),这样用户就可以通过Matlab的命令访问Java命令解释器,完成对象的创建和访问过程。Matlab访问Java程序具有以下优点:

(1)通过访问Java API扩展Matlab功能,例如一些输入输出功能及网络功能,Matlab完全可以通过Java中的URL类访问网络上的资源;

(2)通过访问第三方提供的Java类库提高编程的重用率;

(3)在Matlab中较容易地构建Java对象,可以用Java或是Matlab的语法访问Java对象中的方法;

(4)较容易地完成Matlab及Java之间的对象传递或是数值传递。

Matlab访问Java中的类主要有三个来源:一是Java类库中的类;二是第三方软件提供者提供的类;三是用户根据需求自己创建的类。Matlab加载类时在类路径中查找所需要的类,因此Java类要加载到Matlab中首先要在Matlab中设置类所在的路径。Matlab中的Java类路径有静态路径与动态路径两种:静态路径是在Matlab启动时加载的,在Matlab运行期间不能更改的路径;动态路径则可以在任何时间进行加载和修改。在Matlab提示符状态下可使用javaclasspath查看当前的静态路径与动态路径设置,若要修改静态路径的设置内容可先使用witch classpath.txt命令查看classpath.txt静态类路径文件所在的位置,再进一步用edit classpath.txt修改文件内容。定义动态路径时使用javaclasspath命令,修改动态路径时可使用javaaddpath和javarmpath完成。

当确定Matlab中所要用的Java类存在后,可用在Matlab程序中使用import命令将Java类或Java类所在的包完全导入到Matlab程序中,以便于在Matlab程序中使用。例如:

import java.lang.String;

import java.util.*;

import java.aut.*;

import java.util.Enumeration;

而在Matlab中使用类中的方法与Java中类似,同样是点分隔符完全对类中方法的访问。但是应注意的是要在MATLAB中调用的变量或方法必须要声明为public类型[2]。

1.2 Java程序访问Matlab

Java程序访问Matlab主要有三种方式:

(1)利用COM对象实现访问

COM是指通用对象模型(Common Object Model),是Microsoft推出的一个二进制代码标准。此标准包括规范和实现两大部分,这些规范不依赖于任何的语言和操作系统。在Matlab中构建COM对象需要使用ComBuilder完成Matlab算法到COM对象的转换,从而使Java、C/C++、VB等基于COM+的应用程序使用COM对象。

(2)利用CORBA实现访问

CORBA是指公共对象请求代理结构(Common Object Request Broker Architecture),它是体系结构最完整、最清晰,跨越平台最多的构件模型[4]。使用CORBA连接Matlab十分复杂,开发效率低[5]。

(3)利用JNI技术实现访问

JNI是指本地编程接口(Java Native Interface),Matlab向C/C++语言提供了Matlab Engine函数,Java通过JNI技术调用这些函数实现对Matlab的访问。Matlab Engine是指Matlab提供的一种面向C/C++和Fortran语言的接口函数,应用程序的前端程序是用C或Java实现的GUI,而应用程序的后端采用Matlab编程,这样可以提高编程效率,缩短编程时间。用户应用程序使用Matlab的Engine函数时,一个新的Matlab进程会产生,通过控制该进程完成计算及绘图任务。

2 COM技术实现语谱图读取

情感语音分析中常用的特征值分为两类:一是韵律特征;另一是音质特征。而各分类中又包含着多个特征值的选取,如短时能量、基音、强度、共振峰、语谱图分析等。

2.1 语谱图

语谱图主要用于反映语音信号动态频率特征,在语音分析中具有极其重要的实用价值。有时也可以把语谱图看作是可视语言。语谱图的水平方向表示时间轴,垂直方向表示频率轴,图上的灰度条纹则可表示各个时间点的语音短时谱。语谱图上因其不同的灰度,形成不同的纹路,称之为“声纹”。声纹因人而异,所以语谱图在司法、安全等场合得到广泛应用。

语谱图包括时间分辨率和频率分辨率,这两个分辨率均由窗函数决定。时间分辨率越高,则时间波形的每个周期及共振峰随时间的变化可以观察得越明显。但若频率分辨率低,在语谱图上则不足以分辨出由于激励所形成的细微结构,此时可称为宽带语谱图,而窄带语谱图正好与之相反。宽带语谱图由于可获得较高的时间分辨率,则可以反映频谱的快速时变过程;窄带语谱图可以获得较高的频率分辨率,所以可以反映频谱的精细结构。两者之间相结合,就可以提供带宽与语音特性相关的信息。

2.2 使用COM技术的条件

在Matlab的安装目录下查找toolbox文件夹,在该文件夹中如果看到存在javabuilder文件夹,则说明已经安装了Matlab Builder for Java。Matlab Builder for Java也可称为Java Builder,它是对Matlab Compiler的一个扩展。用Matlab的Java Builder可以将Matlab函数包装成一个或多个Java类,从而形成一个Java组件或者包被Java程序调用。

本实验所采用的开发环境为jdk1.6.0_16、MyEclipse10和MATLAB R2012a,主要进行情感语音信号语谱图的读取和显示。

2.3 将.m文件生成.jar文件

将Matlab中的.m文件生成Java环境中的.jar文件的操作步骤如下:

(1)在Matlab的command窗口输入deploytool命令,弹出一个新窗口Deployment Project。

(2)在Deployment Project窗口中单击new按钮创建新工程,输入新工程名MyPro并在Type列表框中选择Java Package选项。

(3)在Matlab的编辑器中编写yupu.m文件,代码如下:

代码中wavread函数支持多通道数据,最多可支持32位采样并支持读取24位和32位的.wav文件。该函数读取的情感语音文件是来源于北京航空航天大学电子信息工程学院毛峡教授课程组所建立的情感语音数据库[6]。该语音数据库为双声道的wav格式文件,样本语句采样频率为11025Hz,量化精度为16bit。代码中采用的函数格式是[y,Fs,bits]=wavread('filename'),该函数的返回值是以赫兹为单位的采样率(Fs),以及用于文件数据编码的每样点比特数(bits)。上述程序执行结果如图1所示。

图1 语谱图

specgram函数使用滑动窗计算信号的短时傅立叶变换,语谱图是该函数的幅度值。代码中采用的函数格式为specgram(a,nfft,fs,window),该函数参数指定了窗函数和矢量a每个窗口分区的样点数。如果用户提供了窗口尺寸,specgram函数则使用该尺寸的汉宁窗计算矢量a所表示信号的短时傅立叶变换。参数nfft指定specgram函数所用FFT长度,该值决定了计算短时傅立叶变换的各频点;参数fs是指定采样频率的一个标量。

(4)在右侧的Java Package中单击Add Class创建新类,该类的名字为以后在Java所调用的类名,然后将该文件加入到类中。

(5)单击build按钮,即可在Matlab的当前工作路径下,生成一个与工程名同名的文件夹,并生成一个.jar文件和一个.ctf文件,将这两个文件复制到Java的.classpath所在文件夹中。

2.4 在Java中调用生成的.jar文件

在MyEclipse中新建Java项目,并将Matlab中创建的jar包加入项目的build path,并且要把Matlab安装目录下的toolboxjavabuilderjarjavabuilder.jar文件加入项目的build path中。新建一个Java类VoiceTest,并引入相关的包,具体如下:

以上两条引入了Matlab相关包及建立的包和类,这样即可在Java类文件中使用Matlab中创建的.jar包。实验经过以上设置后,通过构建Java GUI用户界面,则可以在指定的菜单中选择语谱图进行显示。

3 结语

Matlab具有较好的数值计算功能,而Java具有较强的多线程、GUI设计等功能,将Matlab与Java进行结合应用在语音情感特征值研究过程中,不仅可以获取用户所需要的研究数据,还可以在更加友好的图形界面中进行操作,简化了操作方式,为用户提供了友好的操作界面。而Matlab与Java的相互调用具有各自的方式和特点,用户可以在研究过程中,结合具体需要采用Matlab调用Java程序或是Java程序调用Matlab方式。

[1]曾光菊.基于粗神经网络的语音情感识别[J].四川理工学院学报,2011,24(4):472-476.

[2]王薇,杨丽萍.MATLAB在数据可视化中的应用[J].长春大学学报,2008,10:52-54.

[3]王薇.MATLAB的循环向量化编程方法研究[J].长春大学学报,2010,2:57-59.

[4]任文杰,王伟,马松辉,陈怀民.MATLAB和JAVA的混合编程研究与实现[J].测控技术,2009,28(1):77-82.

[5]夏榆滨.软件构件技术[M].北京:清华大学出版社,2011:12-13.

[6]李文趋.Java与Matlab混合编程在图像处理中的应用[J].信息与电脑,2009,10:108.

[7]毛峡,陈立江.语音情感信息的提取及建模方法[P].中国专利:CN101261832,2008.

猜你喜欢
调用分辨率编程
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
核电项目物项调用管理的应用研究
EM算法的参数分辨率
LabWindows/CVI下基于ActiveX技术的Excel调用
原生VS最大那些混淆视听的“分辨率”概念
基于深度特征学习的图像超分辨率重建
一种改进的基于边缘加强超分辨率算法