分幀可以將一段較長聲音信號分成多個小段,使每小段聲音信號可以作為平穩(wěn)信號來處理. 為了使每一幀信號之間平滑地過渡,兩個相鄰幀之間需要有一些重疊區(qū)域. 本文中幀長選為50 ms,幀移長度選為幀長的1/3.
加窗可以避免因信號兩端不連續(xù)而導(dǎo)致的頻譜泄漏. 本文選用漢明窗作為窗函數(shù)w(n),若共有N個采樣點(diǎn),則第n個采樣點(diǎn)的窗函數(shù)公式為:
(2)
1.3 子帶譜熵法
1.3.1 算法介紹
子帶譜熵的思想是將每一幀的頻譜分成若干個子帶,這樣就消除了每一條譜線受噪聲影響的問題. 設(shè)每個子帶由4條譜線組成,共有Nb個子帶. 第i幀中的第n個子帶的譜線能量E(n,i)為:
(3)
式中,Yi(k)為傅里葉變換后的譜線能量. 子帶譜線能量的概率分布p(n,i)為:
(4)
引入一個正常量C,得到新的子帶譜線能量的概率分布式:
(5)
文獻(xiàn)[9]中推導(dǎo)證明,在噪聲環(huán)境下,引入正常量C后,分割的準(zhǔn)確度能得到提高. 本文中C取0.1. 子帶譜熵Hb(i)為:
(6)
1.3.2 算法流程
子帶譜熵法的主要流程如圖2所示. 在信號的子帶譜線能量包絡(luò)線上選取一個較高的閾值eth2,包絡(luò)線與eth2相交于左右兩個點(diǎn)A和B. 認(rèn)定高于eth2的部分一定是鳴笛,而鳴笛的起止點(diǎn)應(yīng)該在AB段之外. 再在信號的子帶譜線能量包絡(luò)線上選取一個較低的閾值eth1,從A點(diǎn)向左、從B點(diǎn)向右搜索,分別找到包絡(luò)線與eth1相交的左右兩個點(diǎn)C和D,如圖3(a)所示.CD段即為基于子帶譜線能量門限分割的鳴笛部分.
圖2 子帶譜熵法流程Fig.2 Sub-band spectral entropy method process
圖3 雙門限分割示意圖Fig.3 Schematic diagram of double threshold segmentation
在對應(yīng)的子帶譜熵包絡(luò)線上,從C點(diǎn)向右、從D點(diǎn)向左進(jìn)行更加細(xì)致的分割,找到子帶譜熵低于閾值eth3的左右兩個點(diǎn)E和F,如圖3(b)所示.EF段即為基于子帶譜線能量和子帶譜熵雙門限分割的鳴笛部分. 圖3(c)為聲音樣本的頻譜圖以及分割結(jié)果,左邊的豎線為分割的起始點(diǎn),右邊的豎線為分割的停止點(diǎn).
由于汽車鳴笛聲具有豐富的諧波特征,其子帶譜熵值相對較低,子帶譜熵特征的區(qū)分度更高. 為了驗證子帶譜熵法的有效性,我們使用文獻(xiàn)[8]的短時能量和短時過零率法與本文的子帶譜熵法進(jìn)行了對比實驗. 實驗結(jié)果如圖4和圖5所示.
圖4的樣本中沒有鳴笛聲,正確的結(jié)果應(yīng)沒有分割線,如圖4(a)所示. 文獻(xiàn)[8]的方法產(chǎn)生了分割線,而本文的方法沒有產(chǎn)生分割線,并將其分類為非鳴笛樣本. 圖5的樣本中含有鳴笛和噪聲,正確的分割結(jié)果如圖5(a)所示. 文獻(xiàn)[8]的方法不僅分割出了鳴笛部分,還分割出了多個噪聲片段. 而本文的方法則準(zhǔn)確地分割出了鳴笛聲,沒有分割出噪聲部分.
圖4 對一段非鳴笛聲音樣本的分割Fig.4 Segmentation of a non-whistle sound samples
圖5 對一段含有鳴笛和噪聲的聲音樣本的分割Fig.5 Segmentation of a sound samples with car whistle and noise
使用子帶譜熵法可以將子帶譜熵高于閾值的樣本直接判為非鳴笛樣本,如圖4(c)所示. 然而在實際交通環(huán)境中也存在一些非鳴笛聲(如汽車轉(zhuǎn)向提示聲、公交車報站聲、警笛聲等),由于具有一定的諧波特征,產(chǎn)生了分割結(jié)果,會被子帶譜熵法誤判為鳴笛聲,如圖6所示. 因此,我們需要對子帶譜熵法的分割結(jié)果進(jìn)行進(jìn)一步的分類,來消除此類誤判.
圖6 對部分非鳴笛樣本的分割Fig.6 Segmentation of some non-whistle sound samples
1.4 PSO-GA-SVM
1.4.1 算法介紹
SVM是一種二分類模型. 設(shè)樣本集為(xi,yi),其中xi為樣本特征,yi為類別符號. SVM的目標(biāo)是尋找一個分類面ωTx+b=0將樣本正確地分成兩類,且使‖ω2‖最小. 在樣本集線性不可分時,需要引入懲罰因子c和核函數(shù)K(xi,xj)來進(jìn)行分析. 核函數(shù)可以將低維向量內(nèi)積的結(jié)果轉(zhuǎn)化為高維向量內(nèi)積的結(jié)果,但不需要在高維中進(jìn)行計算. 本文選用的核函數(shù)為徑向基核函數(shù),
K(xi,xj)=e-g‖xi-xj‖2.
(7)
懲罰因子c和核函數(shù)參數(shù)g對SVM的分類性能有很大的影響. 本文使用PSO-GA來優(yōu)化c和g參數(shù).
PSO將粒子i在搜索空間中的飛行速度表示為向量vi,位置表示為向量xi. 在每一次迭代中,計算每個粒子的適應(yīng)度,通過個體極值pbest和全局極值gbest來更新每一個粒子的速度和位置,如下兩式所示:
vi=K[vi+φ1r(pbest-xi)+φ2r(gbest-xi)],
(8)
xi=xi+vi.
(9)
式(8)中,r為均勻分布在(0,1)之間的隨機(jī)數(shù),K由下式表示[14]:
(10)
本文中φ取4.1,則K取0.730.
GA將搜索空間中每一個可能的解編碼為染色體,隨機(jī)選擇一組染色體來形成初始群體. 在每一次迭代中,計算每個粒子的適應(yīng)度,按照適應(yīng)度大小的順序來選擇個體,進(jìn)行交叉、變異等操作. 反復(fù)執(zhí)行遺傳操作,直到滿足終止條件為止.
1.4.2 算法流程
PSO-GA-SVM主要流程如圖7所示,其主要步驟如下:
圖7 PSO-GA-SVM流程Fig.7 PSO-GA-SVM process
步驟1 對訓(xùn)練集進(jìn)行k折交叉驗證. 本文中k取5.
步驟2 將搜索空間中每一個c和g可能的解編碼為染色體,隨機(jī)選擇N個染色體來形成初始種群,并初始化粒子速度. 計算每一個粒子的適應(yīng)度,求出pbest和gbest. 本文中N取20.
步驟3 按照式(8)和(9)更新每一個粒子的速度和位置.
步驟4 按照適應(yīng)度選出N-1個粒子,對它們進(jìn)行交叉、變異操作,再與上一代的最優(yōu)粒子組合成新的N個粒子. 計算每一個粒子的適應(yīng)度,更新pbest和gbest.
步驟5 轉(zhuǎn)步驟3,直到滿足一定迭代次數(shù)為止. 本文中迭代次數(shù)取100.
步驟6 輸出最優(yōu)c和g.
步驟7 將最優(yōu)c和g代入SVM的c和g參數(shù)中,對測試集進(jìn)行分類.
2 實驗及結(jié)果分析
本文使用CPU為Intel i7-8750H、內(nèi)存為8G的計算機(jī)作為硬件平臺. 本文中所有音頻的格式為wav格式,位深度為32位. 所有程序均在Python 3.7.0下編寫. 每次實驗從數(shù)據(jù)集中隨機(jī)選取80%的樣本作為訓(xùn)練集,剩下20%的樣本作為測試集,計算100次實驗的平均準(zhǔn)確率. 本文選用Mel頻率倒譜系數(shù)作為分類器輸入的聲音特征[15],其中Mel濾波器的個數(shù)選為96個,離散余弦變換后取第2~65維,再對每一幀信號求平均,最終形成一個64維的向量.
2.1 仿真實驗
本節(jié)中對不同底噪、不同信噪比的聲音樣本進(jìn)行仿真實驗. 鳴笛聲取自杭州愛華智能科技有限公司提供的純凈鳴笛聲樣本,包含奧迪A3、大眾高爾夫、吉利等13種不同車型的鳴笛聲,共120個. 非鳴笛聲取自UrbanSound8K數(shù)據(jù)集中的城市聲音樣本,包含空調(diào)外機(jī)聲、小孩玩耍聲、警笛聲等8種類型的聲音,共211個. 本節(jié)中音頻的時長為1 s,采樣頻率為48 kHz. 為了模擬鳴笛抓拍系統(tǒng)的采集方式,每個聲音樣本中只有0.25 s存在待識別的聲音,并且隨機(jī)設(shè)置該聲音在音頻中的起始位置. 為了驗證本文算法的魯棒性,在上述聲音樣本的基礎(chǔ)上,分別添加信噪比為20 dB、10 dB、5 dB、0 dB的白噪聲和粉噪聲作為底噪進(jìn)行仿真實驗. 白噪聲和粉噪聲取自NOISE92數(shù)據(jù)集. 仿真實驗結(jié)果如表1所示.
分析表1可知,在信噪比較高的情況下,本文算法對仿真樣本的識別準(zhǔn)確率可以達(dá)到99%以上. 隨著信噪比不斷降低,本文算法的識別效果雖然也有所下降,但依然維持在相對較高的準(zhǔn)確率上. 在極差的信噪比環(huán)境下(信噪比為0 dB時),本文算法依然能夠有75%以上的準(zhǔn)確率. 說明本文算法具有較好的魯棒性.
2.2 結(jié)果分析
本節(jié)中對杭州愛華智能科技有限公司的鳴笛抓拍系統(tǒng)實際采集的1 067個聲音樣本進(jìn)行鳴笛識別,其中包括683個不含有鳴笛聲的樣本,包含卡車發(fā)動機(jī)聲、汽車轉(zhuǎn)向提示聲、公交車報站聲、警笛聲等超過10種城市環(huán)境音. 包括384個含有鳴笛聲的樣本,包含各種車型的鳴笛聲,背景噪聲中也存在多種上述城市環(huán)境音. 本節(jié)中音頻的時長為3.8 s,采樣頻率為24 kHz. 我們選擇文獻(xiàn)[2]算法、文獻(xiàn)[7]算法與本文算法進(jìn)行了對比實驗. 實驗結(jié)果如表2所示.
從表2可見出,本文算法相比文獻(xiàn)[2]算法準(zhǔn)確率提高了21.3%,相比文獻(xiàn)[7]算法準(zhǔn)確率提高了14.4%. 文獻(xiàn)[2]和文獻(xiàn)[7]只使用深度學(xué)習(xí)的方法對聲音樣本進(jìn)行分類,而本文首先使用子帶譜熵法對聲音樣本進(jìn)行初判和分割,再使用分類器對分割結(jié)果進(jìn)行進(jìn)一步分類. 同時,文獻(xiàn)[2]和文獻(xiàn)[7]中深度學(xué)習(xí)的方法在樣本數(shù)量較少時分類效果并不理想,而本文使用的PSO-GA-SVM更加適合小樣本集的分類. 因此,本文算法在汽車鳴笛識別上具有更高的準(zhǔn)確率.
表2 不同算法的平均準(zhǔn)確率Table 2 Average accuracy with different method
我們使用子帶譜熵法結(jié)合文獻(xiàn)[7]使用的反向傳播神經(jīng)網(wǎng)絡(luò)(backpropagation neural network,BPNN)和本文使用的PSO-GA-SVM進(jìn)一步進(jìn)行了對比試驗. 實驗結(jié)果如表3所示.
表3 使用子帶譜熵法前后的平均準(zhǔn)確率Table 3 Average accuracy with and without sub-bandspectral entropy method
子帶譜熵法對非鳴笛樣本的誤判率在1%以內(nèi),但是對鳴笛樣本的誤判率在34%以上,不能滿足鳴笛抓拍系統(tǒng)對準(zhǔn)確率的要求,因此需要對子帶譜熵法初判為鳴笛的樣本作進(jìn)一步的分類. 由表3可知,使用子帶譜熵法前,BPNN和PSO-GA-SVM的準(zhǔn)確率并不是非常理想,而使用子帶譜熵法后,兩種分類器的準(zhǔn)確率均有了較大提高. 這是因為子帶譜熵法可以分割出疑似鳴笛的部分,大幅減少了噪聲對分類器模型造成的影響. 同時從表3中還可以看出,本文使用的PSO-GA-SVM相比較于BPNN具有更高的準(zhǔn)確率,更加適合小樣本集的分類.
此外,由于本文使用的聲音特征維數(shù)較低,僅有64維,提取特征以及分類的速度較快,在本文使用的計算機(jī)上處理一個樣本僅需約0.3 s,可以很好地應(yīng)用到實時檢測中.
3 結(jié)論
針對現(xiàn)有的汽車鳴笛識別算法易受噪聲影響、計算量較大的問題,本文提出如下算法:首先利用閾值判斷對聲音樣本進(jìn)行初判,使用子帶譜熵法分割出樣本中疑似的鳴笛部分;然后利用機(jī)器學(xué)習(xí)對疑似鳴笛樣本作進(jìn)一步分類,使用PSO-GA-SVM訓(xùn)練模型,最終分類出所有的鳴笛與非鳴笛樣本. 實驗表明,本文算法準(zhǔn)確率較高且計算量較小,可以滿足鳴笛抓拍系統(tǒng)實時檢測的要求.