(python实现)FIR滤波器和IIR滤波器设计

FIR Filter

python 复制代码
def design_fir_filter(Fs, pass_freq, stop_freq, pass_attenuation, stop_attenuation, density_factor, filter_type):
    nyquist_freq = Fs * 0.5
    # filter_order2 = int(density_factor * nyquist_freq / (np.min(np.diff(stop_freq))))

    if (filter_type == 'low_pass'):
        if isinstance(pass_freq, list) or isinstance(stop_freq, list):
            print('pass_freq or stop_freq length not 1 !')
            return False
        filter_order = density_factor
        # filter_order = int(density_factor * nyquist_freq / (pass_freq - stop_freq))
        filter_coeff = signal.remez(filter_order + 1, [0, pass_freq, pass_freq + stop_freq, nyquist_freq],
                                [1, 0], [pass_attenuation, stop_attenuation], fs=Fs)
    elif (filter_type == 'high_pass'):
        if isinstance(pass_freq, list) or isinstance(stop_freq, list):
            print('pass_freq or stop_freq length not 1 !')
            return False
        filter_order = density_factor
        filter_coeff = signal.remez(filter_order + 1, [0, pass_freq - stop_freq, pass_freq , nyquist_freq],
                                [0, 1], [stop_attenuation, pass_attenuation], fs=Fs)
    else:
        filter_order = density_factor
        filter_coeff = signal.remez(filter_order + 1, [0, pass_freq[0]- stop_freq[0], pass_freq[0], pass_freq[1], pass_freq[1] + stop_freq[1], nyquist_freq],
                                [0, 1, 0], [stop_attenuation, pass_attenuation, stop_attenuation], fs=Fs)
    plot_response(filter_coeff, Fs, filter_type)
    return filter_coeff

def apply_fir_filter(filter_coeff, input_signal, num=None):
    if num is None:
        num = input_signal.shape[0]

    filtered_signals = np.zeros_like(input_signal[:num, :])

    for i in range(num):
        filtered_signals[i, :] = signal.lfilter(filter_coeff, 1, input_signal[i, :])

    return filtered_signals

IIR Filter

python 复制代码
def design_iir_butterworth_filter(pass_freq, stop_freq, gpass, gstop, fs_in=None, design_type='sos', filter_type='butterworth'):
    if design_type is 'sos':
        sos = signal.iirdesign(pass_freq, stop_freq, gpass, gstop, analog=False, ftype='butter', output='sos', fs=None)
        filter_coeff = sos
    else:
        b, a = signal.iirdesign(pass_freq, stop_freq, gpass, gstop, analog=False, ftype='butter', output='ba', fs=None)
        filter_coeff = [b, a]
    plot_response(filter_coeff, fs_in, filter_type)
    return filter_coeff

def apply_iir_filter(filter_coeff, input_signal, design_type='sos', num=None):
    if num is None:
        num = input_signal.shape[0]

    filtered_signals = np.zeros_like(input_signal[:num, :])
    if design_type is 'sos':
        for i in range(num):
            filtered_signals[i, :] = signal.sosfilt(filter_coeff, input_signal[i, :])
    else:
        for i in range(num):
            filtered_signals[i, :] = signal.lfilter(filter_coeff[0], filter_coeff[1], input_signal[i, :])

    return filtered_signals
相关推荐
计算机安禾1 分钟前
【数据结构与算法】第8篇:线性表(四):双向链表与循环链表
c语言·开发语言·数据结构·c++·算法·链表·visual studio
wangchunting1 分钟前
数据结构-线性数据结构
java·开发语言·数据结构
小陈工2 小时前
Python安全编程实践:常见漏洞与防护措施
运维·开发语言·人工智能·python·安全·django·开源
是娇娇公主~8 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
2401_874732538 小时前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
SuperEugene8 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
FreakStudio8 小时前
0 元学嵌入式 GUI!保姆级 LVGL+MicroPython 教程开更,从理论到实战全搞定
python·单片机·嵌入式·面向对象·电子diy
xuxie999 小时前
N11 ARM-irq
java·开发语言
wefly201710 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
luanma15098010 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php