Python 基于FIR實現(xiàn)Hilbert濾波器求信號包絡詳解
在通信領域,可以通過希爾伯特變換求解解析信號,進而求解窄帶信號的包絡。
實現(xiàn)希爾伯特變換有兩種方法,一種是對信號做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庫函數實現(xiàn)希爾伯特變換 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濾波器的頻率響應
使用音頻信號對兩種方法進行比較
由于音頻信號時間較長,采樣率較高,因此離散信號序列很長。使用頻域方法做FFT和IFFT要耗費比較長的時間;然而使用時域方法只是和濾波器沖擊響應做卷積,因此運算速度比較快。結果對比如下:
頻域方法結果
時域方法結果
由此看出,時域方法耗費時間要遠小于頻域方法。
以上這篇Python 基于FIR實現(xiàn)Hilbert濾波器求信號包絡詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析
這篇文章主要介紹了Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10Django利用Channels+websocket開發(fā)聊天室完整案例
Channels是Django團隊研發(fā)的一個給Django提供websocket支持的框架,使用它我們可以輕松開發(fā)需要長鏈接的實時通訊應用,下面這篇文章主要給大家介紹了關于Django利用Channels+websocket開發(fā)聊天室的相關資料,需要的朋友可以參考下2023-06-06python神經網絡使用tensorflow實現(xiàn)自編碼Autoencoder
這篇文章主要為大家介紹了python神經網絡使用tensorflow實現(xiàn)自編碼Autoencoder,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05Python基于socket實現(xiàn)簡單的即時通訊功能示例
這篇文章主要介紹了Python基于socket實現(xiàn)簡單的即時通訊功能,涉及Python基于socket模塊實現(xiàn)tcp通信客戶端與服務器端相關操作技巧,需要的朋友可以參考下2018-01-01Python sklearn中的.fit與.predict的用法說明
這篇文章主要介紹了Python sklearn中的.fit與.predict的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06mac安裝pytorch及系統(tǒng)的numpy更新方法
今天小編就為大家分享一篇mac安裝pytorch及系統(tǒng)的numpy更新方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07