Skip to content

Commit

Permalink
音声形式を除外形式に追加
Browse files Browse the repository at this point in the history
音声強調クラス群のリファクタリング
  • Loading branch information
aihara committed Jun 30, 2011
1 parent aaab47f commit 0b2886b
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 41 deletions.
3 changes: 3 additions & 0 deletions .hgignore
Expand Up @@ -5,4 +5,7 @@ syntax: glob
*~
*.wave
*.wav
*.mp3
*.ogg
*.raw
#*
76 changes: 35 additions & 41 deletions voice_enhancement.py
Expand Up @@ -9,18 +9,18 @@ def __init__(self,winsize,window,ratio=2.0):
self._ratio=ratio

def compute(self,signal,noise):
SY = sp.fft(signal*self._window)
SYr = sp.absolute(SY)**2.0
SYp = sp.angle(SY)
NY = sp.fft(noise*self._window)
NYr = sp.absolute(NY)**2.0
SYr = SYr - NYr*self._ratio
SYr = sp.maximum(SYr,0)
SYr = sp.sqrt(SYr)
SY = SYr * sp.exp(SYp*1j)
return sp.real(sp.ifft(SY))
s_spec = sp.fft(signal*self._window)
s_amp = sp.absolute(s_spec)**2.0
s_phase = sp.angle(s_spec)
n_spec = sp.fft(noise*self._window)
n_amp = sp.absolute(n_spec)**2.0
s_amp = s_amp - n_amp*self._ratio
s_amp = sp.maximum(s_amp,0)
s_amp = sp.sqrt(s_amp)
s_spec = s_amp * sp.exp(s_phase*1j)
return sp.real(sp.ifft(s_spec))

class SpectrumReconstruction():
class SpectrumReconstruction(object):
def __init__(self,winsize,window,alpha=0.98):
self._window=window
self._G = sp.zeros(winsize,sp.float32)
Expand All @@ -30,62 +30,56 @@ def __init__(self,winsize,window,alpha=0.98):
def compute(self,signal,noise):
return signal

def _calc_aposteriori_snr(self,syr,nyr):
return syr**2.0/nyr**2.0
def _calc_aposteriori_snr(self,s_amp,n_amp):
return s_amp**2.0/n_amp**2.0

def _calc_apriori_snr(self,gamma):
return self._alpha*self._G**2 * self._prevGamma + (1.0-self._alpha)*sp.maximum(gamma-1.0, 0)#a priori s/n ratio

class MMSE_STSA(SpectrumReconstruction):
def __init__(self,winsize,window,alpha=0.98):
self._window=window
self._G = sp.zeros(winsize,sp.float32)
self._prevGamma = sp.zeros(winsize,sp.float32)
self._alpha = alpha
def __init__(self,winsize,window,alpha=0.99):
self._gamma15=spc.gamma(1.5)
super(self.__class__,self).__init__(winsize,window,alpha)

def compute(self,signal,noise):
SY = sp.fft(signal*self._window)
SYr = sp.absolute(SY)
SYp = sp.angle(SY)
NY = sp.fft(noise*self._window)
NYr = sp.absolute(NY)
gamma = self._calc_aposteriori_snr(SYr,NYr)
s_spec = sp.fft(signal*self._window)
s_amp = sp.absolute(s_spec)
s_phase = sp.angle(s_spec)
n_spec = sp.fft(noise*self._window)
n_amp = sp.absolute(n_spec)
gamma = self._calc_aposteriori_snr(s_amp,n_amp)
xi = self._calc_apriori_snr(gamma)
self._prevGamma = gamma
nu = gamma * xi / (1+xi)
self._G = (self._gamma15*sp.sqrt(nu)/gamma)*sp.exp(-nu/2)*((1+nu)*spc.i0(nu/2)+nu*spc.i1(nu/2))
idx = sp.isnan(self._G) + sp.isinf(self._G)
#self._G[idx] = xi[idx] / ( xi[idx] + 1)
self._G[idx] = 0.0
Yr = self._G * SYr
Yr = sp.maximum(Yr,0)
Y = Yr * sp.exp(SYp*1j)
return sp.real(sp.ifft(Y))
amp = self._G * s_amp
amp = sp.maximum(amp,0)
spec = amp * sp.exp(s_phase*1j)
return sp.real(sp.ifft(spec))

class JointMap(SpectrumReconstruction):
def __init__(self,winsize,window,alpha=0.99,mu=1.74,tau=0.126):
self._window=window
self._G = sp.zeros(winsize,sp.float32)
self._prevGamma = sp.zeros(winsize,sp.float32)
self._alpha = alpha
self._mu = mu
self._tau = tau
super(self.__class__,self).__init__(winsize,window,alpha)

def compute(self,signal,noise):
SY = sp.fft(signal*self._window)
SYr = sp.absolute(SY)
SYp = sp.angle(SY)
NY = sp.fft(noise*self._window)
NYr = sp.absolute(NY)
gamma = self._calc_aposteriori_snr(SYr,NYr)
s_spec = sp.fft(signal*self._window)
s_amp = sp.absolute(s_spec)
s_phase = sp.angle(s_spec)
n_spec = sp.fft(noise*self._window)
n_amp = sp.absolute(n_spec)
gamma = self._calc_aposteriori_snr(s_amp,n_amp)
xi = self._calc_apriori_snr(gamma)
self._prevGamma = gamma
u = 0.5 - self._mu/(4.0*sp.sqrt(gamma*xi))
self._G = u + sp.sqrt(u**2.0 + self._tau/(gamma*2.0))
idx = sp.isnan(self._G) + sp.isinf(self._G)
#self._G[idx] = xi[idx] / ( xi[idx] + 1)
self._G[idx] = 0.0
Yr = self._G * SYr
Y = Yr * sp.exp(SYp*1j)
return sp.real(sp.ifft(Y))
amp = self._G * s_amp
spec = amp * sp.exp(s_phase*1j)
return sp.real(sp.ifft(spec))

0 comments on commit 0b2886b

Please sign in to comment.