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字典的常用操作方法小结
May 16 Python
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
Python实现冒泡排序的简单应用示例
Dec 11 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
python binascii 进制转换实例
Jun 12 Python
python实现集中式的病毒扫描功能详解
Jul 09 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 Python
python requests.get带header
May 05 Python
在python下实现word2vec词向量训练与加载实例
Jun 09 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 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
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
PHP中使用BigMap实例
2015/03/30 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
python版DDOS攻击脚本
2019/06/12 Python
基于python 凸包问题的解决
2020/04/16 Python
python 如何调用 dubbo 接口
2020/09/24 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
物业品质提升方案
2014/06/08 职场文书
户籍证明书标准模板
2014/09/10 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android