数学原理

  在数字信号处理中,相关(correlation)可以分为互相关(cross correlation)和自相关(auto-correlation). 互相关是两个数字序列之间的运算;自相关是单个数字序列本身的运算,可以看成是两个相同数字序列的互相关运算.互相关用来度量一个数字序列移位后,与另一个数字序列的相似程度.其数学公式如下:

  其中,和 g 为数字序列,n 为移位的位数,f表示 f 序列值的复数共轭,即复数的实部不变,虚部取反.

  而卷积(convolution)与互相关运算相似,定义为将其中一个序列反转并移位后,两个序列的乘积的积分(求和),其数学公式如下:

  其中,和 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 -*-
"""
# Author: klchang
# Description: correlation or convolution of one-dimensional array with real numbers.
# Date: 2018.11
"""
from __future__ import print_function
import numpy as np def 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 None
if 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 type
a, 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 + 1
tmp = b
elif mode == 'same':
output_length = max_len
tmp = np.hstack((np.zeros(min_len-1), b))
elif mode == 'full':
output_length = max_len + min_len - 1
tmp = 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 multiplication
for 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 np np.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()

参考资料

[1] Cross-correlation - Wikipedia. https://en.wikipedia.org/wiki/Cross-correlation

[2] Convolution - Wikipedia. https://en.wikipedia.org/wiki/Convolution

[3] Python: Interpretation on XCORR. https://stackoverflow.com/questions/24396589/python-interpretation-on-xcorr

[4] numpy.correlate - Numpy Reference. https://docs.scipy.org/doc/numpy/reference/generated/numpy.correlate.html

[5] numpy.convolve - Numpy Reference. https://docs.scipy.org/doc/numpy/reference/generated/numpy.convolve.html#numpy.convolve

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

  1. FS,FT,DFS,DTFT,DFT,FFT的联系和区别 数字信号处理

    DCT变换的原理及算法 文库介绍 对于初学数字信号处理(DSP)的人来说,这几种变换是最为头疼的,它们是数字信号处理的理论基础,贯穿整个信号的处理. 学习过<高等数学>和<信号与系统 ...

  2. 《数字信号处理》课程实验2 – FIR数字滤波器设计

    一.FIR数字滤波器设计原理  本实验采用窗函数法设计FIR数字低通滤波器.我们希望设计的滤波器系统函数如下: \(H_{d}\left( e^{jw} \right) = \left\{ \begi ...

  3. 数字信号处理--FFT与蝶形算法

    在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征.尽管传统的DFT算法能够获取信号频域特征,但是算法计算量大,耗时长,不利于计算机实时对信号进行处理.因此至DFT被发现以来, ...

  4. FPGA与数字信号处理

    过去十几年,通信与多媒体技术的快速发展极大地扩展了数字信号处理(DSP)的应用范围.眼下正在发生的是,以更高的速度和更低的成本实现越来越复杂的算法,这是针对高级信息服更高带宽以及增强的多媒体处理能力等 ...

  5. 数字信号处理专题(3)——FFT运算初探

    一.前言 FFT运算是目前最常用的信号频谱分析算法.在本科学习数字信号处理这门课时一直在想:学这些东西有啥用?公式推来推去的,有实用价值么?到了研究生后期才知道,广义上的数字信号处理无处不在:手机等各 ...

  6. GAN背后的数学原理

      模拟上帝之手的对抗博弈——GAN背后的数学原理 简介 深度学习的潜在优势就在于可以利用大规模具有层级结构的模型来表示相关数据所服从的概率密度.从深度学习的浪潮掀起至今,深度学习的最大成功在于判别式 ...

  7. 三维投影总结:数学原理、投影几何、OpenGL教程、我的方法

    如果要得到pose视图,除非有精密的测量方法,否则进行大量的样本采集时很耗时耗力的.可以采取一些取巧的方法,正如A Survey on Partial of 3d shapes,描述的,可以利用已得到 ...

  8. 转载--关于FPGA设计数字信号处理电路的心得

    FPGA使用的越来越广泛,除了可用于设计控制电路以为,数字信号处理电路更是FPGA的强项和难点.个人可以说才刚刚入门FPGA设计,也做过一些数字信号处理方面的电路设计,记录下个人心得体会. (一)善用 ...

  9. 《数字信号处理》课程实验1 – FFT的实现

    一.按时间抽选的基-2 FFT实现原理 观察DIT(基2)FFT的流图(N点,N为2的幂次),可以总结出如下规律: (1)共有\(L=\log_2⁡N\)级蝶形运算: (2)输入倒位序,输出自然顺序: ...

随机推荐

  1. LINUX下 一句话添加用户并设置ROOT权限

    来源:linux一条命令添加用户并设置密码 linux一条命令添加一个root级别账户并设置密码 LINUX提权,除非是拿的EXP反弹CMD,才会有回显,这样添加管理员方便了. 通常是在SHELL,菜 ...

  2. ZigBee 学习资源

    1.雪帕的主页 http://home.cnblogs.com/u/yqh2007/ 2.刘志鹏的主页 http://www.cnblogs.com/hustlzp/archive/2011/02/1 ...

  3. B+树 -- Java实现

    一.B+树定义 B+树定义:关键字个数比孩子结点个数小1的树. 除此之外B+树还有以下的要求: B+树包含2种类型的结点:内部结点(也称索引结点)和叶子结点.根结点本身即可以是内部结点,也可以是叶子结 ...

  4. 6-nginx-会话一致性解决(sesion一致)

    由于tomcat使用的为集群, 通过nginx访问时轮询不同的tomcat, 使得session无法统一, 所以将session单独抽取出来做共享session. 此tomcat版本为 7.0.61. ...

  5. Java并发编程笔记之Unsafe类和LockSupport类源码分析

    一.Unsafe类的源码分析 JDK的rt.jar包中的Unsafe类提供了硬件级别的原子操作,Unsafe里面的方法都是native方法,通过使用JNI的方式来访问本地C++实现库. rt.jar ...

  6. java Fork/Join框架

    应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在很多的应用程序在运行在多核心 ...

  7. 产环境部署node记录(三): centOS 7 mySQL和mongoDB的安装

    [mySQL的安装]: CentOS7默认数据库是mariadb,现在来安装mySQL 1.下载安装包 这里下载了四个安装包,后面会用到 yum -y install perl perl-devel ...

  8. [转] Hadoop 2.0 详细安装过程

    1. 准备 创建用户 useradd hadoop passwd hadoop 创建相关的目录 定义代码及工具存放的路径 mkdir -p /home/hadoop/source mkdir -p / ...

  9. unity 中 Tilemap的使用 笔记

    Coordinate 坐标 创建顺序: Sprite Palette(调色板) Tile Brush Tilemap(瓦片地图) 1.创建画板:保存路径:Palettes/Basic/BasicGro ...

  10. 撩课-Web大前端每天5道面试题-Day26

    1.vuejs与angularjs以及react的区别? .与AngularJS的区别 相同点: 都支持指令:内置指令和自定义指令. 都支持过滤器:内置过滤器和自定义过滤器. 都支持双向数据绑定. 都 ...