使用LPC1700的IEC 60601-1-8音频警报发生器
时间:02-08
来源:互联网
点击:
介绍
IEC(国际电工委员会)提供了第一个关于医疗设备音频和视频报警的重点标准,即IEC60601-1-8。通过将重点聚焦于资料的音频警告部分,IEC60601-1-8标准要求,必须使特定的旋律对应于特定的生理机能。这样就能保证报警的数量是有限的,而不会在不同的制造商之间随意变化。它也将报警的数量限制在8个,并使用了每一个的告诫和紧急形式。紧急(高级优先权)形式使用重复的五音符旋律。告诫(中等优先权)报警使用高级优先权形式的前三个音符,但不重复。将察觉的紧急程度设计到声音中的某些原理已经被应用到这些信号中;例如,中等优先权音调比高级优先权音调更缓慢的上升和下降时间,以及用于高级优先权报警的比较快的节拍。标准中也提供了一种任选的低级优先权报警音调;该声音只有两个音符。
IEC60601-1-8音频报警标准提供了富有和声的音调,以便使它们容易定位、并能防止屏蔽的干扰。范畴与对应旋律的数量都有限,从而能获得容易掌握的不同报警顺序。另外,报警的优先权决定了报警中音符的数量,以及音符顺序的动态特征。这使得人们容易确定报警的紧急程度。这样,IEC60601-1-8标准解决了许多以前报警的限制因素,而且将有助于改善患者的安全性。
以算法形式生成IEC60601-1-8报警
当前许多的IEC60601-1-8实施方案都是回放储存在存储器中的录音形式的报警。其缺点是,它需要占用大量的存储器空间来储存文件,以及程序空间来控制回放。与之相比,以算法形式生成报警在存储器利用方面是一种非常有效的方法,而且允许有相当大的灵活性,能够在满足IEC60601-1-8技术规格的同时对音符进行自定义。
芯片上要求的功能资源
为了在芯片上合成报警音调,需要在固件中实施下列功能:
定时信号发生器-这提供定时基准,以便以数字形式构建报警音调,从而有效地设定内部样品速率和DAC输出速率。这还提供用于音符定序器和包络发生器的时间基准。
包络发生器-这控制音符脉冲的上升时间、下降时间和振幅。音符的上升和下降时间也是报警优先权的函数。
音符定序器-基于报警的类型和优先权等级,以正确的节拍按顺序通过正确的音符。
音符发生器-这生成组合起来形成基本音符与谐波的多重正弦波音调;由这些基本音符和谐波构成警告音符。
关于演示模式,通过UART1和终端程序提供一个菜单驱动的用户接口。这包括不同的菜单、一个串行端口驱动程序、和一个简单的命令处理程序。
定时信号发生器
它利用芯片上的定时器来设定用于算法音调发生器的采样速率/DAC输出速率。针对25 ksps的DAC输出速率,定时器被设置为每隔40μs生成一个中断。这被选择为处于音频范围上方,而且远高于Nyquist(尼奎斯特)频率,以允许在DAC上采用低成本的滤波器。中断服务程序中的软件计时器也提供1 ms的超时。如下文所述,它被用于包络控制功能和音符定序器。
包络发生器
包络发生器控制正在生成的音调的动态音量。由于IEC技术规格包括音调的上升和下降时间,所以生成一个基于时间的变量。当音符打开时,包络变量的值以受控的速率从0增大到最大设定水平。当音符关闭时,这也会同样发生;音量将以受控的速率减小,直到它达到0为止。上升和下降时间是可以编程的;而且,与高级优先权音调相比,中等和低级优先权音调具有较慢的上升/下降时间。包络发生器使用1 ms超时作为其定时基准。
音符定序器
作为报警之分类和优先权的函数,IEC 60601-1-8标准规定了相对音符顺序和音调的瞬时特征。音符定序器输出具有正确持续时间和间隔的音调,以满足给定优先权的报警的瞬时特征。对于高级优先权报警,其顺序被规定为一种5音符顺序;它重复一次,所以总共有10个音符。中等优先权报警是一种3音符顺序,但不重复。关于给定报警类型的三音符顺序与同类高级优先权顺序的前三个音符相同,以便更加容易地掌握报警。高级优先权报警的节拍快于中等优先权报警。不同数量的音符和节拍差异能够容易地区分报警的优先权。
音符发生器
为了容易地符合标准,基本音符和4个谐波将作为单独的正弦波而生成,然后由数字方式组合起来。在芯片上生成正弦波的方法有很多种:包括正弦表查找、数学库算法、泰勒级数展开和递归振荡器。递归振荡器是一种具有合适系数的IIR滤波器结构,一旦正确地初始化,就能实现振荡。由于这是比较有效的方法之一,而且具有非常低的失真,因此递归振荡器将被用于生成每个音符所需要的基本音符和4个谐波。
图1 双抽头IIR滤波器
Goertzel算法
最有用的递归方法之一是Goertzel算法;图1显示了一种简单的双抽头IIR滤波器。这是非常有用的算法,除了作为正弦波发生器以外,它还能被用作窄带音调探测器。通过分析作为振荡器的算法,随着以固定的跨度增大角度,我们想要能够计算该角度的正弦值。假设能够从正弦级数中的两个以前的增量值来计算角度的正弦值,那么针对图1,就能写出公式(1):
(1)
在公式(1)中,x和y是IIR滤波器的系数,“a”是起始角,而“b”是增量角。为了找出两个系数的值,重新整理并简化公式1,如公式2所示。
(2)
通过代入下列三角恒等式,继续扩展公式2:
(3)
我们得出:
重新整理:
(5)
为了确保此式对于所有n都成立,必须让括号中的两个表达式满足:
(6)
当求解时,这就能得出用于递归IIR滤波器的系数:
(7)
将它代回到原始公式中,得出:
(8)
重新整理:
(9)
代入样品值Y[n]=sin(a+nb),得出:
(10)
由于系数之一等于-1,所以在每个步距角增量处的计算就只需要涉及两个以前计算结果的一个乘法和一个减法(假设系数已事先计算出来)。在运行了上面的公式后,y[-1]值被移入到y[-2]变量中,并且将计算出的y[n]值移入到y[-1]变量中,以准备在下一个步距角处的计算。这促进了Cortex-M3非常有效的运行。
Goertzel初始化
为了让Goertzel能够作为振荡器发挥作用,y[-1]和y[-2]值必须要进行初始化。如果我们设y[-1]=0,那么y[-2]应该具有在零交叉之前的一个增量正弦值的值,或者:
(11)
系数也必须在下面的公式12中计算。
为了将Goertzel算法作为音调探测器使用,y[-1]和y[-2]二者都应该被初始化到“0”。然后,输入应该加入到计算中。在特定数量的样品之后,输入在探测频率处的振幅就能够从下列公式来计算:
存在关于此式的优化形式,以简化数学运算,但这里只是为了解释原理。为了将它用作连续的音调探测器,在执行了此计算之后,y[-1]和y[-2]应该再次设定为零,然后进行下一个采集和探测顺序。
代码实施-音频报警合成
定时信号发生器代码
定时信号发生器代码包括定时器0的初始化,以及用于处理定时器0中断的中断服务程序。这提供用于生成报警音调的40μs(25kHz)定时,以及软件计数器生成的1ms定时。后者被包络发生器和音符定序器所用。
定时器0初始化
定时器0需要进行初始化,以每隔40μs生成一个匹配中断,从而提供25kHz的采样速率。下面给出了初始化代码。
定时器0中断服务程序
定时器0中断服务程序是本应用程序的心脏,因为它为音调生成以及音调定序提供所有计时。本代码进行试验,以查看包络是否启用,如果是,它将输出音调。除了清除中断以外,软件计数器被递增,直到达到1ms的超时。在每一次1ms超时发生时,定序器的状态就被递增,而且任何需要的动作将由包络发生器执行(将在以后讨论)。下面显示了关于定时器0中断服务程序的代码列表。
包络控制功能
包络发生器控制音调的动态水平,因为IEC60601-1-8要求上升时间和下降时间应该处在规定的范围内。还有,报警顺序中的第一个音符的振幅应该低于其它音符。包络发生器输出是变量“包络”。当音调关闭时,包络=0。当在顺序中打开一个音符时,包络变量将每毫秒以设定的速率增大,直到它达到设定的最大水平。当音符关闭时,音调继续,但包络变量开始以其设定的速率减小,直到它达到“0”。包络变量将被用作音符的动态特征的音量控制。下面给出了包络控制功能的列表:
音符定序器功能
音符定序器为IEC60601-1-8中规定的不同报警旋律提供计时和音符定序。高级优先权报警包括重复的5音符顺序。相同报警范畴的中等优先权形式使用其高级优先权报警的前三个音符,但不重复。高级优先权报警的音符间隔和持续时间比较短,因为这能给出紧急程度的较高感觉。以高级优先权为例,下面显示了实施这些功能的代码。在定时器0中断服务程序中讨论的1ms时基增大顺序计数器。作为其结果,与每个情况语句相关联的数字均以毫秒为单位,以方便计时期间的调整。中等和低级优先权形式使用相同的基本开关语句格式和类似的函数调用,但是,由于节拍不同,在相关的情况语句中使用了不同的计时状态。
音符发生器功能
对于音符发生器,存在许多需要处理的数据,它们涉及到多重频率和多重正弦波发生器。如果将与每个频率相关的数据变量和常数组织在具有相同尺寸的矩阵中,那么就能恰好使用简单递归函数来“走”过这些矩阵数据。
音符发生器定义
定义若干个定点和浮点常数,以及定义结构标签和两个矩阵。它们当中之一是结构的一个矩阵。
算法中使用的变量和系数之结构的优点是:它允许我们在结构矩阵和频率常数矩阵中具有类似的矩阵组织。常数频率矩阵和算法结构矩阵之间的一一对应关系使得在初始化每个频率时,容易使用两个矩阵的类似索引。
音符发生器初始化
上文提到为了使Goertzel算法能振荡,除了系数以外,y[-1]和y[-2]值也必须初始化。必须针对对应于每个频率的结构变量而完成此工作。下面显示了用于初始化的代码。一排5个结构中的每一个被初始化,然后每一个另外的排被初始化,直到整个结构矩阵都被初始化。在这个演示应用程序中,这些计算是在复位初始化期间完成的。不过,如果你正在最优化它,可以通过事先进行这些计算而将代码保存起来,并且将结果作为常数储存在快速存储器中。这是因为,如果数学程序库需要浮点和正弦/余弦算法,那么预先计算好的初始化值则不需要。这些程序库例行程序使用大约一半本应用程序中使用的代码空间。系数和初始化值是通过32768(带符号的短值)定标的。还有,系数计算不包括公式(18)中显示的2X系数。其目的是使系数的规模保持在带符号的短值,以最小化储存要求。2X被包括在最终Goertzel计算中;此处,输出的定标是通过>>14(而不是>>15)乘以2。
多重正弦波发生、求和及DAC输出
一旦算法变量和系数都已经被初始化,那么,让Goertzel计算来生成基本音符和4个谐波就变得很容易。方法是简单地递增通过结构矩阵中的一排,并且求五个值的和。正如上文所述,第204行包括通过>>14、而不是>>15定标到2X中的系数,而这些系数在初始化时不予考虑。
一旦函数已经完成了矩阵排中所有5个结构的计算,相加的值就被定标、格式化、并从带符号的值转化为不带符号的值,然后被送到DAC。由于这些计算是在每个25kHz定时器中断处执行的(当音符活跃时),所以DAC输出速率就是25 kHz。这允许使用便宜的输出滤波器,因为相对于正在生成的最高正弦波频率,这大约是9X的过度取样。
用户/命令接口
对于为本应用程序编写的演示固件,Keil MCB1700被确定为目标板,而UART1则被用来提供菜单驱动的终端接口,以激活不同的报警。为了保持应用规格书的简明性,本文没有显示UART代码。只显示了命令功能之一的代码示例,作为如何使用本固件来启动报警顺序的演示。
启动报警顺序需要的全部工作是使用“报警”变量设定报警类型,然后通过将“顺序”变量设定到一个非零值而启用定序器。
IEC60601-1-8音频报警演示操作
复位菜单
MCB1700加载完IEC音频报警固件后,当MCB1700上的COM1接口连接到运行HyperTerminal、TeraTerm或类似终端程序的PC上时,复位以后,用户就会看到具有下列菜单的提示:串口设置为9600比特率、一个开始位、一个停止位、无奇偶校验、无流量控制。
图2 复位菜单
图3 高级优先权报警菜单
按下1到8之间的任意一个数字,然后按下回车,将开始对应报警类型的高级优先权报警顺序。类似的菜单动作将针对中等优先权、低级优先权和试验菜单而获得,参见图4、图5、和图6中所示。
图4 中等优先权菜单
图5 低级优先权菜单
图6 和试验菜单
试验菜单中的命令提供了具有谐波的最高和最低频率音调的短1秒脉冲,以及本应用程序所需要的最高和最低单一频率音调。这是为了方便进行性能试验。单一音调的生成是通过让‘ToneWeights’矩阵中的所有值都等于0,但正在生成的隔离音调除外。命令5将所有ToneWeights矩阵值都复位到它们的初始值。
外部硬件要求
外部DAC滤波器
对于在应用规格书中做的试验,增加了一个简单的三极RC滤波器,以便从信号中过滤掉25kHz采样速率分量。使用的滤波器如图7所示,它提供的截取频率范围处在9kHz到10kHz。由于样品速率高于正常人类听觉范围,所以没有滤波器,成本敏感的应用程序就可以通过。另外,在这个网络之后通常需要一个耦合电容器,因为DAC的直流电平一般为1.65 V。
图7 三极RC DAC滤波器
如果不打算成为高的阻抗输入,或者这个信号是外部固定的,那么建议使用缓冲器。
性能分析
通过使用上一段描述的输出滤波器,执行了波谱分析试验,以验证信号的频谱含量,并估计信噪比。此外,还进行了示波器捕捉,以显示生成的警报音调的升降和其它瞬时特征。MCB1700 DAC的输出被馈送到Mackie CR1604-VLZ音频混合器(用于平频率响应的EQ集),以便给笔记本电脑内部Sigmatel Codec提供正确的电平。笔记本电脑正在运行True Audio的TrueRTA波谱分析仪软件包。前文已详细描述过的试验菜单被用来提供分析中使用的试验音调脉冲。
利用DAC滤波器的多重音调生成的波谱分析
利用上文详细描述的三极10kHz RC滤波器之后获得的板输出,进行下列波谱分析仪捕捉。
具有谐波的应用程序(C4)中最低频率音调的波谱如图8所示。这些谐波在振幅方面互相非常接近。这将容易地满足IEC 60601-1-8技术规格,因为它们只要求谐波处在互相之间15 dB的范围内。信噪比看起来超过55dB,也能提供非常好的噪声性能。波谱分析中显示的缺少其它谐波也证明了由Goertzel算法生成的正弦波的扭曲很低。
图8 具有谐波的C4
图9显示了在具有谐波的应用程序(C5)中最高频率音调的波谱分析。由图可知,具有谐波的C5音调的波谱也具有良好的信噪比和低扭曲,而且能够将基本音符和谐波的振幅保持在几个分贝的范围内。
图9 具有谐波的C5
结论
本应用中呈现的医疗报警的方法为符合IEC60601-1-8标准的音频医疗警报提供了一种有效、低成本、高性能的方法。技术规格也说明,在报警声音方面设备差异的细微程度对于操作人员是有利的。除了能满足标准的要求以外,此处提供的固件实施允许容易地自定义音调,同时仍然能够保持在技术规格参数范围以内。基于ARM Cortex-M3内核的NXP LPC17xx系列微控制器能提供非常高速度的性能和准确的定时,这特别适合于实施类似于本示例中使用的算法。利用在96 MHz的频率下运行的LPC1768处理器,本应用程序使用大约8 %的可用处理器带宽和小于10K的代码空间,这样就为其它附加的应用程序留出了大量的代码空间和处理能力。因此,非常容易将对IEC60601-1-8标准的支持增加到任何医疗电子应用中。
IEC(国际电工委员会)提供了第一个关于医疗设备音频和视频报警的重点标准,即IEC60601-1-8。通过将重点聚焦于资料的音频警告部分,IEC60601-1-8标准要求,必须使特定的旋律对应于特定的生理机能。这样就能保证报警的数量是有限的,而不会在不同的制造商之间随意变化。它也将报警的数量限制在8个,并使用了每一个的告诫和紧急形式。紧急(高级优先权)形式使用重复的五音符旋律。告诫(中等优先权)报警使用高级优先权形式的前三个音符,但不重复。将察觉的紧急程度设计到声音中的某些原理已经被应用到这些信号中;例如,中等优先权音调比高级优先权音调更缓慢的上升和下降时间,以及用于高级优先权报警的比较快的节拍。标准中也提供了一种任选的低级优先权报警音调;该声音只有两个音符。
IEC60601-1-8音频报警标准提供了富有和声的音调,以便使它们容易定位、并能防止屏蔽的干扰。范畴与对应旋律的数量都有限,从而能获得容易掌握的不同报警顺序。另外,报警的优先权决定了报警中音符的数量,以及音符顺序的动态特征。这使得人们容易确定报警的紧急程度。这样,IEC60601-1-8标准解决了许多以前报警的限制因素,而且将有助于改善患者的安全性。
以算法形式生成IEC60601-1-8报警
当前许多的IEC60601-1-8实施方案都是回放储存在存储器中的录音形式的报警。其缺点是,它需要占用大量的存储器空间来储存文件,以及程序空间来控制回放。与之相比,以算法形式生成报警在存储器利用方面是一种非常有效的方法,而且允许有相当大的灵活性,能够在满足IEC60601-1-8技术规格的同时对音符进行自定义。
芯片上要求的功能资源
为了在芯片上合成报警音调,需要在固件中实施下列功能:
定时信号发生器-这提供定时基准,以便以数字形式构建报警音调,从而有效地设定内部样品速率和DAC输出速率。这还提供用于音符定序器和包络发生器的时间基准。
包络发生器-这控制音符脉冲的上升时间、下降时间和振幅。音符的上升和下降时间也是报警优先权的函数。
音符定序器-基于报警的类型和优先权等级,以正确的节拍按顺序通过正确的音符。
音符发生器-这生成组合起来形成基本音符与谐波的多重正弦波音调;由这些基本音符和谐波构成警告音符。
关于演示模式,通过UART1和终端程序提供一个菜单驱动的用户接口。这包括不同的菜单、一个串行端口驱动程序、和一个简单的命令处理程序。
定时信号发生器
它利用芯片上的定时器来设定用于算法音调发生器的采样速率/DAC输出速率。针对25 ksps的DAC输出速率,定时器被设置为每隔40μs生成一个中断。这被选择为处于音频范围上方,而且远高于Nyquist(尼奎斯特)频率,以允许在DAC上采用低成本的滤波器。中断服务程序中的软件计时器也提供1 ms的超时。如下文所述,它被用于包络控制功能和音符定序器。
包络发生器
包络发生器控制正在生成的音调的动态音量。由于IEC技术规格包括音调的上升和下降时间,所以生成一个基于时间的变量。当音符打开时,包络变量的值以受控的速率从0增大到最大设定水平。当音符关闭时,这也会同样发生;音量将以受控的速率减小,直到它达到0为止。上升和下降时间是可以编程的;而且,与高级优先权音调相比,中等和低级优先权音调具有较慢的上升/下降时间。包络发生器使用1 ms超时作为其定时基准。
音符定序器
作为报警之分类和优先权的函数,IEC 60601-1-8标准规定了相对音符顺序和音调的瞬时特征。音符定序器输出具有正确持续时间和间隔的音调,以满足给定优先权的报警的瞬时特征。对于高级优先权报警,其顺序被规定为一种5音符顺序;它重复一次,所以总共有10个音符。中等优先权报警是一种3音符顺序,但不重复。关于给定报警类型的三音符顺序与同类高级优先权顺序的前三个音符相同,以便更加容易地掌握报警。高级优先权报警的节拍快于中等优先权报警。不同数量的音符和节拍差异能够容易地区分报警的优先权。
音符发生器
为了容易地符合标准,基本音符和4个谐波将作为单独的正弦波而生成,然后由数字方式组合起来。在芯片上生成正弦波的方法有很多种:包括正弦表查找、数学库算法、泰勒级数展开和递归振荡器。递归振荡器是一种具有合适系数的IIR滤波器结构,一旦正确地初始化,就能实现振荡。由于这是比较有效的方法之一,而且具有非常低的失真,因此递归振荡器将被用于生成每个音符所需要的基本音符和4个谐波。
图1 双抽头IIR滤波器
Goertzel算法
最有用的递归方法之一是Goertzel算法;图1显示了一种简单的双抽头IIR滤波器。这是非常有用的算法,除了作为正弦波发生器以外,它还能被用作窄带音调探测器。通过分析作为振荡器的算法,随着以固定的跨度增大角度,我们想要能够计算该角度的正弦值。假设能够从正弦级数中的两个以前的增量值来计算角度的正弦值,那么针对图1,就能写出公式(1):
(1)
在公式(1)中,x和y是IIR滤波器的系数,“a”是起始角,而“b”是增量角。为了找出两个系数的值,重新整理并简化公式1,如公式2所示。
(2)
通过代入下列三角恒等式,继续扩展公式2:
(3)
我们得出:
重新整理:
(5)
为了确保此式对于所有n都成立,必须让括号中的两个表达式满足:
(6)
当求解时,这就能得出用于递归IIR滤波器的系数:
(7)
将它代回到原始公式中,得出:
(8)
重新整理:
(9)
代入样品值Y[n]=sin(a+nb),得出:
(10)
由于系数之一等于-1,所以在每个步距角增量处的计算就只需要涉及两个以前计算结果的一个乘法和一个减法(假设系数已事先计算出来)。在运行了上面的公式后,y[-1]值被移入到y[-2]变量中,并且将计算出的y[n]值移入到y[-1]变量中,以准备在下一个步距角处的计算。这促进了Cortex-M3非常有效的运行。
Goertzel初始化
为了让Goertzel能够作为振荡器发挥作用,y[-1]和y[-2]值必须要进行初始化。如果我们设y[-1]=0,那么y[-2]应该具有在零交叉之前的一个增量正弦值的值,或者:
(11)
系数也必须在下面的公式12中计算。
为了将Goertzel算法作为音调探测器使用,y[-1]和y[-2]二者都应该被初始化到“0”。然后,输入应该加入到计算中。在特定数量的样品之后,输入在探测频率处的振幅就能够从下列公式来计算:
存在关于此式的优化形式,以简化数学运算,但这里只是为了解释原理。为了将它用作连续的音调探测器,在执行了此计算之后,y[-1]和y[-2]应该再次设定为零,然后进行下一个采集和探测顺序。
代码实施-音频报警合成
定时信号发生器代码
定时信号发生器代码包括定时器0的初始化,以及用于处理定时器0中断的中断服务程序。这提供用于生成报警音调的40μs(25kHz)定时,以及软件计数器生成的1ms定时。后者被包络发生器和音符定序器所用。
定时器0初始化
定时器0需要进行初始化,以每隔40μs生成一个匹配中断,从而提供25kHz的采样速率。下面给出了初始化代码。
定时器0中断服务程序
定时器0中断服务程序是本应用程序的心脏,因为它为音调生成以及音调定序提供所有计时。本代码进行试验,以查看包络是否启用,如果是,它将输出音调。除了清除中断以外,软件计数器被递增,直到达到1ms的超时。在每一次1ms超时发生时,定序器的状态就被递增,而且任何需要的动作将由包络发生器执行(将在以后讨论)。下面显示了关于定时器0中断服务程序的代码列表。
包络控制功能
包络发生器控制音调的动态水平,因为IEC60601-1-8要求上升时间和下降时间应该处在规定的范围内。还有,报警顺序中的第一个音符的振幅应该低于其它音符。包络发生器输出是变量“包络”。当音调关闭时,包络=0。当在顺序中打开一个音符时,包络变量将每毫秒以设定的速率增大,直到它达到设定的最大水平。当音符关闭时,音调继续,但包络变量开始以其设定的速率减小,直到它达到“0”。包络变量将被用作音符的动态特征的音量控制。下面给出了包络控制功能的列表:
音符定序器功能
音符定序器为IEC60601-1-8中规定的不同报警旋律提供计时和音符定序。高级优先权报警包括重复的5音符顺序。相同报警范畴的中等优先权形式使用其高级优先权报警的前三个音符,但不重复。高级优先权报警的音符间隔和持续时间比较短,因为这能给出紧急程度的较高感觉。以高级优先权为例,下面显示了实施这些功能的代码。在定时器0中断服务程序中讨论的1ms时基增大顺序计数器。作为其结果,与每个情况语句相关联的数字均以毫秒为单位,以方便计时期间的调整。中等和低级优先权形式使用相同的基本开关语句格式和类似的函数调用,但是,由于节拍不同,在相关的情况语句中使用了不同的计时状态。
音符发生器功能
对于音符发生器,存在许多需要处理的数据,它们涉及到多重频率和多重正弦波发生器。如果将与每个频率相关的数据变量和常数组织在具有相同尺寸的矩阵中,那么就能恰好使用简单递归函数来“走”过这些矩阵数据。
音符发生器定义
定义若干个定点和浮点常数,以及定义结构标签和两个矩阵。它们当中之一是结构的一个矩阵。
算法中使用的变量和系数之结构的优点是:它允许我们在结构矩阵和频率常数矩阵中具有类似的矩阵组织。常数频率矩阵和算法结构矩阵之间的一一对应关系使得在初始化每个频率时,容易使用两个矩阵的类似索引。
音符发生器初始化
上文提到为了使Goertzel算法能振荡,除了系数以外,y[-1]和y[-2]值也必须初始化。必须针对对应于每个频率的结构变量而完成此工作。下面显示了用于初始化的代码。一排5个结构中的每一个被初始化,然后每一个另外的排被初始化,直到整个结构矩阵都被初始化。在这个演示应用程序中,这些计算是在复位初始化期间完成的。不过,如果你正在最优化它,可以通过事先进行这些计算而将代码保存起来,并且将结果作为常数储存在快速存储器中。这是因为,如果数学程序库需要浮点和正弦/余弦算法,那么预先计算好的初始化值则不需要。这些程序库例行程序使用大约一半本应用程序中使用的代码空间。系数和初始化值是通过32768(带符号的短值)定标的。还有,系数计算不包括公式(18)中显示的2X系数。其目的是使系数的规模保持在带符号的短值,以最小化储存要求。2X被包括在最终Goertzel计算中;此处,输出的定标是通过>>14(而不是>>15)乘以2。
多重正弦波发生、求和及DAC输出
一旦算法变量和系数都已经被初始化,那么,让Goertzel计算来生成基本音符和4个谐波就变得很容易。方法是简单地递增通过结构矩阵中的一排,并且求五个值的和。正如上文所述,第204行包括通过>>14、而不是>>15定标到2X中的系数,而这些系数在初始化时不予考虑。
一旦函数已经完成了矩阵排中所有5个结构的计算,相加的值就被定标、格式化、并从带符号的值转化为不带符号的值,然后被送到DAC。由于这些计算是在每个25kHz定时器中断处执行的(当音符活跃时),所以DAC输出速率就是25 kHz。这允许使用便宜的输出滤波器,因为相对于正在生成的最高正弦波频率,这大约是9X的过度取样。
用户/命令接口
对于为本应用程序编写的演示固件,Keil MCB1700被确定为目标板,而UART1则被用来提供菜单驱动的终端接口,以激活不同的报警。为了保持应用规格书的简明性,本文没有显示UART代码。只显示了命令功能之一的代码示例,作为如何使用本固件来启动报警顺序的演示。
启动报警顺序需要的全部工作是使用“报警”变量设定报警类型,然后通过将“顺序”变量设定到一个非零值而启用定序器。
IEC60601-1-8音频报警演示操作
复位菜单
MCB1700加载完IEC音频报警固件后,当MCB1700上的COM1接口连接到运行HyperTerminal、TeraTerm或类似终端程序的PC上时,复位以后,用户就会看到具有下列菜单的提示:串口设置为9600比特率、一个开始位、一个停止位、无奇偶校验、无流量控制。
图2 复位菜单
图3 高级优先权报警菜单
按下1到8之间的任意一个数字,然后按下回车,将开始对应报警类型的高级优先权报警顺序。类似的菜单动作将针对中等优先权、低级优先权和试验菜单而获得,参见图4、图5、和图6中所示。
图4 中等优先权菜单
图5 低级优先权菜单
图6 和试验菜单
试验菜单中的命令提供了具有谐波的最高和最低频率音调的短1秒脉冲,以及本应用程序所需要的最高和最低单一频率音调。这是为了方便进行性能试验。单一音调的生成是通过让‘ToneWeights’矩阵中的所有值都等于0,但正在生成的隔离音调除外。命令5将所有ToneWeights矩阵值都复位到它们的初始值。
外部硬件要求
外部DAC滤波器
对于在应用规格书中做的试验,增加了一个简单的三极RC滤波器,以便从信号中过滤掉25kHz采样速率分量。使用的滤波器如图7所示,它提供的截取频率范围处在9kHz到10kHz。由于样品速率高于正常人类听觉范围,所以没有滤波器,成本敏感的应用程序就可以通过。另外,在这个网络之后通常需要一个耦合电容器,因为DAC的直流电平一般为1.65 V。
图7 三极RC DAC滤波器
如果不打算成为高的阻抗输入,或者这个信号是外部固定的,那么建议使用缓冲器。
性能分析
通过使用上一段描述的输出滤波器,执行了波谱分析试验,以验证信号的频谱含量,并估计信噪比。此外,还进行了示波器捕捉,以显示生成的警报音调的升降和其它瞬时特征。MCB1700 DAC的输出被馈送到Mackie CR1604-VLZ音频混合器(用于平频率响应的EQ集),以便给笔记本电脑内部Sigmatel Codec提供正确的电平。笔记本电脑正在运行True Audio的TrueRTA波谱分析仪软件包。前文已详细描述过的试验菜单被用来提供分析中使用的试验音调脉冲。
利用DAC滤波器的多重音调生成的波谱分析
利用上文详细描述的三极10kHz RC滤波器之后获得的板输出,进行下列波谱分析仪捕捉。
具有谐波的应用程序(C4)中最低频率音调的波谱如图8所示。这些谐波在振幅方面互相非常接近。这将容易地满足IEC 60601-1-8技术规格,因为它们只要求谐波处在互相之间15 dB的范围内。信噪比看起来超过55dB,也能提供非常好的噪声性能。波谱分析中显示的缺少其它谐波也证明了由Goertzel算法生成的正弦波的扭曲很低。
图8 具有谐波的C4
图9显示了在具有谐波的应用程序(C5)中最高频率音调的波谱分析。由图可知,具有谐波的C5音调的波谱也具有良好的信噪比和低扭曲,而且能够将基本音符和谐波的振幅保持在几个分贝的范围内。
图9 具有谐波的C5
结论
本应用中呈现的医疗报警的方法为符合IEC60601-1-8标准的音频医疗警报提供了一种有效、低成本、高性能的方法。技术规格也说明,在报警声音方面设备差异的细微程度对于操作人员是有利的。除了能满足标准的要求以外,此处提供的固件实施允许容易地自定义音调,同时仍然能够保持在技术规格参数范围以内。基于ARM Cortex-M3内核的NXP LPC17xx系列微控制器能提供非常高速度的性能和准确的定时,这特别适合于实施类似于本示例中使用的算法。利用在96 MHz的频率下运行的LPC1768处理器,本应用程序使用大约8 %的可用处理器带宽和小于10K的代码空间,这样就为其它附加的应用程序留出了大量的代码空间和处理能力。因此,非常容易将对IEC60601-1-8标准的支持增加到任何医疗电子应用中。
- 基于ARM微处理器的十回路智能配电监控单元的设计(11-17)
- 基于LPC2119的微弧氧化电源控制系统设计(08-14)
- 基于LPC2119的配电控制模块设计(02-27)
- 基于LPC2294的泵舱信号转换电路设计(10-16)
- 基于LPC2294处理器的嵌入式PLC的设计(一)(10-08)
- 基于LPC2132数字信号源的设计与实现(12-22)