一个iOS噪音计模型、以及测量原理及分贝计算

简介: 最近在办公室觉得有点吵,然后忽然想做一个噪音计测试一下噪音,在App Store下载了几款测噪音软件,使用原来都大同小异。于是决定自己实现测噪音的原理。

前言

最近在办公室觉得有点吵,然后忽然想做一个噪音计测试一下噪音,在App Store下载了几款测噪音软件,使用原来都大同小异。于是决定自己实现测噪音的原理。

分贝dB

首先要测量噪音,必须知道噪音的大小的参考的单位为分贝(dB),分贝的定义如下:

SPL = 20lg[p(e)/p(ref)]

p(e)为待测的有效声压,p(ref)为参考声压,一般取2*10E-5帕,这是人耳能分辨的最小声压(1KHz)。

就是说噪音每增加20dB,声压增强了10倍。

iOS测噪音原理

iOS设备测量噪音原理非常简单:调用系统麦克风,根据麦克风输入强度计算转化为对应的dB值。但是,实现的过程可是坑满满。

找到了一篇博客介绍iOS硬件的调用:iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

iOS的AVFoundation框架中有一个AVAudioRecorder类专门处理录音操作,详见Apple文档

AVAudioRecorder.h中找到下列方法

- (void)updateMeters; /* call to refresh meter values */ 更新麦克风测量值
- (float)peakPowerForChannel:(NSUInteger)channelNumber; /* returns peak power in decibels for a given channel */ 获取峰值
- (float)averagePowerForChannel:(NSUInteger)channelNumber; /* returns average power in decibels for a given channel */ 获取平局值

- (float)averagePowerForChannel:(NSUInteger)channelNumber;文档中描述:

Return Value

The current average power, in decibels, for the sound being recorded. A return value of 0 dB indicates full scale, or maximum power; a return value of -160 dB indicates minimum power (that is, near silence).

If the signal provided to the audio recorder exceeds ±full scale, then the return value may exceed 0 (that is, it may enter the positive range).

Discussion

To obtain a current average power value, you must call the updateMeters method before calling this method.

也就是说获取的麦克风测量值返回值范围为 -160dB ~ 0dB,并且注意最后那句话返回值可能超过0。

转化公式

获取的的测量值为 -160 ~ 0dB ,如何转化为我们所要的噪音值呢?在网上找了很多资料都没有结果,于是就自己摸索转化公式。

刚开始想到的是利用分贝计算公式SPL = 20lg[p(e)/p(ref)]进行计算,后来直接放弃这个方案,因为这是一个对数运算,获取到的值非常稳定,几乎不会波动,与其他的测噪软件所得的分贝值出入太大。

然后发现有个App在麦克风没有输入时显示-55dB

于是思路就有了。

其他测噪音软件的量程均为0~110dB,而我们获取的的测量值为 -160 ~ 0dB,两者之间差了50dB,也就是说以麦克风的测量值的-160dB+50dB = -110dB作为起点,0dB作为Max值,恰好量程为0~110dB.

问题看似结束,但是直接以50dB作为补偿测量结果会偏大。最后选择了分段进行处理,代码如下


-(void)audioPowerChange{
    
    [self.audioRecorder updateMeters];//更新测量值
    float power = [self.audioRecorder averagePowerForChannel:0];// 均值
    float powerMax = [self.audioRecorder peakPowerForChannel:0];// 峰值
    NSLog(@"power = %f, powerMax = %f",power, powerMax);
    
    CGFloat progress = (1.0 / 160.0) * (power + 160.0);
    
    // 关键代码
    power = power + 160  - 50;
    
    int dB = 0;
    if (power < 0.f) {
        dB = 0;
    } else if (power < 40.f) {
        dB = (int)(power * 0.875);
    } else if (power < 100.f) {
        dB = (int)(power - 15);
    } else if (power < 110.f) {
        dB = (int)(power * 2.5 - 165);
    } else {
        dB = 110;
    }
    
    NSLog(@"progress = %f, dB = %d", progress, dB);
    self.powerLabel.text = [NSString stringWithFormat:@"%ddB", dB];
    [self.audioPowerProgress setProgress:progress];

}

效果

效果如下:

目录
相关文章
|
2月前
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
31 0
|
4月前
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
40 0
|
8月前
|
C语言 索引
09-iOS之load和initialize底层调用原理分析
09-iOS之load和initialize底层调用原理分析
60 0
|
3月前
|
安全 前端开发 数据安全/隐私保护
【教程】 iOS混淆加固原理篇
本文介绍了iOS应用程序混淆加固的缘由,编译过程以及常见的加固类型和逆向工具。详细讨论了字符串混淆、类名、方法名混淆、程序结构混淆加密等加固类型,并介绍了常见的逆向工具和代码虚拟化技术。
|
4月前
|
机器学习/深度学习 PyTorch TensorFlow
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
34 0
|
4月前
|
安全 算法 前端开发
【完整版教程】iOS混淆加固原理篇
在iOS开发中,应用程序的安全性和保护显得尤为重要。由于iOS系统的开放性,一些逆向工具可以轻松地对应用程序进行反编译和分析,从而导致应用程序源代码、算法和敏感信息的泄露。为了保护应用程序的安全性,我们需要对应用程序进行混淆加固。本文将介绍iOS混淆加固的原理和常见的加固类型。
|
4月前
|
JSON 安全 数据安全/隐私保护
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
20 0
|
4月前
|
安全 数据安全/隐私保护 iOS开发
【iOS开发】iOS App的加固保护原理:使用ipaguard混淆加固
【iOS开发】iOS App的加固保护原理:使用ipaguard混淆加固
50 0
|
5月前
|
JSON 安全 数据安全/隐私保护
​iOS Class Guard github用法、工作原理和安装详解及使用经验总结
iOS Class Guard是一个用于OC类、协议、属性和方法名混淆的命令行工具。它是class-dump的扩展。这个工具会生成一个symbol table,这个table在编译期间会包含进工程中。iOS-Class-Guard能有效的隐藏绝大多数的类、协议、方法、属性和 实例变量 名。iOS-Class-Guard不是应用安全的最终解决方案,但是它绝对能让攻击者更难读懂你的程序。iOS-Class-Guard会加大代码分析和runtime检查的难度,这个工具可以认为是一个简单基础的混淆方法。由于OC的架构决定了iOS应用程序的剖析相当简单,check out一下链接就知晓了:
|
6月前
|
安全 数据安全/隐私保护 iOS开发
【iOS开发】iOS App的加固保护原理:使用ipaguard混淆加固 摘要
随着智能手机的普及,越来越多的用户使用iOS设备来处理日常任务,因此iOS应用程序的安全性变得越来越重要。为了防止应用程序被攻击或破解,开发人员需要采用一些保护措施来加固应用程序。本文将介绍一种使用ipaguard混淆加固的方法来保护iOS应用的安全。