日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

相关与卷积(数字信号处理)的数学原理及 Python 实现

發布時間:2025/3/20 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 相关与卷积(数字信号处理)的数学原理及 Python 实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數學原理
  
在數字信號處理中,相關(correlation)可以分為互相關(cross correlation)和自相關(auto-correlation). 互相關是兩個數字序列之間的運算;自相關是單個數字序列本身的運算,可以看成是兩個相同數字序列的互相關運算.互相關用來度量一個數字序列移位后,與另一個數字序列的相似程度.其數學公式如下:


其中,f 和 g 為數字序列,n 為移位的位數,f* 表示 f 序列值的復數共軛,即復數的實部不變,虛部取反.

而卷積(convolution)與互相關運算相似,定義為將其中一個序列反轉并移位后,兩個序列的乘積的積分(求和),其數學公式如下:


其中,f 和 g 為數字序列,n 為移位的位數.

在實數范圍內,f 的復數共軛 f* = f .此時,通過比較上面兩式可知:序列 f 與將序列 g 反轉后的序列的卷積為序列 f 與序列 g 的互相關

Python 實現

采用兩種方式實現:自定義互相關函數和直接調用 numpy.correlate 或 numpy.convolve.

在 numpy 中, numpy.correlate 函數實現兩個一維數組的互相關操作;numpy.convolve 實現了兩個一維數組的卷積操作.其中定義了三種模式(‘valid’, ‘same’,‘full’).

設兩個序列長度分別為 M 和 N,則

  • ‘valid’ 模式:輸出長度為 max(M,N)-min(M,N)+1.只返回兩個序列完全重合部分的點的卷積或相關運算;
  • ‘same’ 模式:輸出長度為兩個序列中的較長者,即 max(M,N);
  • ‘full’ 模式:輸出長度為 M+N-1, 返回所有包含重疊部分的點.

互相關或卷積,實際上,就是計算兩個序列(一維數組)在不同移位情況下,兩個序列逐位相乘之后,求和的結果.不同模式只是返回互相關或卷積結果的不同部分.

注:如果在超出數組的索引范圍,用 0 填充.

下面代碼,采用自定義函數 correlate_func (只適用于實數值) 實現 numpy.correlate 和 numpy.convolve 的三種模式,并進行測試.

#!//usr/bin/env python # -*- coding: utf8 -*- """ 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! """ from __future__ import print_function import numpy as npdef correlate_func(a, b, mode='valid', conv=True):'''correlation or convolution in 1-d array with real numbers'''if a is None or b is None:return Noneif len(a) > len(b):# Ensure the length of a is no longer than that of b.return correlate_func(b, a, mode)# Convert to np.array typea, b = list(map(np.array, [a, b]))if conv: a = a[::-1] # if convolution is true, reverse the shorter res = []min_len, max_len = len(a), len(b)if mode == 'valid':output_length = max_len - min_len + 1tmp = belif mode == 'same':output_length = max_lentmp = np.hstack((np.zeros(min_len-1), b))elif mode == 'full':output_length = max_len + min_len - 1tmp = np.hstack((np.zeros(min_len-1), b, np.zeros(min_len-1)))else:raise Exception("No such mode {}!".format(mode))# For each point, get the total sum of element-wise multiplicationfor i in range(output_length):val = np.sum(a * tmp[i:min_len+i])res.append(val)return np.array(res, dtype=a.dtype)def test():a = [1, 2, 3]b = [1, 2]names = ['numpy.correlate', 'correlate_func', 'numpy.convolve', 'correlate_func(convolution)']funcs = [np.correlate, correlate_func, np.convolve, lambda *args: correlate_func(*args, conv=True)]for i, (name, func) in enumerate(zip(names, funcs)[:4]):print ('-----' * 30 if i & 0x01 == 0 else '')print ("{} output result: ".format(name))print (' valid mode: ', func(a, b, 'valid'))print (' same mode: ', func(a, b, 'same'))print (' full mode: ', func(a, b, 'full'))if __name__ == '__main__':test()

除此之外,在 matplotlib.pyplot 模塊中,實現了用于可視化的自相關函數 matplotlib.pyplot.acorr 和互相關函數 matplotlib.pyplot.xcorr, 官方網址提供的一個示例代碼如下:

import matplotlib.pyplot as plt import numpy as npnp.random.seed(0)x, y = np.random.randn(2, 100) fig = plt.figure() ax1 = fig.add_subplot(211) ax1.xcorr(x, y, usevlines=True, maxlags=50, normed=True, lw=2) ax1.grid(True) ax1.axhline(0, color='black', lw=2)ax2 = fig.add_subplot(212, sharex=ax1) ax2.acorr(x, usevlines=True, normed=True, maxlags=50, lw=2) ax2.grid(True) ax2.axhline(0, color='black', lw=2)plt.show()

總結

以上是生活随笔為你收集整理的相关与卷积(数字信号处理)的数学原理及 Python 实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。