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中的自定义函数学习笔记
Sep 23 Python
python 爬取微信文章
Jan 30 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
Python实现堡垒机模式下远程命令执行操作示例
May 09 Python
python生成并处理uuid的实现方式
Mar 03 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Python requests模块cookie实例解析
Apr 14 Python
解决python的空格和tab混淆而报错的问题
Feb 26 Python
Python字符串对齐方法使用(ljust()、rjust()和center())
Apr 26 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命名空间学习详解
2014/02/27 PHP
php curl常用的5个经典例子
2017/01/20 PHP
利用进制转换压缩数字函数分享
2014/01/02 Javascript
ajax请求乱码的解决方法(中文乱码)
2014/04/10 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
回顾Javascript React基础
2019/06/15 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
angular组件间传值测试的方法详解
2020/05/07 Javascript
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
pycharm的python_stubs问题
2020/04/08 Python
python中字典增加和删除使用方法
2020/09/30 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
体育专业个人的求职信范文
2013/09/21 职场文书
自荐书4要点
2014/01/25 职场文书
秋游活动策划方案
2014/02/16 职场文书
网络技术专业推荐信
2014/02/20 职场文书
学校节能减排倡议书
2014/05/16 职场文书
视光学专业自荐信
2014/06/24 职场文书
施工安全协议书范本
2014/09/26 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
小学教师党员承诺书
2015/04/27 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏