前言
笔者要投身于语音信号的研究当中,这段时间会更一些语音信号相关算法研究。
能量分离算法(ESA)使用非线性能量算子来跟踪语音信号,将只包含单个共振峰的语音信号分离成频率分量与幅值分量。
ESA基于Teager能量算子,其中在离散领域中其能量算子可以表示为:
s(n)*s(n)-s(n+1)*s(n-1)
s(n)代表语音信号
Teager能量算子的python实现
def Teager_power_function(audio_wav):
Teager_power=np.zeros(len(audio_wav))
##############离散Teager能量算子的公式=S(n)*S(n)-S(n+1)*S*(n-1)
for i in range(1,len(audio_wav)-1):
Teager_power[i]=audio_wav[i]*audio_wav[i]-audio_wav[i+1]*audio_wav[i-1]
return Teager_power
ESA算法的实现
由于具体的公式比较麻烦,这里就不贴了,大家可以去看韩纪庆的语音信号处理第二章2.4.3节的讲解。
r_d=Teager_power_function(audio_1)
y=np.zeros(len(audio_1))
###########前向差分
for i in range(1,len(audio_1)):
y[i]=audio_1[i]-audio_1[i-1]
z=np.zeros(len(audio_1))
###############后向差分
for i in range(0,len(audio_1)-2):
z[i]=audio_1[i+1]-audio_1[i]
y_d=Teager_power_function(y)
z_d=Teager_power_function(z)
G=1-(y_d+z_d)/(4*r_d)
f=(i/2*3.14*20)*np.arccos(G)
a=np.sqrt(r_d/(1-pow(G,2)))
plt.figure(1)
plt.plot(f)
plt.figure(2)
plt.plot(a)
这部分代码主要做了两件事,用y与z来代表语音信号的前向与后向差分,然后分别求得y与z的Teager能量算子,最后根据相应的公式求得频率与幅值的结果。