Python 基于FIR实现Hilbert滤波器求信号包络详解


Posted in Python onFebruary 26, 2020

在通信领域,可以通过希尔伯特变换求解解析信号,进而求解窄带信号的包络。

实现希尔伯特变换有两种方法,一种是对信号做FFT,单后只保留单边频谱,在做IFFT,我们称之为频域方法;另一种是基于FIR根据传递函数设计一个希尔伯特滤波器,我们称之为时域方法。

# -*- coding:utf8 -*-
# @TIME   : 2019/4/11 18:30
# @Author  : SuHao
# @File   : hilberfilter.py


import scipy.signal as signal
import numpy as np
import librosa as lib
import matplotlib.pyplot as plt
import time
# from preprocess_filter import *

# 读取音频文件
ex = '..\\..\\数据集2\\pre2012\\bflute\\BassFlute.ff.C5B5.aiff'
time_series, fs = lib.load(ex, sr=None, mono=True, res_type='kaiser_best')

# 生成一个chirp信号
# duration = 2.0
# fs = 400.0
# samples = int(fs*duration)
# t = np.arange(samples) / fs
# time_series = signal.chirp(t, 20.0, t[-1], 100.0)
# time_series *= (1.0 + 0.5 * np.sin(2.0*np.pi*3.0*t) )

def hilbert_filter(x, fs, order=201, pic=None):
  '''
  :param x: 输入信号
  :param fs: 信号采样频率
  :param order: 希尔伯特滤波器阶数
  :param pic: 是否绘图,bool
  :return: 包络信号
  '''
  co = [2*np.sin(np.pi*n/2)**2/np.pi/n for n in range(1, order+1)]
  co1 = [2*np.sin(np.pi*n/2)**2/np.pi/n for n in range(-order, 0)]
  co = co1+[0]+ co
  # out = signal.filtfilt(b=co, a=1, x=x, padlen=int((order-1)/2))
  out = signal.convolve(x, co, mode='same', method='direct')
  envolope = np.sqrt(out**2 + x**2)
  if pic is not None:
    w, h = signal.freqz(b=co, a=1, worN=2048, whole=False, plot=None, fs=2*np.pi)
    fig, ax1 = plt.subplots()
    ax1.set_title('hilbert filter frequency response')
    ax1.plot(w, 20 * np.log10(abs(h)), 'b')
    ax1.set_ylabel('Amplitude [dB]', color='b')
    ax1.set_xlabel('Frequency [rad/sample]')
    ax2 = ax1.twinx()
    angles = np.unwrap(np.angle(h))
    ax2.plot(w, angles, 'g')
    ax2.set_ylabel('Angle (radians)', color='g')
    ax2.grid()
    ax2.axis('tight')
    # plt.savefig(pic + 'hilbert_filter.jpg')
    plt.show()
    # plt.clf()
    # plt.close()
  return envolope

start = time.time()
env0 = hilbert_filter(time_series, fs, 81, pic=True)
end = time.time()
a = end-start
print(a)

plt.figure()
ax1 = plt.subplot(211)
plt.plot(time_series)
ax2 = plt.subplot(212)
plt.plot(env0)
plt.xlabel('time')
plt.ylabel('mag')
plt.title('envolope of music by FIR \n time:%.3f'%a)
plt.tight_layout()

start = time.time()
# 使用scipy库函数实现希尔伯特变换
env = np.abs(signal.hilbert(time_series))
end = time.time()
a = end-start
print(a)


plt.figure()
ax1 = plt.subplot(211)
plt.plot(time_series)
ax2 = plt.subplot(212)
plt.plot(env)
plt.xlabel('time')
plt.ylabel('mag')
plt.title('envolope of music by scipy \n time:%.3f'%a)
plt.tight_layout()
plt.show()

使用chirp信号对两种方法进行比较

FIR滤波器的频率响应

Python 基于FIR实现Hilbert滤波器求信号包络详解

使用音频信号对两种方法进行比较

由于音频信号时间较长,采样率较高,因此离散信号序列很长。使用频域方法做FFT和IFFT要耗费比较长的时间;然而使用时域方法只是和滤波器冲击响应做卷积,因此运算速度比较快。结果对比如下:

频域方法结果

Python 基于FIR实现Hilbert滤波器求信号包络详解

时域方法结果

Python 基于FIR实现Hilbert滤波器求信号包络详解

由此看出,时域方法耗费时间要远小于频域方法。

以上这篇Python 基于FIR实现Hilbert滤波器求信号包络详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python自动化工具日志查询分析脚本代码实现
Nov 26 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
pandas进行数据的交集与并集方式的数据合并方法
Jun 27 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
Python综合应用名片管理系统案例详解
Jan 03 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
使用Python爬取弹出窗口信息的实例
Mar 14 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
Aug 11 Python
python实现逆滤波与维纳滤波示例
Feb 26 #Python
Python全面分析系统的时域特性和频率域特性
Feb 26 #Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 #Python
Python中os模块功能与用法详解
Feb 26 #Python
Python中sys模块功能与用法实例详解
Feb 26 #Python
Python线程threading模块用法详解
Feb 26 #Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 #Python
You might like
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
PHP 中dirname(_file_)讲解
2007/03/18 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
Stop SQL Server
2007/06/21 Javascript
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
基于jQuery的Spin Button自定义文本框数值自增或自减
2010/07/17 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
Javascript浅谈之引用类型
2013/12/18 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
javascript实现滑动解锁功能
2014/12/31 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
使用Javascript实现选择下拉菜单互移并排序
2016/02/23 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
简单实现python数独游戏
2018/03/30 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
Python pymongo模块常用操作分析
2018/09/01 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
如何理解python对象
2020/06/21 Python
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
安全责任书范文
2014/03/12 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
党性教育心得体会
2014/09/03 职场文书
客房领班岗位职责
2015/02/11 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
jquery插件实现搜索历史
2021/04/24 jQuery
redis内存空间效率问题的深入探究
2021/05/17 Redis
详解JS数组方法
2021/11/20 Javascript