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引用DLL文件的方法
May 11 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
CentOS7.3编译安装Python3.6.2的方法
Jan 22 Python
Python内建模块struct实例详解
Feb 02 Python
Python中enumerate()函数编写更Pythonic的循环
Mar 06 Python
django 将model转换为字典的方法示例
Oct 16 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
python+unittest+requests实现接口自动化的方法
Nov 29 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
面向新手解析python Beautiful Soup基本用法
Jul 11 Python
python实现学生信息管理系统(精简版)
Nov 27 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 - Html Transfer Code
2006/10/09 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
编程语言Python的发展史
2014/09/26 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
python的数学算法函数及公式用法
2020/11/18 Python
pytorch中index_select()的用法详解
2021/01/06 Python
HTML5注册页面示例代码
2014/03/27 HTML / CSS
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
银行竞聘演讲稿范文
2014/04/23 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
党员批评与自我批评
2014/10/15 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python