class Biquad(object):
def __init__(self, b0, b1, b2, a0, a1, a2):
self.b0 = b0 / a0
self.b1 = b1 / a0
self.b2 = b2 / a0
self.a1 = a1 / a0
self.a2 = a2 / a0
@property
def coefs(self):
return (self.b0, self.b1, self.b2, -self.a1, -self.a2)
def apply_gain(self, gain):
v = 10 ** (gain / 20.0)
self.b0 *= v
self.b1 *= v
self.b2 *= v
def __str__(self):
return 'Biquad<%.03f %.03f %.03f %.03f %.03f>' % self.coefs
class SimpleBiquad(Biquad):
def __init__(self, f0, Q):
self.f0 = f0
self.Q = Q
self.build()
Biquad.__init__(self, self.b0, self.b1, self.b2, self.a0, self.a1, self.a2)
@property
def w0(self):
return 2 * pi * self.f0 / FS
@property
def alpha(self):
return sin(self.w0) / (2.0 * self.Q)
def __str__(self):
return '%s(f0=%.03f, Q=%.03f)' % (self.__class__.__name__, self.f0, self.Q)
class GainBiquad(SimpleBiquad):
def __init__(self, f0, Q, gain):
self.gain = gain
SimpleBiquad.__init__(self, f0, Q)
@property
def A(self):
return 10 ** (self.gain / 40.0)
def __str__(self):
return '%s(f0=%.03f, Q=%.03f, gain=%.02f)' % (self.__class__.__name__, self.f0, self.Q, self.gain)
class LPF(SimpleBiquad):
def build(self):
self.b0 = (1 - cos(self.w0))/2
self.b1 = 1 - cos(self.w0)
self.b2 = (1 - cos(self.w0))/2
self.a0 = 1 + self.alpha
self.a1 = -2*cos(self.w0)
self.a2 = 1 - self.alpha
class HPF(SimpleBiquad):
def build(self):
self.b0 = (1 + cos(self.w0))/2
self.b1 = -(1 + cos(self.w0))
self.b2 = (1 + cos(self.w0))/2
self.a0 = 1 + self.alpha
self.a1 = -2*cos(self.w0)
self.a2 = 1 - self.alpha
class BPFSkirt(SimpleBiquad):
def build(self):
self.b0 = sin(self.w0)/2
self.b1 = 0
self.b2 = -sin(self.w0)/2
self.a0 = 1 + self.alpha
self.a1 = -2*cos(self.w0)
self.a2 = 1 - self.alpha
class BPFPeak(SimpleBiquad):
def build(self):
self.b0 = self.alpha
self.b1 = 0
self.b2 = -self.alpha
self.a0 = 1 + self.alpha
self.a1 = -2*cos(self.w0)
self.a2 = 1 - self.alpha
class notch(SimpleBiquad):
def build(self):
self.b0 = 1
self.b1 = -2*cos(self.w0)
self.b2 = 1
self.a0 = 1 + self.alpha
self.a1 = -2*cos(self.w0)
self.a2 = 1 - self.alpha
class APF(SimpleBiquad):
def build(self):
self.b0 = 1 - self.alpha
self.b1 = -2*cos(self.w0)
self.b2 = 1 + self.alpha
self.a0 = 1 + self.alpha
self.a1 = -2*cos(self.w0)
self.a2 = 1 - self.alpha
class PeakingEQ(GainBiquad):
def build(self):
self.b0 = 1 + self.alpha*self.A
self.b1 = -2*cos(self.w0)
self.b2 = 1 - self.alpha*self.A
self.a0 = 1 + self.alpha/self.A
self.a1 = -2*cos(self.w0)
self.a2 = 1 - self.alpha/self.A
class LowShelf(GainBiquad):
def build(self):
A = self.A
self.b0 = A*( (A+1) - (A-1)*cos(self.w0) + 2*sqrt(A)*self.alpha )
self.b1 = 2*A*( (A-1) - (A+1)*cos(self.w0) )
self.b2 = A*( (A+1) - (A-1)*cos(self.w0) - 2*sqrt(A)*self.alpha )
self.a0 = (A+1) + (A-1)*cos(self.w0) + 2*sqrt(A)*self.alpha
self.a1 = -2*( (A-1) + (A+1)*cos(self.w0) )
self.a2 = (A+1) + (A-1)*cos(self.w0) - 2*sqrt(A)*self.alpha
class HighShelf(GainBiquad):
def build(self):
A = self.A
self.b0 = A*( (A+1) + (A-1)*cos(self.w0) + 2*sqrt(A)*self.alpha )
self.b1 = -2*A*( (A-1) + (A+1)*cos(self.w0) )
self.b2 = A*( (A+1) + (A-1)*cos(self.w0) - 2*sqrt(A)*self.alpha )
self.a0 = (A+1) - (A-1)*cos(self.w0) + 2*sqrt(A)*self.alpha
self.a1 = 2*( (A-1) - (A+1)*cos(self.w0) )
self.a2 = (A+1) - (A-1)*cos(self.w0) - 2*sqrt(A)*self.alpha
class LowShelfS(LowShelf):
def __init__(self, f0, S, gain):
self.gain = gain
Q = 1.0/sqrt((self.A + 1.0/self.A)*(1.0/S - 1.0) + 2.0)
LowShelf.__init__(self, f0, Q, gain)
class HighShelfS(HighShelf):
def __init__(self, f0, S, gain):
self.gain = gain
Q = 1.0/sqrt((self.A + 1.0/self.A)*(1.0/S - 1.0) + 2.0)
HighShelf.__init__(self, f0, Q, gain)
python 版biquad 实现
最新推荐文章于 2023-10-22 22:17:56 发布