import imp
import numpy as np
import random
from scipy import signal
from operator import methodcaller
class filter_second_order(object):
def low_pass_filter_iir(self,f0,gain, Q=1., fs=16000):
"""
根据PEQ参数设计二阶IIR数字低通滤波器,默认采样率192k
:param f0: 中心频率
:param Q: 峰值带宽
:param fs: 系统采样率
:return: 双二阶滤波器系数
"""
w0 = 2 * np.pi * f0 / fs
alpha = np.sin(w0) / (2 * Q)
b0 = (1 - np.cos(w0)) / 2
b1 = 1 - np.cos(w0)
b2 = (1 - np.cos(w0)) / 2
a0 = 1 + alpha
a1 = -2 * np.cos(w0)
a2 = 1 - alpha
b = np.array([b0, b1, b2])
a = np.array([a0, a1, a2])
#h = np.hstack((b / a[0], a / a[0]))
return b,a
def high_pass_filter_iir(self,f0, Q=1., fs=16000):
"""
根据PEQ参数设计二阶IIR数字高通滤波器,默认采样率192k
:param f0: 中心频率
:param Q: 峰值带宽
:param fs: 系统采样率
:return: 双二阶滤波器系数
"""
w0 = 2 * np.pi * f0 / fs
alpha = np.sin(w0) / (2 * Q)
b0 = (1 + np.cos(w0)) / 2
b1 = -1 - np.cos(w0)
b2 = (1 + np.cos(w0)) / 2
a0 = 1 + alpha
a1 = -2 * np.cos(w0)
a2 = 1 - alpha
b = np.array([b0, b1, b2])
a = np.array([a0, a1, a2])
#h = np.hstack((b / a[0], a / a[0]))
return b,a
def low_shelf_filter_iir(self,f0, gain=0., Q=1., fs=16000):
"""
根据PEQ参数设计二阶IIR数字low shelf滤波器,默认采样率192k
:param f0: 中心频率
:param gain: 峰值增益
:param Q: 峰值带宽
:param fs: 系统采样率
:return: 双二阶滤波器系数
"""
A = np.sqrt(10 ** (gain / 20))
w0 = 2 * np.pi * f0 / fs
alpha = np.sin(w0) / (2 * Q)
b0 = A * ((A + 1) - (A - 1) * np.cos(w0) + 2 * np.sqrt(A) * alpha)
b1 = 2 * A * ((A - 1) - (A + 1) * np.cos(w0))
b2 = A * ((A + 1) - (A - 1) * np.cos(w0) - 2 * np.sqrt(A) * alpha)
a0 = (A + 1) + (A - 1) * np.cos(w0) + 2 * np.sqrt(A) * alpha
a1 = -2 * ((A - 1) + (A + 1) * np.cos(w0))
a2 = (A + 1) + (A - 1) * np.cos(w0) - 2 * np.sqrt(A) * alpha
b = np.array([b0, b1, b2])
a = np.array([a0, a1, a2])
#h = np.hstack((b / a[0], a / a[0]))
return b,a
def high_shelf_filter_iir(self,f0, gain=0., Q=1., fs=16000):
"""
根据PEQ参数设计二阶IIR数字high shelf滤波器,默认采样率192k
:param f0: 中心频率
:param gain: 峰值增益
:param Q: 峰值带宽
:param fs: 系统采样率
:return: 双二阶滤波器系数
"""
A = np.sqrt(10 ** (gain / 20))
w0 = 2 * np.pi * f0 / fs
alpha = np.sin(w0) / (2 * Q)
b0 = A * ((A + 1) + (A - 1) * np.cos(w0) + 2 * np.sqrt(A) * alpha)
b1 = -2 * A * ((A - 1) + (A + 1) * np.cos(w0))
b2 = A * ((A + 1) + (A - 1) * np.cos(w0) - 2 * np.sqrt(A) * alpha)
a0 = (A + 1) - (A - 1) * np.cos(w0) + 2 * np.sqrt(A) * alpha
a1 = 2 * ((A - 1) - (A + 1) * np.cos(w0))
a2 = (A + 1) - (A - 1) * np.cos(w0) - 2 * np.sqrt(A) * alpha
b = np.array([b0, b1, b2])
a = np.array([a0, a1, a2])
#h = np.hstack((b / a[0], a / a[0]))
return b,a
def peak_filter_iir(self,f0, gain=0., Q=1., fs=16000):
"""
根据PEQ参数设计二阶IIR数字peak滤波器,默认采样率192k
:param f0: 中心频率
:param gain: 峰值增益,正值为peak filter,负值为notch filter
:param Q: 峰值带宽
:param fs: 系统采样率
:return: 双二阶滤波器系数
"""
A = np.sqrt(10 ** (gain / 20))
w0 = 2 * np.pi * f0 / fs
alpha = np.sin(w0) / (2 * Q)
b0 = 1 + alpha * A
b1 = -2 * np.cos(w0)
b2 = 1 - alpha * A
a0 = 1 + alpha / A
a1 = -2 * np.cos(w0)
a2 = 1 - alpha / A
b = np.array([b0, b1, b2])
a = np.array([a0, a1, a2])
# h = np.hstack((b / a[0], a / a[0]))
return b,a
def notch_filter_iir(self,f0, gain=0., Q=1., fs=16000):
"""
根据PEQ参数设计二阶IIR数字peak滤波器默认采样率192k
:param f0: 中心频率
:param gain: 峰值增益正值为peak filter,负值为notch filter
:param Q: 峰值带宽
:param fs: 系统采样率
:return: 双二阶滤波器系数
"""
w0 = 2 * np.pi * f0 / fs
alpha = np.sin(w0) / (2 * Q)
b0 = 1
b1 = -2 * np.cos(w0)
b2 = 1
a0 = 1 + alpha
a1 = -2 * np.cos(w0)
a2 = 1 - alpha
b = np.array([b0, b1, b2])
a = np.array([a0, a1, a2])
# h = np.hstack((b / a[0], a / a[0]))
return b,a
class rand_second_order_filter():
def __init__(self,f_low=400,f_high=8000,gian_low=-15,gain_high=15,q_low=0.5,q_high=1.5):
super().__init__()
filter_list=[
'low_shelf_filter_iir',
'high_shelf_filter_iir',
'low_pass_filter_iir',
'peak_filter_iir',
'notch_filter_iir',
]
#'high_pass_filter_iir',
self.freq = random.randint(f_low,f_high)
self.gain = random.randint(gian_low,gain_high)
self.q = random.uniform(q_low,q_high)
self.filter_name = random.choice(filter_list)
def filter(self,data):
filter_list = filter_second_order()
b, a = methodcaller(self.filter_name,self.freq,self.gain,self.q)(filter_list)
data_filter = signal.filtfilt(b,a,data,axis=0)
return data_filter
常见二阶滤波器的配置 python
最新推荐文章于 2024-09-30 13:35:59 发布