<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Hilbert 變換提取信號(hào)特征的 Python 實(shí)現(xiàn)

          共 3158字,需瀏覽 7分鐘

           ·

          2021-02-10 21:31

          希爾伯特變換(hilbert transform) 一個(gè)連續(xù)時(shí)間信號(hào)s(t)的希爾伯特變換等于該信號(hào)通過(guò)具有沖激響應(yīng)h(t)=1/πt的線性系統(tǒng)以后的輸出響應(yīng)sh(t)。
          好的,這是Hilbert變換的定義,我們這里討論它的一個(gè)具體用途,提取信號(hào)特征值,提取信號(hào)特征值有什么用呢?
          先來(lái)一段特征值的定義:
          設(shè) A 是n階方陣,如果存在數(shù)m和非零n維列向量 x,使得 Ax=mx 成立,則稱 m 是A的一個(gè)特征值或本征值。
          所以信號(hào)特征值可以用來(lái)代替一段信號(hào)對(duì)系統(tǒng)產(chǎn)生的影響,或者說(shuō)取代一段信號(hào)并填補(bǔ)它功能的空缺,我們按照這個(gè)思想,在外界或內(nèi)部改變信號(hào)的某些條件之后,可以用特征值隨外界或內(nèi)部因素的變化圖像來(lái)反映干擾因素對(duì)信號(hào)的影響,或者反映信號(hào)本身對(duì)外界干擾的抵抗力及自身的穩(wěn)定性、魯棒性等性質(zhì)。
          那么具體怎么用呢?設(shè)有一個(gè)實(shí)值函數(shù)s(t),其希爾伯特反變換記作\hat{s}(t) ,則有:
          希爾伯特變換:

          希爾伯特反變換:

          上面說(shuō)的就是初始信號(hào)s(t),我們首先把它做一次希爾伯特變換,然后提取特征值。
          都有什么特征值呢?
          那我們得先補(bǔ)充一個(gè)知識(shí)點(diǎn),包絡(luò):隨機(jī)過(guò)程的振幅隨著時(shí)間變化的曲線。也就是信號(hào)的振幅與時(shí)間(A-t)間的函數(shù)關(guān)系。
          那么根據(jù)不同信號(hào)包絡(luò)上高階統(tǒng)計(jì)量特征不同,可分為R值特征和J值特征。
          信號(hào)包絡(luò)R值特征:R值是信號(hào)包絡(luò)的方差與包絡(luò)均值的平方的比值:

          信號(hào)包絡(luò)J值特征:J值是信號(hào)包洛的四階矩和二階矩平方之間的差值與包絡(luò)均值的平方的比值:

          *雙譜特征:利用積分的方法將二維雙譜積分函數(shù)轉(zhuǎn)換為一維雙譜積分函數(shù),從而實(shí)現(xiàn)計(jì)算方法簡(jiǎn)單的積分雙譜:

          根據(jù)輻射源信號(hào)指紋識(shí)別技術(shù)http://xueshu.baidu.com/usercenter/paper/show?paperid=f2c7b987bd3af320909da0e1c09a723b&site=xueshu_se,這篇論文,三種特征值能夠很好的表現(xiàn)信號(hào)性能。
          好了,基礎(chǔ)的知識(shí)就是這些,下面我們寫代碼實(shí)現(xiàn)Hilbert變換,計(jì)算并提取三種特征值。
          import?numpy?as?np?

          from?math?import?pi?

          import?matplotlib.pyplot?as?plt?

          import?math?

          from?scipy?import?fftpack?

          from?sklearn?import?preprocessing?

          import?neurolab?as?nl?
          #碼元數(shù)?

          size?=?10?

          sampling_t?=?0.01?

          t?=?np.arange(0,?size,?sampling_t)?

          #隨機(jī)生成信號(hào)序列?

          a?=?np.random.randint(0,?2,?size)??#產(chǎn)生隨機(jī)整數(shù)序列?

          m?=?np.zeros(len(t),?dtype=np.float32)????#產(chǎn)生一個(gè)給定形狀和類型的用0填充的數(shù)組?

          for?i?in?range(len(t)):?

          ????m[i]?=?a[int(math.floor(t[i]))]?

          ts1?=?np.arange(0,?(np.int64(1/sampling_t)?*?size))/(10*(m+1))?

          fsk?=?np.cos(np.dot(2?*?pi,?ts1)?+?pi?/?4)?

          def?awgn(y,?snr):??????#snr為信噪比dB值?

          ????snr?=?10?**?(snr?/?10.0)?

          ????xpower?=?np.sum(y?**?2)?/?len(y)?

          ????npower?=?xpower?/?snr?

          ????return?np.random.randn(len(y))?*?np.sqrt(npower)?+?y?

          def?feature_rj(y):????????#[feature1,?f2,?f3]?=?rj(noise_bpsk,?fs)?

          ????h?=?fftpack.hilbert(y)??#?hilbert變換?

          ????z?=?np.sqrt(y**2?+?h**2)??#?包絡(luò)?

          ????m2?=?np.mean(z**2)????#?包絡(luò)的二階矩?

          ????m4?=?np.mean(z**4)????#?包絡(luò)的四階矩?

          ????r?=?abs((m4-m2**2)/m2**2)?

          ????Ps?=?np.mean(y**2)/2?

          ????j?=?abs((m4-2*m2**2)/(4*Ps**2))?

          ????return?(r,j)?

          def?feature_Bispectrum(y):?

          ????ly?=?size??#?行數(shù)10?

          ????nrecs?=?np.int64(1?/?sampling_t)??#?列數(shù)100?

          ????nlag?=?20?

          ????nsamp?=?nrecs??#?每段樣本數(shù)100?

          ????nrecord?=?size?

          ????nfft?=?128?

          ????Bspec?=?np.zeros((nfft,?nfft),?dtype=np.float32)?

          ????y?=?y.reshape(ly,?nrecs)?

          ????c3?=?np.zeros((nlag?+?1,?nlag?+?1),?dtype=np.float32)?

          ????ind?=?np.arange(nsamp)?

          ????for?k?in?range(nrecord):?

          ????????x?=?y[k][ind]?

          ????????x?=?x?-?np.mean(x)?

          ????????for?j?in?range(nlag?+?1):?

          ????????????z?=?np.multiply(x[np.arange(nsamp?-?j)],?x[np.arange(j,?nsamp)])?

          ????????????for?i?in?range(j,?nlag?+?1):?

          ????????????????sum?=?np.mat(z[np.arange(nsamp?-?i)])?*?np.mat(x[np.arange(i,?nsamp)]).T?

          ????????????????sum?=?sum?/?nsamp?

          ????????????????c3[i][j]?=?c3[i][j]?+?sum??#?i,j順序?

          ????c3?=?c3?/?nrecord?

          ????c3?=?c3?+?np.mat(np.tril(c3,?-1)).T??#?取對(duì)角線以下三角,c3為矩陣?

          ????c31?=?c3[1:,?1:]?

          ????c32?=?np.mat(np.zeros((nlag,?nlag),?dtype=np.float32))?

          ????c33?=?np.mat(np.zeros((nlag,?nlag),?dtype=np.float32))??#?不可以直接3者相等?

          ????c34?=?np.mat(np.zeros((nlag,?nlag),?dtype=np.float32))?

          ????for?i?in?range(nlag):?

          ????????x?=?c31[i:,?i]?

          ????????c32[nlag?-?1?-?i,?0:nlag?-?i]?=?x.T?

          ????????c34[0:nlag?-?i,?nlag?-?1?-?i]?=?x?

          ????????if?i?1):?

          ????????????x?=?np.flipud(x[1:,?0])??#?上下翻轉(zhuǎn),翻轉(zhuǎn)后依然為矩陣?

          ????????????c33?=?c33?+?np.diag(np.array(x)[:,?0],?i?+?1)?+?np.diag(np.array(x)[:,?0],?-(i?+?1))?

          ????c33?=?c33?+?np.diag(np.array(c3)[0,?:0:-1])?

          ????cmat?=?np.vstack((np.hstack((c33,?c32,?np.zeros((nlag,?1),?dtype=np.float32))),?

          ??????????????????????np.hstack((np.vstack((c34,?np.zeros((1,?nlag),?dtype=np.float32))),?c3))))??????????#41*41?

          ????Bspec?=?fftpack.fft2(cmat,?[nfft,?nfft])?????

          ????Bspec?=?np.fft.fftshift(Bspec)????????????????#128*128?

          ????waxis?=?np.arange(-nfft?/?2,?nfft?/?2)?/?nfft?

          ????X,?Y?=?np.meshgrid(waxis,?waxis)?

          ????plt.contourf(X,?Y,?abs(Bspec),alpha=0,cmap=plt.cm.hot)?

          ????plt.contour(X,?Y,?abs(Bspec))?

          ????plt.show()?

          ????return?Bspec?

          def?features(s):?

          #????for?mc?in?range(2):?

          ????????snr?=?np.random.uniform(0,?20)??????#從一個(gè)均勻分布集合中隨機(jī)采樣,左閉右開(kāi)--[low,high)?

          ????????s?=?awgn(s,snr)????????????#在原始信號(hào)的基礎(chǔ)上增加SNR信噪比的噪音?

          ????????rj?=?np.array(feature_rj(s))??????????????#計(jì)算R,J特征?

          ????????z?=?feature_Bispectrum(s)??????????????????#計(jì)算雙譜特征,并畫圖像?

          ????????xx?=?np.int64(np.sqrt(np.size(z))/2)?

          ????????z?=?np.array(z[:xx,xx:])?

          ????????z?=?np.tril(z).real??????????????#取復(fù)數(shù)z的實(shí)部?

          ????????bis?=?np.zeros((1,?xx),dtype=np.float32)????#零組?

          ????????for?i?in?range(xx):?

          ????????????for?j?in?range(xx-i):?

          ????????????????bis[0][i]?=?bis[0][i]+z[xx-1-j][i+j]?

          ????????m?=?bis[0].reshape(1,xx)?

          ????????normalized?=?preprocessing.normalize(m)[0,:]????#樣本各個(gè)特征值除以各個(gè)特征值的平方之和?

          ????????features?=?np.hstack((rj,normalized))??????????#合并數(shù)組r,j和normalized?

          ????????return?features?

          print(features(fsk))?

          好的,特征值已經(jīng)有了,那么下面我們?cè)趺词褂眠@些特征值來(lái)描述初始信號(hào)的變化趨勢(shì)呢?
          畫出特征值曲線是個(gè)不錯(cuò)的辦法,趨勢(shì)一目了然,為了說(shuō)明信號(hào)受到影響,我們分別從信號(hào)的振幅A,角頻率\omega ,初始頻率S的改變來(lái)說(shuō)明問(wèn)題。初始信號(hào)圖像如下:

          為了統(tǒng)一起見(jiàn),我們分別令A\omegaS從0到2\Pi 均勻變化,對(duì)于振幅A的變化,補(bǔ)充代碼計(jì)算R,J特征值,畫出雙譜圖:
          R?=?[]

          J?=?[]?

          ts1?=?np.arange(0,?(np.int64(1/sampling_t)?*?size))/(10*(m+1))?

          W?=?[]?

          Z?=?[]?

          for?i?in?range(0,40,1):?

          ????W.append(i?/?(2?*?pi))?

          for?a1?in?W:?

          ????global?r,j?

          ????fsk?=?a1?*?np.cos(np.dot(2?*?pi,?ts1)?+?pi?/?4)?

          ????features(fsk)?

          ????R.append(r)?

          ????J.append(j)?

          plt.plot(W,?R,?color='green',?label='1')?

          plt.legend()?#?顯示圖例?

          plt.xlabel('A[0-2?*?pi]')?

          plt.ylabel('R')?

          plt.show()?

          plt.plot(W,?J,?color='red',?label='2')?

          plt.legend()?#?顯示圖例?

          plt.xlabel('A[0-2?*?pi]')?

          plt.ylabel('J')?

          plt.show()?

          plt.plot(W,?Z,?color='red',?label='3')?

          plt.legend()?#?顯示圖例?

          plt.xlabel('A[0-2?*?pi]')?

          plt.ylabel('trend')?

          plt.show()?

          R特征值變化圖像:

          J特征值變化圖像:

          雙譜圖像:

          對(duì)于角頻率ω的變化,補(bǔ)充代碼計(jì)算R,J特征值,畫出R、J、雙譜圖像:
          R?=?[]

          J?=?[]?

          ts1?=?np.arange(0,?(np.int64(1/sampling_t)?*?size))/(10*(m+1))?

          W?=?[]?

          Z?=?[]?

          for?i?in?range(0,40,1):?

          ????W.append(i?/?(2?*?pi))?

          for?w?in?W:?

          ????global?r,j?

          ????fsk?=?np.cos(np.dot(w,?ts1)?+?pi?/?4)?

          ????features(fsk)?

          ????R.append(r)?

          ????J.append(j)?

          plt.plot(W,?R,?color='green',?label='1')?

          plt.legend()?#?顯示圖例?

          plt.xlabel('w[0-2?*?pi]')?

          plt.ylabel('R')?

          plt.show()?

          plt.plot(W,?J,?color='red',?label='2')?

          plt.legend()?#?顯示圖例?

          plt.xlabel('w[0-2?*?pi]')?

          plt.ylabel('J')?

          plt.show()?

          plt.plot(W,?Z,?color='red',?label='3')?

          plt.legend()?#?顯示圖例?

          plt.xlabel('A[0-2?*?pi]')?

          plt.ylabel('trend')?

          plt.show()?

          R特征值變化圖像:

          J特征值變化圖像:

          雙譜圖像:

          對(duì)于初始頻率S的變化,補(bǔ)充代碼計(jì)算R,J特征值,畫出雙譜圖:
          R?=?[]

          J?=?[]?

          ts1?=?np.arange(0,?(np.int64(1/sampling_t)?*?size))/(10*(m+1))?

          W?=?[]?

          Z?=?[]?

          for?i?in?range(0,40,1):?

          ????W.append(i?/?(2?*?pi))?

          for?s?in?W:?

          ????global?r,j?

          ????fsk?=?np.cos(np.dot(2?*?pi,?ts1)?+?s)?

          ????features(fsk)?

          ????R.append(r)?

          ????J.append(j)?

          plt.plot(W,?R,?color='green',?label='1')?

          plt.legend()?#?顯示圖例?

          plt.xlabel('s[0-2?*?pi]')?

          plt.ylabel('R')?

          plt.show()?

          plt.plot(W,?J,?color='red',?label='2')?

          plt.legend()?#?顯示圖例?

          plt.xlabel('s[0-2?*?pi]')?

          plt.ylabel('J')?

          plt.show()?

          plt.plot(W,?Z,?color='red',?label='3')?

          plt.legend()?#?顯示圖例?

          plt.xlabel('A[0-2?*?pi]')?

          plt.ylabel('trend')?

          plt.show()?

          R特征值變化圖像:

          J特征值變化圖像:

          雙譜圖像:

          二維的雙譜圖像看起來(lái)不是很方便,那么對(duì)圖像進(jìn)行降維處理,像這種比較對(duì)稱的矩陣,用矩陣平均值是最適合的了,這里只需將希爾伯特變換后的包絡(luò)矩陣求下均值,改變下述代碼即可:
          Bspec?=?fftpack.fft2(cmat,?[nfft,?nfft])

          Bspec?=?np.fft.fftshift(Bspec)????????????????#128*128?

          waxis?=?np.arange(-nfft?/?2,?nfft?/?2)?/?nfft?

          X,?Y?=?np.meshgrid(waxis,?waxis)?

          plt.contourf(X,?Y,?abs(Bspec))?

          plt.contour(X,?Y,?abs(Bspec))?

          Z.append(np.mean(abs(Bspec)))?

          則雙譜特征降維后圖像如下,振幅A的雙譜特征變化情況:

          角頻率\omega 的雙譜特征變化情況:

          初始頻率S的雙譜特征變化情況:

          文章能看到最后真的很不容易,代碼以及部分延伸已上傳到GitHub及Gitee上,求star:
          GitHub:https://github.com/wangwei39120157028/Signal_Feature_Extraction/
          Gitee:https://gitee.com/wwy2018/Signal_Feature_Extraction
          歡迎再到我的GitHub和Gitee上看看我的關(guān)于逆向工程的項(xiàng)目,點(diǎn)贊求星。
          GitHub:https://github.com/wangwei39120157028/IDAPythonScripts
          Gitee:https://gitee.com/wwy2018/IDAPythonScripts


          更多閱讀



          2020 年最佳流行 Python 庫(kù) Top 10


          2020 Python中文社區(qū)熱門文章 Top 10


          5分鐘快速掌握 Python 定時(shí)任務(wù)框架

          特別推薦




          點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員

          瀏覽 91
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91AV电影在线播放 | 无码无套少妇毛多18PXXXX | 丰满老熟女 | 美女草逼| 中文有码人妻熟女久久 |