噪音检测说明文档

1. 系统功能设计与分析

(1)噪声分贝检测功能模块
为了实现用户对周围声音进行分贝实时监测的功能,用户通过点击开
始按钮开始进行监测,和当前检测到的噪声的大小。用户上传的噪声信息会关联到分享模块中,获取用户的手机坐标位置是为了在地图上定位,以便绘制噪声地图,这样的得到的噪声地图,有时间、声音大小、更真实、形象,也更符合大众的生活化需求。在噪声检测页面,为了考虑用户的视觉多元化需求,设计了以波浪线的表达方式动态显示噪声的变化,同时为了直观精确,在旁边又加入了数字表达的方式,满足了多年龄层人群的不同需求,不仅有动画效果的趣味性,而且有数字显示保证准确性。主界面效果图如下所示。

Simulator Screen Shot 2017年6月9日 上午9.06.56.png

(2)噪声频率监测模块:这个模块主要是为用户提供一些有关噪声频率信息,是用户能够更全面了解身边的声音信息。


Simulator Screen Shot 2017年6月9日 上午9.08.57.png

2. 实现思路及核心代码

(1)噪声分贝模块
声音采集使用系统的AVFoundation框架,首先在工程引入该框架。该框架中的AVAudioSession单利类负责大部分音频的处理。其中噪声检测模块主要使用AVAudioRecorder创建一个录音机获取噪音输入。在使用前必须进行音频会话的初始化:

-(void)setAudioSession{
    AVAudioSession *audioSession=[AVAudioSession sharedInstance];
    //设置为播放和录音状态,以便可以在录制完之后播放录音
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    [audioSession setActive:YES error:nil];
}

进行录音文件的设置:

- (NSDictionary *)getAudioSetting {
    NSMutableDictionary *dicM = [NSMutableDictionary dictionary];
    // 设置录音格式为lpcm
    [dicM setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];
    // 设置录音采样率,8000是电话采样率,对于一般录音已经够了
    [dicM setObject:@(8000) forKey:AVSampleRateKey];
    // 声道
    [dicM setObject:@(2) forKey:AVNumberOfChannelsKey];
    // 每个采样点位数
    [dicM setObject:@(8) forKey:AVLinearPCMBitDepthKey];
    // 是否使用浮点数采样
    [dicM setObject:@(YES) forKey:AVLinearPCMIsFloatKey];
    // 录音品质
    [dicM setObject:@(AVAudioQualityHigh) forKey:AVSampleRateConverterAudioQualityKey];
    return dicM;
}

因为要实时的检测当前环境的噪音分贝值,所以需要开启定时器:

-(NSTimer *)timer {  \\使用延迟加载的方式
    if (!_timer) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(audioPowerChange) userInfo:nil repeats:YES];
    }
    return _timer;
}

接下来进行声音分贝的计算,power 为均值,powerMax为峰值,注意每次计算之前要调用updateMeters进行更新测量值, 获取到分贝值后使用setGaugeValue 进行UI表盘的刻度显示。

-(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.test.retLabel.text = [NSString stringWithFormat:@"%d db", dB];
    [self.test setGaugeValue:dB animation:YES];
}

(2)频率监测模块
该模块使用控制器HZViewController完成。该控制器含有四个成员。
其中EZAudioPlot继承自UIView,该类负责实时显示当前的频率图谱的绘制,EZMicrophone负责采集音频,EZAudioFFTRolling负责生意相关的傅立叶计算。因为EZAudioPlot相关类基于AVFoundation框架,所以在使用前必须设置AVAudioSession:

AVAudioSession *session = [AVAudioSession sharedInstance];
    NSError *error;
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

HZViewController控制器必须实现代理EZMicrophoneDelegate

#pragma mark - EZMicrophoneDelegate
//------------------------------------------------------------------------------

-(void)    microphone:(EZMicrophone *)microphone
     hasAudioReceived:(float **)buffer
       withBufferSize:(UInt32)bufferSize
 withNumberOfChannels:(UInt32)numberOfChannels
{
    //
    // Calculate the FFT, will trigger EZAudioFFTDelegate
    //
    [self.fft computeFFTWithBuffer:buffer[0] withBufferSize:bufferSize];
    
    __weak typeof (self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{
        [weakSelf.audioPlotTime updateBuffer:buffer[0]
                              withBufferSize:bufferSize];
    });
}

//------------------------------------------------------------------------------
#pragma mark - EZAudioFFTDelegate
//------------------------------------------------------------------------------

- (void)        fft:(EZAudioFFT *)fft
 updatedWithFFTData:(float *)fftData
         bufferSize:(vDSP_Length)bufferSize
{
    float maxFrequency = [fft maxFrequency];
    NSString *noteName = [EZAudioUtilities noteNameStringForFrequency:maxFrequency
                                                        includeOctave:YES];
    NSLog(@"---->%@", noteName);
    __weak typeof (self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{
//        weakSelf.maxFrequencyLabel.text = [NSString stringWithFormat:@"Highest Note: %@,\nFrequency: %.2f", noteName, maxFrequency];
        weakSelf.coorView.heighNoteLabel.text = noteName;
        weakSelf.coorView.hzValueLabel.text = [NSString stringWithFormat:@"%.2f", maxFrequency];
        [weakSelf.audioPlotFreq updateBuffer:fftData withBufferSize:(UInt32)bufferSize];
    });
}

WHCoordinateView类继承自UIView,该类负责x,y坐标系的绘制。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,963评论 25 707
  • 不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘...
    大川无敌阅读 13,840评论 0 29
  • 林肯说“一滴蜂蜜比一加仑胆汁能捕到更多的苍蝇”正如太阳和风的故事: 太阳和风在争论谁更强更有力。风说他能比太阳更快...
    Joyce小熊阅读 780评论 0 0
  • D83 今天下午看到一个朋友发的朋友圈,给我笑了半天,虽然我也不能清楚地说出笑点在哪,哈哈。 首先他发的这个图片里...
    当额咧阅读 218评论 0 0
  • 漫天繁星中的一颗,虽然明亮却容易被人遗忘;宇宙中的光源,独一无二,点亮自己,照亮别人,受世人敬仰。——小筑 前几天...
    贤雅小筑阅读 297评论 0 2