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定时执行之Timer用法示例
May 27 Python
python3实现公众号每日定时发送日报和图片
Feb 24 Python
解决pip install的时候报错timed out的问题
Jun 12 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
python实现提取COCO,VOC数据集中特定的类
Mar 10 Python
Python使用monkey.patch_all()解决协程阻塞问题
Apr 15 Python
python 邮件检测工具mmpi的使用
Jan 04 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 Python
Python字符串格式化方式
Apr 07 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
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
JS删除数组元素的函数介绍
2013/03/27 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
JS验证不重复验证码
2017/02/10 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
Vue props 单向数据流的实现
2018/11/06 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
python实现Decorator模式实例代码
2018/02/09 Python
python requests 测试代理ip是否生效
2018/07/25 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
城管综合整治方案
2014/05/01 职场文书
学校2014年度工作总结
2014/12/06 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
学校党支部承诺书
2015/04/30 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB