生产者/消费者设计模式在连续音频信号采集系统的应用

时间:2011-08-28

 

  LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显着区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。计算机和仪器的密切结合是目前仪器发展的一个重要方向。粗略地说这种结合有两种方式,一种是将计算机装入仪器,其典型的例子就是所谓智能化的仪器。随着计算机功能的日益强大以及其体积的日趋缩小,这类仪器功能也越来越强大,目前已经出现含嵌入式系统的仪器。另一种方式是将仪器装入计算机。以通用的计算机硬件及操作系统为依托,实现各种仪器功能。虚拟仪器主要是指这种方式。在一些工业现场中,设备长时间运行容易出现故障,为了监控这些设备,通常利用数据采集装置采集他们数据采集运行时的数据并送给PC机,通过运行在PC机上的特定软件对这些数据进行分析,以此判断当前运行设备的状况,进而采取相应措施。当前常用的数据采集装置,在其系统软件设计中,多采用单任务顺序机制。这样就存在系统安全性差的问题。这对于稳定性、实时性要求很高的数据采集装置来说是不允许的,因此有必要引入嵌入式操作系统。普通声卡具有16位的量化、数据采集频率是44 kHz,完全可以满足特定音频信号范围内数据采集的需要,个别性能指标还优于商用数据采集卡,而价格却为商用数据采集卡的十几分之一甚至几十分之一。若保证信号采集的逼真性,在采集过程中的连续性和实时控制显得尤为重要。

  本文以LabVIEW为平台,着重介绍了生产者/消费者模式的实现,以及在实时控制的连续音频采集系统中的应用。

  1 生产者/消费者设计模式概念及其实现

  1.1 生产者/消费者设计模式概念

  生产者/消费者设计模式包括多个并行循环,每个循环以不同的速率执行任务。一个循环作为生产数据的循环,其他循环作为消费数据的循环。生产数据的循环控制所有消费数据的循环,并且使用通信技术与它们进行通信。

  1.2 生产者循环与消费者循环之间的通信

  在LabVIEW程序设计过程中,变量(局部变量和全局变量)、通知器、队列常用于多个循环之间传递数据。

  LabVIEW中的变量是程序框图中的元素,通过它可以在另一位置访问或存储数据。根据不同的变量类型,数据的实际位置也不一样。局部变量将数据存储在前面板的输入控件和显示控件中,全局变量和单进程共享变量将数据存储在特殊的通过多个VI可以访问的仓库中。不管变量将数据存储在何处,所有的变量都可以在不使用连线连接两个地方的条件下把数据从一个地方传递到另一个地方,而不必使用正常的数据流。但是变量的使用有着其自身的缺点,变量不仅不能保证各个循环之间的同步,而且使用变量会破坏LabVIEW的数据流模式,在对变量进行读写操作时容易产生内存拷贝,浪费内存资源,影响系统运行效率。

  变量还允许竞争状态的出现,竞争状态不容易识别和调试,因为输出取决于操作系统执行排定的任务和外部时间定时的顺序。任务之间和任务同计算机之间的交互方式,以及外部时间的任意定时都使这种顺序变得随机。很多情况下,带有竞争状态的代码会在数千次测试中返回相同的结果,但仍然可能会在运行时返回一个不同的结果。

  对生产者/消费者设计模式的一个更有效的实现是使用通知器和队列使数据传输保持同步。通知器在发出数据可用的通知时,将同时发送数据。使用通知器将数据从主循环传送到从循环消除了和竞争状态相关的问题。使用通知器还有同步的好处,因为数据可用时,主从循环都已完成定时,并准备实现一个良好的生产者/消费者设计模式。但是通知器不会缓冲数据,如果主循环在从循环读取份数据之前发送另一份数据,那么原来那份数据就会被覆盖并丢失。队列类似于通知器。但它可以存储多份数据,默认情况下,队列按照FIFO(先进先出)的方式执行。因此,份插入队列的数据,也是份从队列中删除的数据。在实时控制的连续音频信号采集过程中,由于需要处理许多用户界面的事件,为了不造成数据丢失,选择队列在各个循环之间传递数据,实现过程如图1所示。

  如图1所示,在循环开始使用"获取队列引用"函数之前,队列就已经创建完毕。生产者循环使用"元素入队列"函数向队列中添加数据。消费者循环使用"元素出队列"函数从队列中移除数据。消费者循环一直到队列中的数据可用时才执行。

  可见,在此生产者/消费者设计模式中,两个循环均被同步为与生产者循环一致。消费者循环只在队列中的数据可用时才执行。这样就保证了消费者循环执行任务的连续性和高效性。并且,队列用于循环之间的数据传递,创建全局可用的位于队列中的数据,而且在添加新的数据到队列时,避免了丢失数据的可能性。

  2 实时控制的连续音频信号采集系统

  2.1 声卡简介

  声卡 (Sound Card)也叫音频卡(港台称之为声效卡):声卡是多媒体技术中基本的组成部分,是实现声波/数字信号相互转换的一种硬件。声卡的基本功能是把来自话筒、磁带、光盘的原始声音信号加以转换,输出到耳机、扬声器、扩音机、录音机等声响设备,或通过音乐设备数字接口(MIDI)使乐器发出美妙的声音。声卡从话筒中获取声音模拟信号,通过模数转换器(ADC),将声波振幅信号采样转换成一串数字信号,存储到计算机中。重放时,这些数字信号送到数模转换器(DAC),以同样的采样速度还原为模拟波形,放大后送到扬声器发声,这一技术称为脉冲编码调制技术(PCM)。

  功放芯片完成信号的功率放大以推动喇叭发声工作。声音输入/输出端口是音频信号的输入和输出,它主要有外接端口和内接端口。外接端口有"SPK Out"喇叭输出端口,"Wave Out(或Line Out)"线性输出端口,"Line In"线性输入端口,"MIC"麦克风输入端口,还有MIDI端口,连接电子乐器以及连接游戏控制器。内接端口是内置的输入/输出端口,是CD音频接口,通过3~4针的音频线直接连接。Line In接口和MIC都可以用于外部音频信号的输入,只不过后者可接入较弱的信号,幅值大约为0.02~O.2 V,显然这个信号较易受到干扰,因而常使用Line In,它可接入幅值约不超过1 V的信号。

  市面上的声卡主流都是16位的,声卡的采样频率是44.1 kHz,民用的声卡一般将采样频率设为4档,分别为44.1 kHz,22.05 kHz,11.025 kHz和8 kH.与一般的数据采集卡不同,声卡的D/A和A/D功能都是连续状态的。

  2.2 具体设计

  根据声卡的性能指标,将声卡初始设置为双声遣、44 100 Hz采样频率、16位采样。要使采集到的音频信号达到逼真的效果,要求信号的采集过程保持连续,但实时控制要求程序对用户界面的控件做出响立,这就在采集的连续性和对用户的响应方面产生了矛盾。本音频信号采集系统,运用生产者/消费者程序设计模式,很好地解决了这一矛盾,使生产者循环完成对用户界面的响应,消费者循环完成音频信号的采集任务,从而不仅提高了整个信号采集过程的效率,而且使采集的语音信号效果逼真。图2是实际音频信号采集系统前面板。

  主要程序框图如图3所示,在循环开始前,使用"获取队列引用"函数创建消息队列。生产者循环使用"元素入队列"函数向队列中添加数据。消费者循环使用"元素出队列"函数从队列中获取消息并移除数据。

  该设计模式允许消费者循环以固有速度采集信号的同时,生产者循环完成对用户界面的响应,生产者循环中采用事件结构,事件结构的延时时间为100 ms,采用轮询操作,处理用户界面各个控件的响应,对信号采集进行实时控制,同时为了不影响消费者循环中信号采集的连续性,并不是每一个用户事件都通过队列产生消息,通知消费者循环重新配置信号采集,只有在声卡配置参数(采样点数、采样率)发生改变时,生产者循环使用"发送通知"函数产生消息,以便通过" 等待通知"函数通知消费者循环。

  消费者循环内部是状态机结构,在次循环时进入"SetUp"分支,进行声卡的初始化配置,从下次循环开始,在其他控件发生改变而有关声卡配置的参数不发生变化时,生产者循环不会产生消息队列,消费者循环中在"daq"分支和"Wait"分支间进行,"Wait"分支仅检查消息队列中是否有消息,如果没有转"daq"分支进行数据采集,而不会进入声卡配置的"SetUp"分支,这样不仅保证了独立的采集过程不受影响,而且由用户界面引起的任何延时(如显示对话框)都不会导致采集过程的循环操作产生延时,从而保证采集音频信号的连续性。

  在用户改变声卡配置参数发生时,生产者循环响应该事件,"元素入队列"函数向队列中添加消息,消费者循环"Wait"分支中的"元素出队列"函数从队列中移出消息,在下次循环时进入"Setup"分支进行声卡参数配置,然后转入"daq"分支继续进行信号采集。在"daq"分支中除进行数据采集外,还对信号进行功率谱分析,并将信号保存在一个硬盘文件中。

  通过大量实验发现采用生产者/消费者设计模式设计的音频信号采集系统能够有效避免在采集过程中出现的声音中断和失真现象,较之以前基于其他模式的设计有一定的优势。

  3 结 语

  在LabVIEW程序设计过程中,并行循环之问的数据传递必须进行妥善处理,否则就会出现死循环等预想不到的错误。该文介绍的生产者/消费者设计模式不仅使并行循环间传递数据的逻辑关系更加简洁明了,使得程序的修改维护更加方便,而且大大提高了程序运行的效率。本文只是利用一个简单的实时控制的连续音频信号采集系统介绍了此模式的应用,阐明了这种设计模式的思想,在用LabVIEW设计如网络通信程序等要求准确且响应速度快的实时控制程序时,生产者/消费者模式有很好的借鉴意义。

 


  
上一篇:简述有效提高DFT设计测试覆盖率的方法
下一篇:分析振动检测技术在日常设备保养中的应用与实现

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料