数学原理
  
在数字信号处理中,相关(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 实现相关推荐

  1. 信号处理之频谱原理与python实现

    目录 频谱分析 FFT频谱分析原理 下面就用python案例进行说明 案例1 案例2 短时傅里叶变换STFT 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区.QQ交流群:941473018 ...

  2. 深入卷积神经网络背后的数学原理 | 技术头条

    参加「CTA 核心技术及应用峰会」,请扫码报名 ↑↑↑ 作者 | Piotr Skalski 译者 | Monanfei 编辑 | 十月Rachel.Jane 出品 | AI科技大本营(id:rgzn ...

  3. 深入卷积神经网络背后的数学原理

    来源:AI科技大本营 摘要:在计算机神经视觉技术的发展过程中,卷积神经网络成为了其中的重要组成部分,本文对卷积神经网络的数学原理进行了介绍. 文章包括四个主要内容:卷积.卷积层.池化层以及卷积神经网络 ...

  4. 聚星C#数字信号处理和数学工具包

    聚星C#/SeeSharp/锐视 工具包 叫啥都可以, 就是在C#下面的信号处理工具包. 分2个部分. 聚星淘宝旗舰店 "聚星仪器" 有销售. 数字信号处理工具包 SeeSharp ...

  5. matlab fftshift_数字信号处理没有Matlab?用Python一样很爽

    通常,在数字信号处理时,我们避不开matlab这个工具,因其它的强大的功能受到广大工程师的好评,也一直都是业界的不二之选.但是,matlab毕竟是商业软件,公司里如果使用的话,就需要支付高昂的费用.即 ...

  6. matlab相关的数字信号,数字信号处理及其MATLAB实现.ppt

    高等教育大学精品教程配套资料------PPT * * 2.窗函数法设计FIRDF的MATLAB设计函数 (1) 教材中列出了前面介绍的六种窗函数的产生函数 . (2)窗函数法设计FIRDF的设计函数 ...

  7. fft 相位谱_信号处理之功率谱原理与python实现

    点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 功率谱图又叫功率谱密度图 功率谱是功率谱密度函数的简称,它定义为单位频带内的信号功率.它表示了信号功率随着频率的变化情况 ...

  8. Logistic Regression 逻辑回归数学原理、python代码实现、实际应用

    说在前面 第一次写博客,主要目的是再梳理一下学到东西的逻辑,如果可以帮助到其他在学习的人就更好啦.本篇主要参考的:<机器学习>西瓜书.博主文章:文章链接.以及知乎.百度等大神们的解惑文章 ...

  9. 高斯消元法解线性方程组数学原理及Python手工实现

    一.基本思想 先逐次消去未知数,将方程化为同解的上三角形方程组,此过程称为消元.然后按方程相反顺序求解上三角形方程组,得到原方程组的解,此过程称为回代.这种方法称为高斯消元法. 二.例子  消元过程如 ...

最新文章

  1. IPv6中的特殊地址
  2. 为什么 HashMap 的加载因子是0.75?
  3. android动态访问权限,android – Firebase规则:动态授予特定用户访问权限
  4. ajax后台重定向会返回什么_第三十五天JavaScript中的ajax
  5. cordova指定版本_Cordova 基本命令 以及如何添加,删除插件
  6. Hive的基本操作-基本查询语法
  7. .NET Core使用gRPC打造服务间通信基础设施
  8. 【BIM入门实战】Revit 2018墙体绘制—别墅地下室
  9. Django 后台带有字典的列表数据与页面js交互
  10. java 浅克隆_(Java)浅克隆与深克隆的区别
  11. Javascript特效:轮播图
  12. 语法分析(3)...
  13. 《Android游戏编程之从零开始》
  14. Mirillis Action! v4.17.0 高清游戏视频录制软件
  15. 使用postman发送post请求下载文件
  16. 《我是一只IT小小鸟》(胡江堂主编)读后感
  17. Googler高级工程师打造“厂外生存指南”,程序员感叹,圆我大厂梦
  18. java毕业设计培训学校教学管理平台源码+lw文档+mybatis+系统+mysql数据库+调试
  19. 使用Viewpager Indicator实现图片无限轮播
  20. Windows画图Android版,妙笔画世界-三星手机画图应用

热门文章

  1. 孙钟秀--《操作系统教程》注释(陈怀临)-- 读书笔记
  2. Fedora19 搭建LAMP环境
  3. [组图]海报:计算机的爱
  4. 【ABAP实例】SAP调用RESTful API测试用例
  5. PHP 5.6.30连接SAP GUI 730 配置(SAPRFC)
  6. 12、Power Query-透视列实例应用(多单元格记录合并及汇总)
  7. 2、Power Query-动态汇总单元格区域数据
  8. 没有维护在库存管理中用于工厂1112的参数
  9. 最美四门轿跑车斯柯达Coupe面世,CC也害怕。
  10. sap开发-采购订单更改历史table