基于Visual C++的声信号分析系统图形显示界面问题的研究*
2016-06-30张风珍陈军锋吴凤艳
曹 琳 彭 圆 张风珍 陈军锋 韩 辉 吴凤艳
(水下测控技术重点实验室 大连 116013)
基于Visual C++的声信号分析系统图形显示界面问题的研究*
曹琳彭圆张风珍陈军锋韩辉吴凤艳
(水下测控技术重点实验室大连116013)
摘要论文介绍了在Visual C++平台下的声信号分析系统实时波形图、声谱图和直方图的快速绘制方法。采用双缓冲显示技术解决了大数据量绘图时界面响应速度慢和刷新时出现闪烁现象的问题。通过双缓冲技术等措施,提高了显示速度,克服了界面闪烁。
关键词双缓冲; Visual C++; 闪烁
Class NumberTP391
1引言
一个声信号分析系统的编制过程整体分为:声音采集录制、数据的分析处理、声音的图形显示、声音播放。其中声音的图形显示是该系统的关键技术。目前,市面上及网络上有很多可供Visual C++调用的曲线显示类或控件,如图表类控件MSChart等。但这些类或控件要么由于针对性不强,要么功能较简单,难以满足本软件的需求,如大数据量波形的快速实时显示、声谱图实时显示、1/3倍频程直方图。由于数据采集器的数据量大,其接收、处理、存储和实时波形显示都很费时,如果直接在屏幕上动态绘图的话,会出现闪烁现象。而图形显示的闪烁问题容易给操作人员带来读数的不准确和判断失误。因此研究图形刷新带来屏幕闪烁问题对声信号分析系统的研发有着一定的必要性。针对上述情况,本文通过查阅相关资料进行了声信号分析系统图形显示界面的设计。
2图形闪烁问题分析及解决方法
在图形连续动态变化过程中,当屏幕由一个画面变化为另一个画面时,首先将原来的背景擦除,接着将新的图形绘制在显示区域。由于显示背景不断擦除和绘制图形所用的时间较长,导致屏幕出现闪烁。为解决这个问题,本文采用双缓冲显示技术[2]。基本步骤为:定义CBitmap对象;获得设备环境DC;创建与指定的DC兼容的内存设备环境;初始化位图对象,使其与指定的设备环境兼容;将位图选入设备,并绘制到窗口上。这样就不必擦除背景,并且在图形绘制在屏幕之前,已经将图形绘制在位图中,然后直接复制到屏幕上,跳过了在屏幕上直接绘图时间和背景擦除。图1为双缓冲显示技术的实现过程。图2为没有使用双缓冲技术的波形图,系统绘图过程非常缓慢,且图形会闪烁,整个窗口绘图过程时间为21s。图3为使用双缓冲技术绘制的波形图,可以看到绘图时间为7s,速度提高了三倍。实践证明,这样绘制出来的图形更流畅,可以有效解决图形绘制时的屏幕闪烁问题。
图1 双缓冲绘图实现流程
图2 没有使用双缓冲技术绘图的效果
图3 使用双缓冲技术绘图的效果
3动态图形绘制方法
3.1实时曲线显示
在计算机上像示波器那样连续动态地显示曲线是比较复杂和困难的,由于计算机不断地接收来自声卡的数据,所以曲线不可能在有限的显示屏中一次性地全部显示出来,曲线只能以动态的形式显示,而且每一时刻可以看到的都应该是最近刚接收到的n个数据所画出来的曲线。本系统使用MoveTo、LineTo绘图指令,采用滚动显示的方法实现了曲线的动态显示。首先信号自左向右显示,当显示数据的点数等于窗口的宽度时,显示的信号开始向左移动,最左端的点消失,最新的采样点显示在窗口的最右端,从而实现信号的连续显示,图4为某一段时间的实时曲线图。
图4 实时曲线
由于显示控件的分辨率是有限的,这就决定对大量数据显示时,会存在重叠和视觉无法分辨的情况。此外,绘图指令MoveTo和LineTo所消耗的时间远大于计算机运算速度。如果不加处理直接调用绘图指令MoveTo、LineTo进行绘制,当显示数据量较大时,显示器的显示速度就会变得越来越慢,这是难以忍受的。为了加速大数据量图形实时显示的速度,就必然要减少绘图指令的调用次数。通过仔细分析可以看出,当数据量远大于显示控件窗口的宽度时,控件窗口每一个横坐标像素位置上有许多数据点的重叠绘制过程,这些重复的绘制过程对波形显示效果影响不大,曲线的外形主要由同一个横坐标像素位置重叠点的最大值和最小值决定。 如图5所示,对于500*320的区域,显示波形数据长度为3000,那么如图5(a)所示的六点显示的实际效果如图5(b),它和图5(c)是一致的。但图5(b)却画了五条线,而图5(c)只画了一条线,只是将最大值和最小值连接起来。绘图指令变为了少量的比较运算,从而可以成倍提高绘图速度。通过表1不同数据长度的两种方法所需时间的比较,说明在绘制过程中,多点构成的多条线段,由最小值-最大值线段代替的方法优化了软件,减少了不必要的运算处理,提高了显示速度[1]。
图5 不同绘图方式的比较
数据长度直接算法/ms新方法/ms数据长度直接算法/ms新方法/ms7000.10.17K100.170K10010700K1092505M9000284
3.2声谱图实时显示
通过查阅资料并在SourceForge网站下载了有关绘制声谱图的源代码进行研究,发现声谱图绘制的关键是颜色过渡映射表的实现[1],可以参考Matlab中colormap的原理建立颜色过渡映射表:颜色由弱到强进行量化,每一个颜色对应一个强度的数值。这样每个点的颜色都确定了,就能得到声谱图。图6是Jet色彩过渡模型。其整个色彩过渡由五段线性过渡组合而成。图7是通过麦克风采集的数据绘制的实时声谱图。
图6 Jet 色彩过渡模型
图7 声谱图
3.3直方图动态显示
直方图的图形基元为长方形。可以描绘一个条形图,每一个条表示不同的频带,而条的高度代表能量。本系统最初使用Rectangle函数[8]实现直方图的绘制,效果如图8所示。虽然达到了动态显示效果,但是图形显示不够清晰、直观。通过仔细研究后,采用如下方案对程序进行调整。首先,根据1/3倍频程数据计算每个条形的高度,然后设置红色、蓝色、绿色三种颜色画刷。最后,定义m_nHighLevel=80和m_nMediumLevel=60两个整形变量。将频带能量与m_nHighLevel和m_nMediumLevel进行比较,当能量高于80分贝时,使用红色画刷来填充条形图,当能量高于60分贝时使用绿色画刷来填充,否则使用蓝色画刷来填充。如图9所示,红色、蓝色、绿色三种色条的动态变化反映不同频带能量的变化情况。实际应用表明此种绘制方法可令用户迅速地做出判断,视觉效果好。
图8 修改前1/3倍频程图
图9 改进后1/3倍频程图
4结论
本文以Visual C++为平台,根据专业需求实现了波形图、声谱图、1/3倍频程图的绘制。采用位图双缓冲技术消除了屏幕闪烁和提高了显示速度,圆满完成图形的动态显示任务,并在工程应用中实现了较好的显示效果。
参 考 文 献
[1] 周传德,秦树人,尹爱军.科学可视化理论及智能虚拟显示系统[M].北京:科学出版社,2006:45-131.
[2] 胡星星,腾云田.地震波形数据实时监控软件的实现[J].地震地磁观测与研究,2008,29(1):105-107.
[3] 刘伟宁,陈耀武,张磊.海底声纳实时可视化显示系统设计[J].计算机工程,2010,36(23):249-251.
[4] 朱庆生.游戏音效编程[M].重庆:重庆大学出版社,2005:265-275.
[5] 赵力.语音信号处理[M].北京:机械工业出版社,2003:26-29.
[6] 曹李秋,杨福宝.基于声卡的音频信号采集和处理系统设计[J].中国水运,2006,4(2):27-28.
[7] 周传德,秦树人.虚拟仪器中的科学计算可视化系统[J].中国机械工程,2004,15(8):735-738.
[8] 孔令德.计算机图形学基础教程[M].北京:清华大学出版社,2008:21-51.
[9] 陈喜阳,张克危,彭玉成.VC在监测系统中图形刷新问题的研究[J].工业控制计算机,2004,17(4):27-29.
[10] 高宏亮,王淑娟,翟国富,等.采用Visual C++实现的函数波形显示控件[J].电测与仪表,2006,43(492):62-65.
Problem of Graphic Display Interface in Acoustic Data-sampling System Based on Visual C++
CAO LinPENG YuanZHANG FengzhenCHEN JunfengHUA HuiWU Fengyan
(Science and Technology on Underwater Test and Control Laboratory, Dalian116013)
AbstractFast mapping methods of real-time oscillogram, spectrogram and histogram of acoustic data-sampling system in Visual C++ is introduced in this paper. Slow interface response speed and flashing screen and the display speed increasement and interface flash avoiding are achieved by double buffering technology.
Key Wordsdouble-buffering, Visual C++, flashing
*收稿日期:2015年12月11日,修回日期:2016年1月27日
作者简介:曹琳,女,硕士研究生,助理工程师,研究方向:水声信号与信息处理。
中图分类号TP391
DOI:10.3969/j.issn.1672-9730.2016.06.021