移动应用程序 调整铃声音量,避免环境噪音
【IT168技术文档】在某个阳光明媚的午后,您坐在当地一家咖啡馆里,心情平和地享受着宁静的时光,这时,您的电话响了。而且它被设置成最大音量,铃声如此之响,差点让您把咖啡打翻。所以您将声音调小了。
那天晚些时候,您在酒吧等一位朋友,但是他迟迟不来。实际上,他是忘记你们要见面的酒吧了,并打电话询问您在什么地方。不幸的是,您没有接到电话,因为您没有听见电话铃声。原来:铃声音量仍然处在之前调得很小的状态,而在嘈杂的酒吧里面根本听不见这么小的铃声。
如果您认为现在的移动电话处理功能可以与我用于多声道音频录音的第一台 PC 相媲美,那么这将是非常可笑的想法。如今的智能移动设备看起来拥有诸多功能,能访问诸多信息,因此这种问题不应该存在。但是,拥有移动电话的人都或多或少遇到过这种问题。
要解决该问题,显而易见的方法是记得更改音量设置。更改铃声音量的一个方案可能是区别对待不同环境中的声音差异,但实际功能并没有做到这一点。这些设备的反应能力应该多结合一点常识。其实很简单:我只要我的移动电话在安静的环境中不要发出太响的铃声,在嘈杂的地方又能够让我听得见铃声。
本文将探讨 Windows Mobile? 应用程序根据其当前环境中的环境噪音自动调整 Pocket PC 的铃声级别的可能性和实用性。此应用程序的功能将防止电话铃声太响或太轻,从而避免我陷入尴尬的境地和错过电话。在本文中,我将从此问题切入,着手介绍使用 Visual Studio 2005 和 C# 进行 Windows Mobile 开发。

电话铃声太响使您陷入尴尬?
解决方法
办法是利用移动电话的传感器获取对当前环境的更好了解。我想使用麦克风来测量环境噪音,然后相应地调整铃声水平。
我需要解决一系列具体问题才能使此方法行得通,如图 1 所示。我如何从内置于该设备的麦克风中获取音频采样呢?我该使用什么度量来定义响度?我该如何更改移动设备的铃声水平对这一响度作出反应?我将马上讨论此系统的第一部分,即从麦克风中收集环境信息。但是首先,我需要定义响度的度量。

图 1 调整铃声音量的高级步骤
响度是主观性的,通常由等响度图表表示。(有关声音主观感知的详细信息,我建议您查询一些有关心理声学研究的文章。) 这些图的一个轴上是频率,另一个轴上是声压度量,通常以分贝 (dB) 为单位。这些图表显示了频率和人们对等响度的感知之间的关系。
为了确定关系值,科学研究向参与者提供了很多音调,这些音调按不同频率,以 10dB 递增。研究参与者被要求判断何时声音具有与 1KHz 参考信号相比的等响度。然后,这些关系被用来构造表格和绘制等响度图表,它们与从电话麦克风中获取的频率信息一起,可用于创建响度的度量。
另一个方法是将声压水平的度量与参考值进行比较,并在发生重大变化时调整铃声水平。然后可以通过电话的配置文件来定义构成变化的条件。该方法克服了不同电话上不同麦克风和扬声器之间存在差异这个问题。只需更改参考值即可使软件能够针对各种电话型号有效地操作。这还意味着系统不必从麦克风中获取频率信息,从而节省宝贵的电池电量。
系统中的设计复杂性通过频率分解和 dB 测量的冗余得到了简化。但是,我的应用程序必须使用相对响度的度量。在音频信号处理中,可以使用均方根 (RMS) 作为响度的基本度量。(我将在说明实现阶段时详细介绍 RMS。) 尽管频率属性仍然影响着感知到的响度,但是对于准确性需求来说,RMS 值应该已经足够了——鉴于 Pocket PC 只有五个音量设置,那更是如此。RMS 函数可用于获取调整铃声音量所必需的值。
参考值
一旦从麦克风中获取采样并输入到 RMS 函数,输出必须映射到五个音量状态之一。什么是映射函数?这些设置如何与上文讨论的参考值关联起来?参考值对于每个设备都是特定的,它们用于定义何时移动电话铃声音量发生变化。例如,当 RMS 函数指出环境类似于某个咖啡馆或嘈杂的酒吧时,铃声水平应进行相应调整。
如果我打算扩展此应用程序,以支持多个设备的配置文件,我将提供一个界面以设置该应用程序。但是在本文中,我并未打算实现此类界面,让其他人来做吧。
为某个设备配置文件生成参考值的过程并不是很复杂。首先,使用应用程序的 RMS 报告功能获取适合您需要的多种参考情况下的参考值。我使用的是四种常见环境:晚间的住宅区 (45dB)、安静的室内餐厅或办公室 (55dB)、普通的室内餐厅 (65dB) 及约 16 英尺远的繁忙的交通区 (75dB)。这些值将是映射到 Pocket PC 上五个音量状态的参考。(很明显,我们需要一种工具来获取这些地点的各种 RMS 值。)
接着,在您得到所有这些地点的平均值后,您将使用这些值作为应用程序代码中的上限和下限。