這篇文章將為大家詳細(xì)講解有關(guān)Python基于FIR如何實(shí)現(xiàn)Hilbert濾波器求信號包絡(luò),小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)桑珠孜,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108在通信領(lǐng)域,可以通過希爾伯特變換求解解析信號,進(jìn)而求解窄帶信號的包絡(luò)。
實(shí)現(xiàn)希爾伯特變換有兩種方法,一種是對信號做FFT,單后只保留單邊頻譜,在做IFFT,我們稱之為頻域方法;另一種是基于FIR根據(jù)傳遞函數(shù)設(shè)計一個希爾伯特濾波器,我們稱之為時域方法。
# -*- 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 = '..\\..\\數(shù)據(jù)集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: 希爾伯特濾波器階數(shù) :param pic: 是否繪圖,bool :return: 包絡(luò)信號 ''' 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庫函數(shù)實(shí)現(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信號對兩種方法進(jìn)行比較
FIR濾波器的頻率響應(yīng)
使用音頻信號對兩種方法進(jìn)行比較
由于音頻信號時間較長,采樣率較高,因此離散信號序列很長。使用頻域方法做FFT和IFFT要耗費(fèi)比較長的時間;然而使用時域方法只是和濾波器沖擊響應(yīng)做卷積,因此運(yùn)算速度比較快。結(jié)果對比如下:
頻域方法結(jié)果
時域方法結(jié)果
由此看出,時域方法耗費(fèi)時間要遠(yuǎn)小于頻域方法。
1、云計算,典型應(yīng)用OpenStack。2、WEB前端開發(fā),眾多大型網(wǎng)站均為Python開發(fā)。3.人工智能應(yīng)用,基于大數(shù)據(jù)分析和深度學(xué)習(xí)而發(fā)展出來的人工智能本質(zhì)上已經(jīng)無法離開python。4、系統(tǒng)運(yùn)維工程項目,自動化運(yùn)維的標(biāo)配就是python+Django/flask。5、金融理財分析,量化交易,金融分析。6、大數(shù)據(jù)分析。
關(guān)于“Python基于FIR如何實(shí)現(xiàn)Hilbert濾波器求信號包絡(luò)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。