一种背景噪声自适应的异常声音检测方法及系统
(一)技术领域
本发明涉及声音信号处理领域,具体涉及一种背景噪声自适应的异常声音检测方法及系统。
(二)背景技术
在日常生活中,各种突发事件会产生异常声音,对其进行检测分析可以推送报警信息给用户,可有效预防异常事件。例如仓库被盗时异常波动的声音信号、ATM自助银行内用户被抢劫时的喊叫打斗声、工厂机器停转导致的声音异常降低等,均可通过异常声音检测获取报警信息,降低用户人身安全威胁和财产损失。
一种典型异常声音检测方法及装置CN201410850883.5,其采用声谱图构造识别特征矩阵的方法,相对时域运算具有较高复杂度,在有限资源的嵌入式设备中集成难度较大,且实时性不能保证;且该发明需要提前训练异常声音样本库,在安防监控领域各种异常声音不可预测,样本库也无法覆盖所有异常声音类型,例如在封闭金库等场景下,只要有声音信号的波动需立即报警,此时需要检测的是声音信号的异常波动,而不是异常声音的分类情况,因此基于分类的异常声音检测有可能失效。
异常声音检测方法及系统CN201410765322.5,其采用时域能量与过零率为运算基础,但是其没有考虑背景噪声情况,麦克风拾取到的声音信号主要包括目标声音与背景噪声,例如在ATM自助银行拾取的声音可能会有街道噪声、下雨声、风声等,如果不通过一定算法将此类声音去除,会造成异常声音检测的误报率很高。
(三)发明内容
本发明针对现有技术的不足之处,提供一种背景噪声自适应的异常声音检测方法及系统,该方法及系统,在能量陡升检测中,将声音信号和背景噪声区分开,避免由于噪声信号波动造成的误报警;同时提出了一种背景噪声陡降检测方法,可以有效监控工厂机器运转、麦克风被蒙蔽、麦克风损坏等情况。
本发明是通过如下技术方案实现的:
一种背景噪声自适应的异常声音检测系统,包括通用模块,该通用模块包括:
分帧模块:对声音信号s(n)进行分帧;
帧信号RMS能量模块:计算一帧信号RMS值,记为frame_energy,
其特殊之处在于:还包括能量陡升检测模块,
其中,
能量陡升检测模块包括:
背景噪声超时未更新检测模块:设置计时器,若超过一定时间timeout_th还未更新背景噪声,则强制把当前帧信号RMS能量更新为背景噪声能量;
背景噪声判定模块:通过计算背景噪声缓冲区均值估计背景噪声,通过当前帧信号RMS能量与估计的背景噪声做差,差值大于一定门限则认为当前帧为异常声音信号帧;否则为背景噪声帧;
更新背景噪声能量模块:当前帧为背景噪声帧,则将当前帧信号RMS能量更新到背景噪声缓冲区中;
异常声音信号能量模块:当前帧为异常声音信号帧时,则将当前帧信号RMS能量更新为异常声音信号能量,即signal_energy=frame_energy;
能量陡升判决模块:此模块主要有硬门限判决和差值门限判决共同作用,具体为:
signal_energy>energy_th
或
signal_energy - bg_energy_avg>energy_diff_th,
则t_count=t_count+1,否则t_count=0,
其中,
bg_energy_avg为背景噪声缓冲区均值,
bg_update_th为背景噪声更新门限,
energy_th为硬门限,
energy_diff_th为差值门限,反应了能量和背景噪声的差值,
t_count为陡升连续帧计数器,用于陡升连续帧判决;
陡升连续帧判决模块:若t_count > t_count_th,则有连续t_count帧的信号为能量陡升信号,判断有能量陡升情况;
输出能量陡升报警信号模块:输出能量陡升信号。
所述的背景噪声自适应的异常声音检测系统,还包括背景噪声陡降检测模块,
所述背景噪声陡降检测模块包括:
更新历史背景噪声能量模块:历史背景噪声定义为从当前帧开始,往前一段时间的背景噪声;
背景噪声陡降判别模块:若历史背景噪声与当前背景噪声缓冲区均值的差值超过一定门限,则判别为背景噪声陡降;
输出背景噪声陡降报警信号模块:输出背景噪声陡降报警信号。
其中,
通过计算帧信号frame(n)的RMS激励平均值,在量化位数上归一化,并且取对数,得到帧信号RMS能量。
背景噪声判定模块:判定当前帧是背景噪声还是异常声音信号时,若frame_energy-bg_energy_avg>bg_update_th,则bg_flag=0,表示当前帧信号不是背景噪声,否则bg_flag=1,表示当前帧信号为背景噪声。
背景噪声自适应的异常声音检测方法,包括以下步骤:
S101:获取音频流数据s(n);
S102:对声音信号s(n)进行分帧, 分帧后信号为frame(n);
S103:帧信号RMS能量,计算一帧信号RMS值,通过计算帧信号frame(n)的RMS激励平均值,在量化位数上归一化,并且取对数,即可得到帧信号RMS能量,记为frame_energy;
S104:设置计时器,若超过一定时间timeout_th还未更新背景噪声,则强制把当前帧信号RMS能量更新为背景噪声能量;
S105:背景噪声判定,通过计算背景噪声缓冲区均值估计背景噪声,通过当前帧信号RMS能量与估计的背景噪声做差,差值大于一定门限则认为当前帧为异常声音信号帧,否则为背景噪声帧,当前帧信号不是背景噪声,执行S106;当前帧信号为背景噪声,执行S110;
S110:更新背景噪声能量、更新历史背景噪声能量,
a.更新背景噪声能量:
如果当前帧信号为背景噪声,则将当前帧信号RMS能量更新到背景噪声缓冲区中;
b.更新历史背景噪声能量:
历史背景噪声为从当前帧开始,往前一段时间的背景噪声,并且随着时间推移,历史背景噪声不断更新,下一步跳转至S111;
S106:如果当前帧信号不是背景噪声,则将当前帧信号RMS能量更新为异常声音信号能量,即signal_energy=frame_energy;
S107:能量陡升判决,此模块通过有硬门限判决和差值门限判决共同作用,
具体为:
signal_energy>energy_th或
signal_energy - bg_energy_avg>energy_diff_th,
则t_count=t_count+1,下一步执行S108;否则t_count=0跳转至S113;
S108:陡升连续帧判决,若t_count > t_count_th,则认为已经有连续t_count帧的信号为能量陡升信号,可以判断有能量陡升情况,执行S109,否则执行S113;
S109:输出能量陡升报警信号,下一步执行S113;
S111: 背景噪声陡降判别,若历史背景噪声与当前背景噪声缓冲区均值的差值超过一定门限,
即bg_energy_bf – bg_energy_avg>bg_energy_drop_th,
则判别为背景噪声陡降,执行S112,否则跳转到S113;
S112:输出背景噪声陡降报警信号,下一步执行S113。
S113:结束,当前帧信号处理结束,转至处理下一帧。
其中,
步骤S102中,对声音信号s(n)进行分帧时,分帧采用10-30ms作为帧长,帧移为0,
步骤S103中,量化位数dig_bit=8-32,
步骤S104中,若超过timeout_th=1-1000还未更新背景噪声,则强制把当前帧信号RMS能量更新为背景噪声,
步骤S105中, bg_update_th=0.1-20(dbfs),背景噪声缓冲区长度bg_buf_len=1-50。
步骤S110 b.更新历史背景噪声能量中,历史背景噪声帧间隔为10-100帧。
步骤S107中,硬门限energy_th=1-99,差值门限energy_diff_th=1-99。
步骤S108中,t_count_th=1-50。
步骤S111中,bg_energy_drop_th=1-99。
优选方案为:
步骤S102中,对声音信号s(n)进行分帧时,分帧采用20ms作为帧长,帧移为0,
步骤S103中,量化位数dig_bit=16,
步骤S104中,若超过timeout_th=500还未更新背景噪声,则强制把当前帧信号RMS能量更新为背景噪声,
步骤S105中, bg_update_th=3(dbfs),背景噪声缓冲区长度bg_buf_len=5,步骤S110 b.更新历史背景噪声能量中,历史背景噪声帧间隔为75帧,75帧对应时间为1.5秒,
步骤S107中,硬门限energy_th=93,差值门限energy_diff_th=20,
步骤S108中,t_count_th=5,
步骤S111中,bg_energy_drop_th=19。
本发明的有益效果:
本发明全部处理过程在时域,相比现有技术的频域处理,运算量小,复杂度低,可以有效集成到大多数嵌入式设备;
本发明独创性的提出了能量陡升检测方法,将背景噪声和声音信号能量简单分离,运用了声音信号能量和背景噪声能量差值检测,异常声音报警门限可以根据背景噪声能量的变化而自动调整,有效避免硬门限的局限性,从而实现了背景噪声能量自适应的异常声音检测功能;
本发明提出背景噪声陡降检测方法,可有效检测工厂机器停转,麦克风被蒙蔽,麦克风损坏等情况。
(四)附图说明
附图1为本发明流程图;
附图2为本发明的系统框图,
图中,21通用模块,211分帧模块,212帧信号RMS能量模块,22能量陡升检测模块,221背景噪声超时未更新检测模块,222背景噪声判定模块,223更新背景噪声能量模块,224异常声音信号能量模块,225能量陡升判决模块,226陡升连续帧判决模块,227输出能量陡升报警信号模块,23背景噪声陡降检测模块,231更新历史背景噪声能量模块,232背景噪声陡降判别模块,233输出背景噪声陡降报警信号模块。
(五)具体实施方式
以下通过实施例对本发明进行更详细的描述,但本发明的保护范围并不限于这些实施例。
实施例1
本发明主要有三个部分组成,通用模块21,能量陡升检测模块22,背景噪声陡降检测模块23。所有模块全部在时域处理,不涉及频域变换,相对复杂度低,运算速度快。
通用模块21包括分帧模块211和帧信号RMS能量模块212
分帧模块211:声音信号s(n)包含语音信号,由于语音信号具有10ms-30ms的短时平稳性,按照语音信号短时平稳性进行分帧,分帧后信号为frame(n),因为处理完全是时域能量处理,所以使用矩形窗分帧即可。帧长为N,分帧后的信号为frame(n)。
帧信号RMS能量模块212:计算一帧信号RMS值,通过计算帧信号frame(n)的RMS激励平均值,在量化位数上归一化,并且取对数,即可得到帧信号RMS能量,记为frame_energy。
能量陡升检测模块22主要包括背景噪声超时未更新检测模块221,背景噪声判定模块222,更新背景噪声能量模块223,异常声音信号能量模块224,能量陡升判决模块225,陡升连续帧判决模块226,输出能量陡升报警信号模块227。
背景噪声超时未更新检测模块221:若长时间未更新背景噪声,可能由于背景噪声误判为异常声音信号导致无法更新背景噪声,所以需要设置一个计时器,若超过一定时间timeout_th还未更新背景噪声,则强制把当前帧信号RMS能量更新为背景噪声能量。
背景噪声判定模块222:此模块主要功能是判定当前帧是背景噪声还是异常声音信号,方法为通过计算背景噪声缓冲区均值估计背景噪声,通过当前帧信号RMS能量与估计的背景噪声做差,差值大于一定门限则认为当前帧为异常声音信号帧;否则为背景噪声帧。例如,frame_energy-bg_energy_avg>bg_update_th,则bg_flag=0,表示当前帧信号不是背景噪声,否则bg_flag=1,表示当前帧信号为背景噪声,其中bg_energy_avg为背景噪声缓冲区均值,bg_update_th背景噪声更新门限。
更新背景噪声能量模块223:如果bg_flag=1,则将当前帧信号RMS能量更新到背景噪声缓冲区中。
异常声音信号能量模块224:如果bg_flag=0,则将当前帧信号RMS能量更新为异常声音信号能量,即signal_energy=frame_energy。
能量陡升判决模块225:此模块主要有硬门限判决和差值门限判决共同作用,具体为signal_energy>energy_th或signal_energy - bg_energy_avg>energy_diff_th,则t_count=t_count+1,否则t_count=0;其中energy_th为硬门限,energy_diff_th为差值门限,反应了能量和背景噪声的差值,t_count为陡升连续帧计数器,用于陡升连续帧判决。
陡升连续帧判决模块226:若t_count > t_count_th,则认为已经有连续t_count帧的信号为能量陡升信号,可以判断有能量陡升情况。
输出能量陡升报警信号模块227:输出能量陡升信号。
背景噪声陡降检测模块23主要包括更新历史背景噪声能量模块231,背景噪声陡降判别模块232,输出背景噪声陡降报警信号模块233。
更新历史背景噪声能量模块231:历史背景噪声定义为从当前帧开始,往前一段时间的背景噪声。
背景噪声陡降判别模块232:若历史背景噪声与当前背景噪声缓冲区均值的差值超过一定门限,则判别为背景噪声陡降。
输出背景噪声陡降报警信号模块233:输出背景噪声陡降报警信号。
本实施例背景噪声自适应的异常声音检测系统异常声音检测方法具体步骤如下:
采样率8kHz,16bit量化,声音信号帧长20ms,即160个采样点。
S101:通常在此步骤获取音频流数据s(n);下一步执行S102。
S102:分帧,采用20ms作为帧长,帧移为0,使用矩形窗分帧即可,N=160为帧长, 分帧后信号为frame(n)。
下一步执行S103。
S103:帧信号RMS能量,计算一帧信号RMS值,通过计算帧信号frame(n)的RMS激励平均值,在量化位数上归一化,并且取对数,即可得到帧信号RMS能量,记为frame_energy。
在本实施例中量化位数dig_bit=16。
下一步执行S104。
S104:背景噪声超时未更新检测,若长时间未更新背景噪声,可能由于背景噪声误判为异常声音信号导致无法更新背景噪声,所以需要设置一个计时器,若超过帧数timeout_th=500(500帧为10秒)还未更新背景噪声,则跳转到S110,否则执行S105。
S105:背景噪声判定,此模块主要功能是判定当前帧是背景噪声还是异常声音信号,方法为通过计算背景噪声缓冲区均值估计背景噪声,通过当前帧信号RMS能量与估计的背景噪声做差,差值大于一定门限则认为当前帧为异常声音信号帧,否则为背景噪声帧。具体的:如果frame_energy-bg_energy_avg>bg_update_th,其中bg_update_th=3(dbfs),则bg_flag=0,表示当前帧信号不是背景噪声,执行S106;否则bg_flag=1,表示当前帧信号为背景噪声,执行S110;其中bg_energy_avg背景噪声缓冲区均值,背景噪声缓冲区在程序开始时初始化为全1数组,在本实施例中,背景噪声缓冲区长度bg_buf_len=5。
S110:更新背景噪声能量、更新历史背景噪声能量。
1.更新背景噪声能量:
如果bg_flag=1,则将当前帧信号RMS能量更新到背景噪声缓冲区中。
2.更新历史背景噪声能量:
历史背景噪声为从当前帧开始,往前一段时间的背景噪声,并且随着时间推移,历史背景噪声不断更新,本实施例取75帧(75帧对应时间为1.5秒)为历史背景噪声帧间隔。
下一步跳转至S111。
S106:异常声音信号能量,如果bg_flag=0,则将当前帧信号RMS能量更新为异常声音信号能量,即signal_energy=frame_energy。
下一步执行S107。
S107:能量陡升判决,此模块主要有硬门限判决和差值门限判决共同作用,具体为signal_energy>energy_th或signal_energy - bg_energy_avg>energy_diff_th,则t_count=t_count+1,下一步执行S108;否则t_count=0跳转至S113。
在本实施例中,energy_th=93为硬门限,energy_diff_th=20为差值门限,反应了能量和背景噪声的差值,t_count为陡升连续帧计数器,用于陡升连续帧判决。
S108:陡升连续帧判决,若t_count > t_count_th,则认为已经有连续t_count帧的信号为能量陡升信号,可以判断有能量陡升情况,执行S109,否则执行S113。本实施例中t_count_th=5。
S109:输出能量陡升报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S111: 背景噪声陡降判别,若历史背景噪声与当前背景噪声缓冲区均值的差值超过一定门限,即bg_energy_bf – bg_energy_avg>bg_energy_drop_th,则判别为背景噪声陡降,执行S112,否则跳转到S113。本实施例中bg_energy_drop_th=19。
S112:输出背景噪声陡降报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S113:结束,当前帧信号处理结束,可以转至下一帧处理。
实施例2
本实施例背景噪声自适应的异常声音检测系统异常声音检测方法具体步骤如下:
采样率11.025 kHz,8bit量化,声音信号帧长10ms,即110个采样点。
S101:通常在此步骤获取音频流数据s(n);下一步执行S102。
S102:分帧,采用10ms作为帧长,帧移为0,使用矩形窗分帧即可,N=110为帧长, 分帧后信号为frame(n)。
下一步执行S103。
S103:帧信号RMS能量,计算一帧信号RMS值,通过计算帧信号frame(n)的RMS激励平均值,在量化位数上归一化,并且取对数,即可得到帧信号RMS能量,记为frame_energy。
在本实施例中量化位数dig_bit=8。
下一步执行S104。
S104:背景噪声超时未更新检测,若长时间未更新背景噪声,可能由于背景噪声误判为异常声音信号导致无法更新背景噪声,所以需要设置一个计时器,若超过帧数timeout_th=1000(1000帧为10秒)还未更新背景噪声,则跳转到S110,否则执行S105。
S105:背景噪声判定,此模块主要功能是判定当前帧是背景噪声还是异常声音信号,方法为通过计算背景噪声缓冲区均值估计背景噪声,通过当前帧信号RMS能量与估计的背景噪声做差,差值大于一定门限则认为当前帧为异常声音信号帧,否则为背景噪声帧。具体的:如果frame_energy-bg_energy_avg>bg_update_th,其中bg_update_th=2(dbfs),则bg_flag=0,表示当前帧信号不是背景噪声,执行S106;否则bg_flag=1,表示当前帧信号为背景噪声,执行S110;其中bg_energy_avg背景噪声缓冲区均值,背景噪声缓冲区在程序开始时初始化为全1数组,在本实施例中,背景噪声缓冲区长度bg_buf_len=4。
S110:更新背景噪声能量、更新历史背景噪声能量。
1.更新背景噪声能量:
如果bg_flag=1,则将当前帧信号RMS能量更新到背景噪声缓冲区中。
2.更新历史背景噪声能量:
历史背景噪声为从当前帧开始,往前一段时间的背景噪声,并且随着时间推移,历史背景噪声不断更新,本实施例取150帧(150帧对应时间为1.5秒)为历史背景噪声帧间隔。
下一步跳转至S111。
S106:异常声音信号能量,如果bg_flag=0,则将当前帧信号RMS能量更新为异常声音信号能量,即signal_energy=frame_energy。
下一步执行S107。
S107:能量陡升判决,此模块主要有硬门限判决和差值门限判决共同作用,具体为signal_energy>energy_th或signal_energy - bg_energy_avg>energy_diff_th,则t_count=t_count+1,下一步执行S108;否则t_count=0跳转至S113。
在本实施例中,energy_th=87为硬门限,energy_diff_th=15为差值门限,反应了能量和背景噪声的差值,t_count为陡升连续帧计数器,用于陡升连续帧判决。
S108:陡升连续帧判决,若t_count > t_count_th,则认为已经有连续t_count帧的信号为能量陡升信号,可以判断有能量陡升情况,执行S109,否则执行S113。本实施例中t_count_th=3。
S109:输出能量陡升报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S111: 背景噪声陡降判别,若历史背景噪声与当前背景噪声缓冲区均值的差值超过一定门限,即bg_energy_bf – bg_energy_avg>bg_energy_drop_th,则判别为背景噪声陡降,执行S112,否则跳转到S113。本实施例中bg_energy_drop_th=15。
S112:输出背景噪声陡降报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S113:结束,当前帧信号处理结束,可以转至下一帧处理。
其他与实施例1相同。
实施例3
本实施例背景噪声自适应的异常声音检测系统异常声音检测方法具体步骤如下:
采样率8kHz,24bit量化,声音信号帧长30ms,即240个采样点。
S101:通常在此步骤获取音频流数据s(n);下一步执行S102。
S102:分帧,采用30ms作为帧长,帧移为0,使用矩形窗分帧即可,N=240为帧长, 分帧后信号为frame(n)。
下一步执行S103。
S103:帧信号RMS能量,计算一帧信号RMS值,通过计算帧信号frame(n)的RMS激励平均值,在量化位数上归一化,并且取对数,即可得到帧信号RMS能量,记为frame_energy。
在本实施例中量化位数dig_bit=24。
下一步执行S104。
S104:背景噪声超时未更新检测,若长时间未更新背景噪声,可能由于背景噪声误判为异常声音信号导致无法更新背景噪声,所以需要设置一个计时器,若超过帧数timeout_th=500(500帧为15秒)还未更新背景噪声,则跳转到S110,否则执行S105。
S105:背景噪声判定,此模块主要功能是判定当前帧是背景噪声还是异常声音信号,方法为通过计算背景噪声缓冲区均值估计背景噪声,通过当前帧信号RMS能量与估计的背景噪声做差,差值大于一定门限则认为当前帧为异常声音信号帧,否则为背景噪声帧。具体的:如果frame_energy-bg_energy_avg>bg_update_th,其中bg_update_th=5(dbfs),则bg_flag=0,表示当前帧信号不是背景噪声,执行S106;否则bg_flag=1,表示当前帧信号为背景噪声,执行S110;其中bg_energy_avg背景噪声缓冲区均值,背景噪声缓冲区在程序开始时初始化为全1数组,在本实施例中,背景噪声缓冲区长度bg_buf_len=7。
S110:更新背景噪声能量、更新历史背景噪声能量。
1.更新背景噪声能量:
如果bg_flag=1,则将当前帧信号RMS能量更新到背景噪声缓冲区中。
2.更新历史背景噪声能量:
历史背景噪声为从当前帧开始,往前一段时间的背景噪声,并且随着时间推移,历史背景噪声不断更新,本实施例取82帧(82帧对应时间为2.46秒)为历史背景噪声帧间隔。
下一步跳转至S111。
S106:异常声音信号能量,如果bg_flag=0,则将当前帧信号RMS能量更新为异常声音信号能量,即signal_energy=frame_energy。
下一步执行S107。
S107:能量陡升判决,此模块主要有硬门限判决和差值门限判决共同作用,具体为signal_energy>energy_th或signal_energy - bg_energy_avg>energy_diff_th,则t_count=t_count+1,下一步执行S108;否则t_count=0跳转至S113。
在本实施例中,energy_th=99为硬门限,energy_diff_th=25为差值门限,反应了能量和背景噪声的差值,t_count为陡升连续帧计数器,用于陡升连续帧判决。
S108:陡升连续帧判决,若t_count > t_count_th,则认为已经有连续t_count帧的信号为能量陡升信号,可以判断有能量陡升情况,执行S109,否则执行S113。本实施例中t_count_th=7。
S109:输出能量陡升报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S111: 背景噪声陡降判别,若历史背景噪声与当前背景噪声缓冲区均值的差值超过一定门限,即bg_energy_bf – bg_energy_avg>bg_energy_drop_th,则判别为背景噪声陡降,执行S112,否则跳转到S113。本实施例中bg_energy_drop_th=23。
S112:输出背景噪声陡降报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S113:结束,当前帧信号处理结束,可以转至下一帧处理。
其他与实施例1相同。
实施例4
本实施例背景噪声自适应的异常声音检测系统异常声音检测方法具体步骤如下:
采样率11.025 kHz,32bit量化,声音信号帧长20ms,即220个采样点。
S101:通常在此步骤获取音频流数据s(n);下一步执行S102。
S102:分帧,采用20ms作为帧长,帧移为0,使用矩形窗分帧即可,N=220为帧长, 分帧后信号为frame(n)。
下一步执行S103。
S103:帧信号RMS能量,计算一帧信号RMS值,通过计算帧信号frame(n)的RMS激励平均值,在量化位数上归一化,并且取对数,即可得到帧信号RMS能量,记为frame_energy。
在本实施例中量化位数dig_bit=32。
下一步执行S104。
S104:背景噪声超时未更新检测,若长时间未更新背景噪声,可能由于背景噪声误判为异常声音信号导致无法更新背景噪声,所以需要设置一个计时器,若超过帧数timeout_th=1(1帧为0.02秒)还未更新背景噪声,则跳转到S110,否则执行S105。
S105:背景噪声判定,此模块主要功能是判定当前帧是背景噪声还是异常声音信号,方法为通过计算背景噪声缓冲区均值估计背景噪声,通过当前帧信号RMS能量与估计的背景噪声做差,差值大于一定门限则认为当前帧为异常声音信号帧,否则为背景噪声帧。具体的:如果frame_energy-bg_energy_avg>bg_update_th,其中bg_update_th=0.1(dbfs),则bg_flag=0,表示当前帧信号不是背景噪声,执行S106;否则bg_flag=1,表示当前帧信号为背景噪声,执行S110;其中bg_energy_avg背景噪声缓冲区均值,背景噪声缓冲区在程序开始时初始化为全1数组,在本实施例中,背景噪声缓冲区长度bg_buf_len=1。
S110:更新背景噪声能量、更新历史背景噪声能量。
1.更新背景噪声能量:
如果bg_flag=1,则将当前帧信号RMS能量更新到背景噪声缓冲区中。
2.更新历史背景噪声能量:
历史背景噪声为从当前帧开始,往前一段时间的背景噪声,并且随着时间推移,历史背景噪声不断更新,本实施例取10帧(10帧对应时间为0.2秒)为历史背景噪声帧间隔。
下一步跳转至S111。
S106:异常声音信号能量,如果bg_flag=0,则将当前帧信号RMS能量更新为异常声音信号能量,即signal_energy=frame_energy。
下一步执行S107。
S107:能量陡升判决,此模块主要有硬门限判决和差值门限判决共同作用,具体为signal_energy>energy_th或signal_energy - bg_energy_avg>energy_diff_th,则t_count=t_count+1,下一步执行S108;否则t_count=0跳转至S113。
在本实施例中,energy_th=1为硬门限,energy_diff_th=1为差值门限,反应了能量和背景噪声的差值,t_count为陡升连续帧计数器,用于陡升连续帧判决。
S108:陡升连续帧判决,若t_count > t_count_th,则认为已经有连续t_count帧的信号为能量陡升信号,可以判断有能量陡升情况,执行S109,否则执行S113。本实施例中t_count_th=1。
S109:输出能量陡升报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S111: 背景噪声陡降判别,若历史背景噪声与当前背景噪声缓冲区均值的差值超过一定门限,即bg_energy_bf – bg_energy_avg>bg_energy_drop_th,则判别为背景噪声陡降,执行S112,否则跳转到S113。本实施例中bg_energy_drop_th=1。
S112:输出背景噪声陡降报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S113:结束,当前帧信号处理结束,可以转至下一帧处理。
其他与实施例1相同。
实施例5
本实施例背景噪声自适应的异常声音检测系统异常声音检测方法具体步骤如下:
采样率8kHz,24bit量化,声音信号帧长30ms,即240个采样点。
S101:通常在此步骤获取音频流数据s(n);下一步执行S102。
S102:分帧,采用30ms作为帧长,帧移为0,使用矩形窗分帧即可,N=240为帧长, 分帧后信号为frame(n)。
下一步执行S103。
S103:帧信号RMS能量,计算一帧信号RMS值,通过计算帧信号frame(n)的RMS激励平均值,在量化位数上归一化,并且取对数,即可得到帧信号RMS能量,记为frame_energy。
在本实施例中量化位数dig_bit=24。
下一步执行S104。
S104:背景噪声超时未更新检测,若长时间未更新背景噪声,可能由于背景噪声误判为异常声音信号导致无法更新背景噪声,所以需要设置一个计时器,若超过帧数timeout_th=500(500帧为15秒)还未更新背景噪声,则跳转到S110,否则执行S105。
S105:背景噪声判定,此模块主要功能是判定当前帧是背景噪声还是异常声音信号,方法为通过计算背景噪声缓冲区均值估计背景噪声,通过当前帧信号RMS能量与估计的背景噪声做差,差值大于一定门限则认为当前帧为异常声音信号帧,否则为背景噪声帧。具体的:如果frame_energy-bg_energy_avg>bg_update_th,其中bg_update_th=20(dbfs),则bg_flag=0,表示当前帧信号不是背景噪声,执行S106;否则bg_flag=1,表示当前帧信号为背景噪声,执行S110;其中bg_energy_avg背景噪声缓冲区均值,背景噪声缓冲区在程序开始时初始化为全1数组,在本实施例中,背景噪声缓冲区长度bg_buf_len=50。
S110:更新背景噪声能量、更新历史背景噪声能量。
1.更新背景噪声能量:
如果bg_flag=1,则将当前帧信号RMS能量更新到背景噪声缓冲区中。
2.更新历史背景噪声能量:
历史背景噪声为从当前帧开始,往前一段时间的背景噪声,并且随着时间推移,历史背景噪声不断更新,本实施例取82帧(82帧对应时间为2.46秒)为历史背景噪声帧间隔。
下一步跳转至S111。
S106:异常声音信号能量,如果bg_flag=0,则将当前帧信号RMS能量更新为异常声音信号能量,即signal_energy=frame_energy。
下一步执行S107。
S107:能量陡升判决,此模块主要有硬门限判决和差值门限判决共同作用,具体为signal_energy>energy_th或signal_energy - bg_energy_avg>energy_diff_th,则t_count=t_count+1,下一步执行S108;否则t_count=0跳转至S113。
在本实施例中,energy_th=99为硬门限,energy_diff_th=25为差值门限,反应了能量和背景噪声的差值,t_count为陡升连续帧计数器,用于陡升连续帧判决。
S108:陡升连续帧判决,若t_count > t_count_th,则认为已经有连续t_count帧的信号为能量陡升信号,可以判断有能量陡升情况,执行S109,否则执行S113。本实施例中t_count_th=50。
S109:输出能量陡升报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S111: 背景噪声陡降判别,若历史背景噪声与当前背景噪声缓冲区均值的差值超过一定门限,即bg_energy_bf – bg_energy_avg>bg_energy_drop_th,则判别为背景噪声陡降,执行S112,否则跳转到S113。本实施例中bg_energy_drop_th=99。
S112:输出背景噪声陡降报警信号,可以是高低电平信号,也可以是标志位。
下一步执行S113。
S113:结束,当前帧信号处理结束,可以转至下一帧处理。
其他与实施例1相同。