图1 界面图
4.设计方法
各个模块之间的互转用state machine实现。State machine主要有while循环、case语句和移位寄存器组成,当然一般还要配上自定义型枚举常量。利用状态机可以比较自由和系统地进行程序运行状态间的转换。
本设计没有过多的运用子vi程序的调用,程序在回放的过程中调用了一个convert的子程序。主要是为了将录制的wav文件分割成很多段,每段的采样点可以由用户自定,但建议分割完成后的每段的采样点数不能太少。分割文件主要意图是为了想标记文件播放结束的时刻点,因为用户在播放操作中如果没有进行停播操作,那么文件播放结束后状态机的状态难以进行及时的转换,必须等待用户去进行停播操作。既然找到了文件播放结束的时刻点,那么程序可以自行去调整按键的状态,以进行状态机运行状态的切换。
在启动程序前可以设置相应的声卡参数也可以在启动程序后设置。为了满足不同数据的存储格式和性能要求,Labview提供了多种文件类型:文本文件、表单文件、二进制文件、数据记录文件、XML文件、配置文件、波形文件、基于文本的测量文件、数据存储文件等。在本次程序设计中,我们将声音输入格式设置为‘.wav’声音数据保存文件,文件保存的默认名定为sound.wav,文件保存路径由用户自行指定,文件是否保存也有用户指定。声音数据保存文件设置好以后,就可以对声卡里面的声音进行相应的采集了。通过耳麦,我们可以录制声音,也可以用播放器录制歌曲,在声音采集过程中,可以对声音数据进行实时显示和频域分析。由刚采集到的声音数据所在的指定路径,也可以对声音进行回放操作。如果用户忘记加载文件路径,系统会提示用户进行录音文件的加载。调节音量的控件可以帮助用户在播放声音文件时调节声音的大小,可以分别调节左声道和右声道的音量。
系统设计过程中避免了一些误操作,比如播放文件时错误顺序操作会提示加载文件;执行各个模块功能时对一些不相关的模块中的控件按钮disable,使用户无法去点击。
5.软件流程图
部分程序框图如下
图2 录音状态程序框图
图3 回放状态程序框图
软件流程图如下
录音模块 程序开始 系统初始化设置 回放模块 结束
图4 主程序流程图
PC机声卡通道输入
识别声音输入设备,设置声音采样模式 声卡参数设置,打开声音保存路径对音频信号进行写输入
声音信号采集结束关闭声音保存文件,清除缓冲器里面的声音数据,系统返回默认设置值 程序结束 判断任务输入是否有错误以及停录按键来控制While Loop的启停 显示时域信号和由函数傅里叶变换得到音频的频域信号 利用While Loop添加移位寄存器以及对音频数据写操作来对声音信号进行采样 图5 录音模块流程图
程序初始化设置 Y 判断文件路径 是否为空 N 加载录音文件 提示加载文件 对路径里的声音文件进行读操作
本模块程序结束 对输入声音设置启停 将读取的声音数据输入到指定设备(耳机) 由while loop对输入的声音文件进行读取 指定声音文件数据输入到设备 控制音量 声音播放结束,关闭声音文件,清除缓冲器里面的声音数据,系统返回默认设置值 图6 回放模块流程图
二.附属说明
1. 在本次的程序设计中,创建了一些布尔量的局部变量和属性节点,局部变量的设定是为了多次判断同一个布尔量值引发的不同操作和对布尔量值的改写,属性节点的作用大部分是为了避免产生误操作。比如说控件stop的局部变量每次运行系统时都会被赋值为false,是为了弹起stop控件,消除上次运行带来的影响,还有在初始化中判断了stop局部变量的值来是否结束运行;在初始化中属性节点的创建对控件进行enable,以及在不同模块中为了防止误操作而创建是为了disable相应的控件,对tab控件的属性节点的创建是为了方便page select的自由切换。
2. 移位寄存器是Labview中在循环结构中经常用到一种数据处理方式,即把第i次循环执行的结果作为第i+1次循环的输入。移位寄存器中的数据直到关闭VI时才从内存中消除。如果没有初始化移位寄存器,就会导致在关闭VI之前前后两次运行VI的结果截然不同。因此必须初始化移位寄存器。本次程序设计中采用移位寄存器的目的是将声音数据连续不断的存储到声音保存路径和声音保存文件中去,以及对错误输出进行相应的处理。
3. while loop、case结构主要构成machine state,sequence结构的应用更多的是为了时序的控制。各个模块程序中while loop来连续不断的采集声音数据以及播放声音数据,case语句来选择系统的各项功能实现。