python對語音信號讀取、分幀、加窗

python對語音信號讀取、分幀、加窗

一、讀入音頻信號

語音信號有三個重要的參數:聲道數、取樣頻率和量化位數。

  • 聲道數:單聲道或者雙聲道

  • 採樣頻率:一秒鐘對聲音採樣的次數,例如10000HZ代表一秒鐘將信號分解爲10000份,當採樣數量非常高的時候,我們人眼看起來就是連續的。(實際是離散的)。採樣頻率越高聲音的還原就越真實越自然。在當今的主流採集卡上,採樣頻率一般共分爲22.05KHz、44.1KHz、48KHz三個等級,22.05KHz只能達到FM廣播的聲音品質,44.1KHz則是理論上的CD音質界限,48KHz則更加精確一些。

  • 量化位數:用多少bit表達一次採樣所採集的數據,通常有8bit、16bit、24bit和32bit等幾種。

    例如CD中所儲存的聲音信號是雙聲道、44.1kHz、16bit。

wave讀wav文件

wava模塊爲wav聲音格式提供了方面的界面,但支持單聲道/立體聲。

f = wave.open(r"file", mode="rb")

其中file爲wav格式的語音文件

mode是缺省參數,可以不填,也可以是"rb":只讀模式;“wb”:只寫模式。注意不支持讀/寫格式。

f爲讀取的文件流。

f.getparams()

一次性返回所有的音頻參數,返回的是一個元組(聲道數,量化位數(byte單位),採樣頻率,採樣點數,壓縮類型,壓縮類型的描述)。(nchannels, sampwidth, framerate, nframes, comptype, compname)wave模塊只支持非壓縮的數據,因此可以忽略最後兩個信息。

現在來讀入一個名爲lantian.wav的語音信號,將它導入python工程文件目錄下

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PsAxDzIX-1572436638085)(C:\Users\jh\AppData\Roaming\Typora\typora-user-images\1572146308413.png)]

輸入代碼:

import wave				#調用wave模塊
import matplotlib.pyplot as plt		#調用matplotlib.pyplot模塊作爲Plt
import numpy as np 		#調用numpy模塊記作np
f = wave.open(r"lantian.wav", "rb")		#讀取語音文件
params = f.getparams()			#返回音頻參數
nchannels, sampwidth, framerate, nframes = params[:4] #賦值聲道數,量化位數,採樣頻率,採樣點數
print(nchannels,sampwidth,framerate,nframes)# 輸出聲道數,量化位數,採樣頻率,採樣點數

輸出結果:

1 2 8000 19000

聲道數=1

量化位數=2

採樣頻率=8000

採樣點數=19000

str_data = f.readframes(nframes)

指定需要讀取的長度(以取樣點爲單位),返回的是字符串類型的數據。

print(str_data[:10])

這裏輸出str_data的前十個數據爲:

\xf0\xff\xfc\xff\xf6\xff\xf7\xff\xe6\xff

wave_data = np.fromstring(str_data, dtype=np.short)

將讀取的字符串數據轉換爲一維short類型的數組。通過np.fromstring函數將字符串轉換爲數組,通過其參數dtype指定轉換後的數據格式

輸出結果:(數組的前十個)

[-16 -4 -10 -9 -26 -16 -25 -40 -36 -54]

wave_data = wave_data*1.0/(max(abs(wave_data)))

這段代碼將數組歸一化,輸出前10個結果爲:

[-0.00222161 -0.0005554 -0.0013885 -0.00124965 -0.00361011 -0.00222161
-0.00347126 -0.00555401 -0.00499861 -0.00749792]

time = np.arange(0, nframes) * (1.0 / framerate)

通過採樣點數和取樣頻率計算出每個取樣的時間

輸入代碼,畫出語音的波形

import wave
import matplotlib.pyplot as plt
import numpy as np
f = wave.open(r"lantian.wav", "rb")
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
print(nchannels,sampwidth,framerate,nframes)
str_data = f.readframes(nframes)
print(str_data[:10])
wave_data = np.fromstring(str_data, dtype=np.short)
print(wave_data[:10])
wave_data = wave_data*1.0/(max(abs(wave_data)))
print(wave_data[:10])
time = np.arange(0, nframes) * (1.0 / framerate)
plt.figure(figsize=(10,4))
plt.plot(time, wave_data,c="g")
plt.xlabel("time (seconds)")
plt.ylabel("Amplitude")
plt.grid()
plt.show()

波形圖如下:

在這裏插入圖片描述

二、語音信號處理

​ 要對語音信號進行分析,首先要對語音信號提取出可表示該語音本質的特徵參數。有了特徵參數纔可能利用這些參數進行有效的處理。所以語音分析、提取特徵參數是語音信號處理的基礎。在語音信號處理後,語音質量的高低不僅取決於處理的方法,同時也取決於是否選擇了合適的語音特徵參數。因此,語音信號分析、特徵參數的提取在語音信號處理應用中具有十分重要的地位。

​ 在短時分析中,將語音信號分爲一段- -段地來分析其特徵參數,其中每- -段稱爲一“幀”,幀長一般取10~30ms。這樣,對於整體的語音信號來講,每–幀特徵參數組成了特徵參數時間序列。

​ 根據提取參數的方法不同,可將語音信號分析分爲時域分析、頻域分析、倒頻域分析和其,他域分析的方法;根據分析方法的不同,又可將語音信號分析分爲模型分析方法和非模型分析方法兩種。時域分析方法具有簡單、計算量小、物理意義明確等優點,但由於語音信號最重要的感知特性反映在功率譜中,而相位變化只起着很小的作用,所以相對於時域分析來說頻域分析更爲重要。

​ 模型分析法是指依據語音信號產生的數學模型,來分析和提取表徵這些模型的特徵參數,如共振峯分析及聲管分析(即線性預測模型)法;而不按模型進行分析的其他方法都屬於非模型分析法,包括上面提到的時域分析法、頻域分析法及同態分析法(即倒頻域分析法)等。

​ 不論是分析怎樣的參數以及採用什麼分析方法,在按幀進行語音分析、提取語音參數之前,有一些經常使用的、共同的短時分析技術必須預先進行,如語音信號的數字化、預加重、加窗和分幀等,這些也是不可忽視的語音信號分析的關鍵技術。

1、信號分幀

​ 爲了分析讀人數據,通常進行分幀處理。在分幀中,往往設置在相鄰兩幀之間有一部分重疊。其原因是:語音信號是時變的,在短時範圍內特徵變化較小,所以作爲穩態來處理;但超出這短時範圍語音信號就有變化了。在相鄰兩幀之間基音發生了變化,如正好是兩個音節之間, 或正好是聲母向韻母過渡,等等,這時,其特徵參數有可能變化較大,但爲了使特徵參數平滑地變化,在兩個不重疊的幀之間插一些幀來提取特徵參數,這就形成了相鄰幀之間有重疊部分。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fGTdvtze-1572436638086)(C:\Users\jh\AppData\Roaming\Typora\typora-user-images\1572159439550.png)]

wlen爲幀長,inc爲幀移,重疊部分爲overlap,overlap=wlen - inc

信號幀數爲:
fn=(Noverlap)/inc=(Nwlen)/inc+1 fn=(N-overlap)/inc=(N-wlen)/inc+1
N爲語音數據長度。

每一幀的起始點的位置爲:
startindex=(0:(fn1))inc+1 startindex=(0:(fn-1))*inc+1

下面上代碼:

第一部分:語音的讀取

import numpy as np
import wave
import matplotlib.pyplot as plt
wlen=512
inc=128
f = wave.open(r"lantian.wav", "rb")
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = f.readframes(nframes)
wave_data = np.fromstring(str_data, dtype=np.short)
wave_data = wave_data*1.0/(max(abs(wave_data)))

語音的讀取在上面講過,這裏就不再囉嗦了。

第二部分:語音分幀

signal_length=len(wave_data) #信號總長度

python中len()讀取序列的長度,這裏是讀取語音信號的總長度。

if signal_length<=wlen: #若信號長度小於一個幀的長度,則幀數定義爲1
        nf=1
else:                 #否則,計算幀的總長度
        nf=int(np.ceil((1.0*signal_length-wlen+inc)/inc))

wlen爲每一幀信號的長度,inc爲幀移,nf爲分的幀數(前面講過)

當信號的長度還沒有一幀長的時候,設定幀數爲1,否則用上面講過的這個公式
fn=(Noverlap)/inc=(Nwlen)/inc+1 fn=(N-overlap)/inc=(N-wlen)/inc+1

pad_length=int((nf-1)*inc+wlen) #所有幀加起來總的鋪平後的長度
zeros=np.zeros((pad_length-signal_length,)) #不夠的長度使用0填補,類似於FFT中的擴充數組操作
pad_signal=np.concatenate((wave_data,zeros)) #填補後的信號記爲pad_signal

因爲上面np.ceil向上取整,所以會導致實際分幀後的長度大於信號本身的長度,所以要對原來的信號進行補零,類似與FFT變換中的數據點不夠補零達到採樣點的數量。

np.zeros()創建一個0矩陣

np.concatenate()連接兩個維度相同的矩陣

indices=np.tile(np.arange(0,wlen),(nf,1))+np.tile(np.arange(0,nf*inc,inc),(wlen,1)).T  #相當於對所有幀的時間點進行抽取,得到nf*wlen長度的矩陣

先看一下np.tile的用法:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zIeJypFe-1572436638086)(C:\Users\jh\AppData\Roaming\Typora\typora-user-images\1572333257712.png)]

print(indices[:2])
[[  0   1   2 ... 509 510 511]
 [128 129 130 ... 637 638 639]]

輸出矩陣前兩行的結果。

indices=np.array(indices,dtype=np.int32) #將indices轉化爲矩陣
frames=pad_signal[indices] #得到幀信號
a=frames[30:31]
print(a[0])

將語音信號轉化爲nf*wlen矩陣的形式,並輸出第30行的數據值

[ 0.21035823 -0.07234102 -0.09955568 -0.12649264 -0.23299084 -0.29533463
 -0.27006387 -0.23229658 -0.18786448 -0.20924743 -0.30880311 -0.32116079
 -0.33560122 -0.35323521 -0.38128298 -0.3700361  -0.34337684 -0.3457373
 -0.34212719 -0.29533463 -0.25715079 -0.23715635 -0.22410442 -0.24368231
 -0.22271591 -0.1973063  -0.18133852 -0.1959178  -0.18314357 -0.1291308
 -0.09830603 -0.0849764  -0.06873091 -0.04012774 -0.00916412 -0.02415996
 -0.01430158 -0.01235768 -0.01666204 -0.00249931 -0.03457373 -0.04998611
 -0.03443488 -0.02624271 -0.01971675 -0.02485421 -0.0223549  -0.00208275
  0.00333241  0.02415996  0.03915579  0.04998611  0.09372397  0.11163566
  0.11955012  0.15523466  0.17633991  0.19105804  0.20397112  0.23424049
  0.25284643  0.24493196  0.25326298  0.27006387  0.28519856  0.28603166
  0.30852541  0.31796723  0.31491252  0.32338239  0.31033046  0.29005832
  0.3239378   0.32518745  0.34726465  0.35753957  0.3678145   0.29047487
  0.18119967  0.13468481  0.05901139 -0.01457928 -0.07914468 -0.14343238
 -0.16273257 -0.18356012 -0.22688142 -0.27506248 -0.33643432 -0.36156623
 -0.35892808 -0.36642599 -0.3485143  -0.31685643 -0.30560955 -0.28103305
 -0.27048042 -0.27381283 -0.2624271  -0.27381283 -0.2831158  -0.26881422
 -0.25576229 -0.23090808 -0.21341294 -0.20341572 -0.18550403 -0.16606498
 -0.13565676 -0.1087198  -0.07942238 -0.04748681 -0.03374063 -0.01791169
 -0.01791169 -0.023188   -0.00541516  0.01207998  0.02249375  0.02874202
  0.03360178  0.04568176  0.04346015  0.04582061  0.05290197  0.05401277
  0.06845321  0.06873091  0.06109414  0.08455984  0.10580394  0.12177173
  0.1299639   0.14537628  0.17370175  0.21244099  0.25326298  0.27881144
  0.28922522  0.29575118  0.29950014  0.30213829  0.33088031  0.34087753
  0.34670925  0.37670092  0.38600389  0.40072202  0.41918911  0.41599556
  0.34323799  0.31144127  0.26450986  0.16106637  0.10080533  0.01666204
 -0.04665371 -0.08275479 -0.16675923 -0.23507359 -0.30213829 -0.37711747
 -0.43557345 -0.47334074 -0.49569564 -0.49264093 -0.47945015 -0.4790336
 -0.43599    -0.42710358 -0.42210497 -0.39114135 -0.38031102 -0.34518189
 -0.27811719 -0.24409886 -0.197584   -0.1514857  -0.12163288 -0.07733963
 -0.04429325 -0.00999722  0.03193557  0.06498195  0.08539295  0.09788948
  0.10885865  0.12801999  0.1324632   0.13426826  0.13662871  0.12760344
  0.11357956  0.09691752  0.07858928  0.0670647   0.05609553  0.03860039
  0.02874202  0.02443766  0.03026937  0.03762844  0.04123854  0.05123577
  0.07845043  0.11205221  0.13204665  0.15745626  0.19327964  0.22049431
  0.26312136  0.29464038  0.31546793  0.39558456  0.44390447  0.4569564
  0.43362955  0.41183005  0.44695918  0.4357123   0.32907526  0.16537073
  0.11524577  0.0430436  -0.03360178 -0.11469036 -0.19161344 -0.26326021
 -0.34046098 -0.3929464  -0.42085532 -0.4566787  -0.46084421 -0.46612052
 -0.46098306 -0.44154402 -0.44029436 -0.43071369 -0.41835601 -0.38308803
 -0.33698973 -0.30394335 -0.25659539 -0.21868925 -0.18841988 -0.13551791
 -0.10066648 -0.05109692  0.00499861  0.0441544   0.0885865   0.1296862
  0.15245765  0.16023327  0.16925854  0.17161899  0.18425437  0.19466815
  0.18717023  0.16995279  0.1523188   0.1319078   0.11816162  0.1067759
  0.09622327  0.08705915  0.08705915  0.09594557  0.10413774  0.11371841
  0.13482366  0.16023327  0.18078312  0.20438767  0.24812552  0.28672591
  0.32921411  0.39933352  0.42029992  0.39975007  0.39975007  0.35309636
  0.27089697  0.21535685  0.13773952  0.06123299  0.02457651 -0.07039711
 -0.14162733 -0.21133019 -0.30199944 -0.35281866 -0.41821716 -0.43501805
 -0.4343238  -0.4580672  -0.43446265 -0.41960567 -0.42613163 -0.40377673
 -0.38739239 -0.38697584 -0.34809775 -0.30713691 -0.28686476 -0.22979728
 -0.1945293  -0.16425993 -0.11024715 -0.07817273 -0.03596223  0.02624271
  0.06053874  0.09900028  0.12649264  0.13996112  0.16259372  0.17036934
  0.17870036  0.17564565  0.16037212  0.16495418  0.15467926  0.13746182
  0.12718689  0.11566232  0.11635657  0.12274368  0.13287976  0.14981949
  0.16481533  0.18661483  0.21494029  0.23146348  0.2613163   0.31338517
  0.35365176  0.41571786  0.46542627  0.4566787   0.43946126  0.41641211
  0.36934185  0.32366009  0.24201611  0.16953624  0.1084421   0.03207442
 -0.04748681 -0.11510691 -0.21896695 -0.31407942 -0.37322966 -0.42835324
 -0.44806998 -0.46348237 -0.48944738 -0.47000833 -0.46959178 -0.46570397
 -0.46098306 -0.45917801 -0.42807553 -0.39780616 -0.3476812  -0.31991114
 -0.28866981 -0.25298528 -0.23201888 -0.18064427 -0.13315746 -0.0874757
 -0.01360733  0.03304638  0.07775618  0.11441266  0.13926687  0.16384338
  0.17633991  0.18717023  0.1973063   0.20077756  0.19855596  0.19202999
  0.18078312  0.18203277  0.18841988  0.19522355  0.20522077  0.20494307
  0.21146904  0.23673979  0.26062205  0.28769786  0.33310192  0.37961677
  0.44015551  0.49194668  0.4779228   0.456401    0.42307692  0.36434324
  0.31116357  0.23673979  0.15662316  0.09844488  0.01471813 -0.06914746
 -0.13065815 -0.23410164 -0.31255207 -0.38044988 -0.43140794 -0.44862538
 -0.46681477 -0.46903638 -0.44862538 -0.4351569  -0.43126909 -0.43001944
 -0.41668981 -0.41571786 -0.38156068 -0.33851708 -0.31630103 -0.27950569
 -0.25312413 -0.22479867 -0.17800611 -0.13635101 -0.08372674 -0.0217995
  0.0195779   0.06498195  0.09844488  0.12135518  0.13690641  0.15579006
  0.17023049  0.18217162  0.18286587  0.17856151  0.16578728  0.16509303
  0.17342405  0.18536518  0.19966676  0.20938628  0.22757567  0.25853929
  0.28131075  0.31046931  0.36239933  0.4125243   0.4793113   0.49347403
  0.46709247  0.44598723  0.40544293  0.36795335  0.29852819  0.22799222
  0.1537073   0.05567898 -0.03068592 -0.1106637  -0.20980283 -0.2828381
 -0.36101083 -0.41557901 -0.45487365 -0.49389059 -0.51194113 -0.50263816
 -0.49569564 -0.46834213 -0.47375729 -0.4583449  -0.4547348  -0.43057484
 -0.38336573 -0.35448487 -0.305193   -0.27631214 -0.23687864 -0.18480978
 -0.14593169 -0.08192169 -0.01943904  0.03499028  0.09358512  0.12621494
  0.16342683  0.18647598  0.20924743  0.23243543  0.24548736  0.25312413
  0.25617884  0.25006943  0.24382116  0.2406276   0.24645932  0.24909747
  0.258817    0.27881144  0.30311025  0.33754513  0.38489309  0.43723966
  0.47375729  0.45653985]

這就是第30幀語音的數據。

畫出一幀信號的時域圖像:

import numpy as np
import wave
import matplotlib.pyplot as plt
wlen=512
inc=128
f = wave.open(r"lantian.wav", "rb")
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = f.readframes(nframes)
wave_data = np.fromstring(str_data, dtype=np.short)
wave_data = wave_data*1.0/(max(abs(wave_data)))
print(wave_data[:10])
time = np.arange(0, wlen) * (1.0 / framerate)
signal_length=len(wave_data) #信號總長度
if signal_length<=wlen: #若信號長度小於一個幀的長度,則幀數定義爲1
        nf=1
else: #否則,計算幀的總長度
        nf=int(np.ceil((1.0*signal_length-wlen+inc)/inc))
pad_length=int((nf-1)*inc+wlen) #所有幀加起來總的鋪平後的長度
zeros=np.zeros((pad_length-signal_length,)) #不夠的長度使用0填補,類似於FFT中的擴充數組操作
pad_signal=np.concatenate((wave_data,zeros)) #填補後的信號記爲pad_signal
indices=np.tile(np.arange(0,wlen),(nf,1))+np.tile(np.arange(0,nf*inc,inc),(wlen,1)).T  #相當於對所有幀的時間點進行抽取,得到nf*nw長度的矩陣
print(indices[:2])
indices=np.array(indices,dtype=np.int32) #將indices轉化爲矩陣
frames=pad_signal[indices] #得到幀信號
a=frames[30:31]
print(a[0])
plt.figure(figsize=(10,4))
plt.plot(time,a[0],c="g")
plt.grid()
plt.show()

圖像如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ROZSri5L-1572436638087)(C:\Users\jh\AppData\Roaming\Typora\typora-user-images\1572334329933.png)]

2、信號加窗

矩形窗:
w(n)={1,0<=n<L10, w(n)=\begin{cases}1,\qquad0<=n<L-1\\ 0,\qquad其他 \end{cases}
海寧窗:
w(n)={0.5(1cos(2πn/(L1))),0<=n<L10, w(n)=\begin{cases}0.5(1-cos(2\pi n/(L-1))),\qquad0<=n<L-1\\ 0,\qquad其他 \end{cases}
漢明窗:
w(n)={0.540.46cos(2πn/(L1)),0<=n<L10, w(n)=\begin{cases}0.54-0.46cos(2\pi n/(L-1)),\qquad0<=n<L-1\\ 0,\qquad其他 \end{cases}
其中窗長爲L。

通常對信號截斷、分幀需要加窗,因爲截斷都有頻域能量泄露,而窗函數可以減少截斷帶來的影響。窗函數在scipy.signal信號處理工具箱中,如hanning窗:

import matplotlib.pyplot as plt
import scipy.signal as signal
plt.figure(figsize=(6,2))
plt.plot(signal.hanning(512))
plt.grid()
plt.show()

輸出結果:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Nj1xcqwC-1572436638088)(C:\Users\jh\AppData\Roaming\Typora\typora-user-images\1572161976534.png)]

$$

在語音處理中進行分幀,相當於乘以一個有限長的窗函數
y(n)=\sum_{x=-\infty}^{\infty}x(m)w(n-m)
$$
是卷積形式,因此可以理解爲離散信號x(m)經過一個單位衝激函數響應爲w(m)的FIR濾波器產生的輸出。

直接上代碼:

mport numpy as np
import wave
import matplotlib.pyplot as plt
wlen=512
inc=128
f = wave.open(r"lantian.wav", "rb")
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = f.readframes(nframes)
wave_data = np.fromstring(str_data, dtype=np.short)
wave_data = wave_data*1.0/(max(abs(wave_data)))
print(wave_data[:10])
time = np.arange(0, wlen) * (1.0 / framerate)
signal_length=len(wave_data) #信號總長度
if signal_length<=wlen: #若信號長度小於一個幀的長度,則幀數定義爲1
        nf=1
else: #否則,計算幀的總長度
        nf=int(np.ceil((1.0*signal_length-wlen+inc)/inc))
pad_length=int((nf-1)*inc+wlen) #所有幀加起來總的鋪平後的長度
zeros=np.zeros((pad_length-signal_length,)) #不夠的長度使用0填補,類似於FFT中的擴充數組操作
pad_signal=np.concatenate((wave_data,zeros)) #填補後的信號記爲pad_signal
indices=np.tile(np.arange(0,wlen),(nf,1))+np.tile(np.arange(0,nf*inc,inc),(wlen,1)).T  #相當於對所有幀的時間點進行抽取,得到nf*nw長度的矩陣
print(indices[:2])
indices=np.array(indices,dtype=np.int32) #將indices轉化爲矩陣
frames=pad_signal[indices] #得到幀信號
a=frames[30:31]
print(a[0])
windown=np.hanning(wlen)  #調用漢明窗
b=a[0]*windown
plt.figure(figsize=(10,4))
plt.plot(time,b,c="g")
plt.grid()
plt.show()

加窗之後的圖像爲:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EXOvZHFl-1572436638088)(C:\Users\jh\AppData\Roaming\Typora\typora-user-images\1572335255879.png)]

3、短時能量

短時能量主要用於區分濁音段和清音段

計算第i幀語音信號yi(n)的短時能量公式爲
y(n)=n=0L1yi2(n),1<=i<=fn y(n)=\sum_{n=0}^{L-1}y_i^2(n),\qquad1<=i<=fn
求上面一幀語音的短時能量,直接上代碼

import numpy as np
import wave
import matplotlib.pyplot as plt
wlen=512
inc=128
f = wave.open(r"lantian.wav", "rb")
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = f.readframes(nframes)
#print(str_data[:10])
wave_data = np.fromstring(str_data, dtype=np.short)
#print(wave_data[:10])
wave_data = wave_data*1.0/(max(abs(wave_data)))
print(wave_data[:10])
time = np.arange(0, wlen) * (1.0 / framerate)
signal_length=len(wave_data) #信號總長度
if signal_length<=wlen: #若信號長度小於一個幀的長度,則幀數定義爲1
        nf=1
else: #否則,計算幀的總長度
        nf=int(np.ceil((1.0*signal_length-wlen+inc)/inc))
pad_length=int((nf-1)*inc+wlen) #所有幀加起來總的鋪平後的長度
zeros=np.zeros((pad_length-signal_length,)) #不夠的長度使用0填補,類似於FFT中的擴充數組操作
pad_signal=np.concatenate((wave_data,zeros)) #填補後的信號記爲pad_signal
indices=np.tile(np.arange(0,wlen),(nf,1))+np.tile(np.arange(0,nf*inc,inc),(wlen,1)).T  #相當於對所有幀的時間點進行抽取,得到nf*nw長度的矩陣
print(indices[:2])
indices=np.array(indices,dtype=np.int32) #將indices轉化爲矩陣
frames=pad_signal[indices] #得到幀信號
a=frames[30:31]
print(a[0])
windown=np.hanning(512)
b=a[0]*windown
c=np.square(b)
plt.figure(figsize=(10,4))
plt.plot(time,c,c="g")
plt.grid()
plt.show()

短時能量圖像爲

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-P182MPEU-1572436638088)(C:\Users\jh\AppData\Roaming\Typora\typora-user-images\1572436584688.png)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章