常见二阶滤波器的配置 python

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值