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数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
Python for循环生成列表的实例
Jun 15 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 Python
python nmap实现端口扫描器教程
May 28 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
python标准库os库的函数介绍
Feb 12 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 Python
Python实现生成bmp图像的方法
Jun 13 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&java(一)
2006/10/09 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
JS 面向对象之神奇的prototype
2011/02/26 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
2015/04/10 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
2016/01/28 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
[04:39]显微镜下的DOTA2第十三期—Pis卡尔个人秀
2014/04/04 DOTA
理解Python中函数的参数
2015/04/27 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
Django 连接sql server数据库的方法
2018/06/30 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
python如何实现代码检查
2019/06/28 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
学习Python需要哪些工具
2020/09/04 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
机电一体化专业推荐信
2013/12/03 职场文书
社团文化节邀请函
2014/01/10 职场文书
市优秀教师事迹材料
2014/02/05 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python