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 相关文章推荐
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
May 17 Python
python中通过预先编译正则表达式提高效率
Sep 25 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
利用Pycharm断点调试Python程序的方法
Nov 29 Python
对python3.4 字符串转16进制的实例详解
Jun 12 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
通过实例解析python创建进程常用方法
Jun 19 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
Django跨域请求原理及实现代码
Nov 14 Python
python制作一个简单的gui 数据库查询界面
Nov 19 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
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
vue-router传参用法详解
2019/01/19 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
vue自定义正在加载动画的例子
2019/11/14 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
国际贸易专业求职信
2014/06/04 职场文书
中学清明节活动总结
2014/07/04 职场文书
学校周年庆活动方案
2014/08/22 职场文书
校长创先争优承诺书
2014/08/30 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
机关作风建设自查报告
2014/10/22 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
python实现简单反弹球游戏
2021/04/12 Python
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python