摘要:Python中,更确切地说是numpy、scipy、statsmodels这些库中都有计算相关的方法。但numpy和scipy中的correlate方法的定义和MATLAB中的不同,导致计算结果不太一样。看上去MATLAB和statsmodels里都是用的标准的统计中的定义——皮尔森相关系数,而numpy和scipy中使用的是非正式的信号处理中的定义,需要均值为0,且计算结果需要归一化,才会得到差不多的答案。

系列目录

  1. Python信号处理:快速傅里叶变换(FFT),短时傅里叶变换(STFT),窗函数,以及滤波
  2. Python信号处理:自相关函数(对标MATLAB中的autocorr)
  3. Python信号处理:波束形成及目标方位估计,CBF、MVDR
  4. Python信号处理:cvxpy工具包求解稀疏约束优化问题

目录

  1. 用于对比的三个函数及结论
  2. 非零均值序列的自相关函数
  3. 零均值序列的自相关函数
  4. 消除时滞的影响

1. 用于对比的三个函数及结论

  • numpy.correlate()
  • statsmodels.tsa.api.stattools.acf()
  • MATLAB中的autocorr()

结论:

  1. autocorr(series, 'NumLags', N-1)statsmodels.tsa.api.stattools.acf(series, nlags=N-1)是相同的。[不考虑其他的参数]。
  2. 输入序列为0均值时,使用numpy.correlate(series, series, mode='full'),并对计算结果取后一半,得到的结果和前面两个方法基本相同。
  3. 输入序列不是0均值时,用numpy.correlate可能是不对的,因为信号处理下的非正式定义需要零均值条件,算出来的结果也很奇怪。

2. 非零均值序列的自相关函数

选择输入序列为y=[2, 3, 9, 6, 9],N为5,分别使用上述三种方法得到自相关函数,得到的结果如下:
1.

acf = smt.stattools.acf(y, nlags=N-1)

array([ 1. , 0.06915888, -0.05794393, -0.2271028 , -0.28411215])

acf = np.correlate(y, y, mode='full')
acf = acf[N-1:]
acf = acf / acf[0]

array([1. , 0.66824645, 0.55450237, 0.18483412, 0.08530806])

acf = autocorr(y,'NumLags', N-1);

acf = 1.0000, 0.0692, -0.0579, -0.2271, -0.2841

可以看出,smt.stattools.acf(y, nlags=N-1)autocorr(y,'NumLags', N-1)的结果是一样的,但np.correlate(y, y, mode='full')的结果差距较大,且所有的相关系数都是正的。

3. 零均值序列的自相关函数

仍使用输入序列y=[2, 3, 9, 6, 9],N为5,但对其进行0均值化处理,得到的结果如下:

  1. 和上一节的1.是一样的
y = y - y.mean()
acf = smt.stattools.acf(y, nlags=N-1)

array([ 1. , 0.06915888, -0.05794393, -0.2271028 , -0.28411215])

  1. 和上一节的2.不同,但变得和1.、3.相同
y = y - y.mean()
acf = np.correlate(y, y, mode='full')
acf = acf[N-1:]
acf = acf / acf[0]

array([ 1. , 0.06915888, -0.05794393, -0.2271028 , -0.28411215])

  1. 和之前的3.是一样的
y = y - mean(y);
acf = autocorr(y,'NumLags', N-1);

acf = 1.0000, 0.0692, -0.0579, -0.2271, -0.2841

可以看出,对于零均值化的序列,三种方法的结果都是一样的。

4. 消除时滞的影响

当序列很长时,如下图,三种方法计算的自相关函数都会随着时间慢慢减小。在smt.stattools.acf中可以通过unbiased参数进行修正。对于np.correlate,可以用序列长度进行归一化,同样能起到消除时滞的效果。根据smt.stattools.acf文档的描述,两种做法好像是一样的。当然MATLAB中肯定也是可以这么操作的。

对无噪声的sin序列,分别计算自相关函数,看看时滞的影响,以及消除时滞后的效果。

# 左上,np.correlate,未消除时滞
acf1 = np.correlate(x, x, mode='full')
acf1 = acf1[N-1:]
acf1 = acf1 / acf1[0]
ax[0, 0].plot(t, acf1)# 右上,np.correlate,消除时滞
acf1 = np.correlate(x, x, mode='full')
acf1 = acf1[N-1:]
acf1 = acf1 / np.arange(N, 0, -1)
acf1 = acf1 / acf1[0]
ax[0, 1].plot(t, acf1)# 左下,smt.stattools.acf,未消除时滞
acf2 = smt.stattools.acf(x, nlags=N-1, unbiased=False)
ax[1, 0].plot(t, acf2)# 右下,smt.stattools.acf,消除时滞
acf2 = smt.stattools.acf(x, nlags=N-1, unbiased=True)
ax[1, 1].plot(t, acf2)

Python信号处理:自相关函数(对标MATLAB中的autocorr)相关推荐

  1. C++内点法求解大规模线性规划问题——对标MATLAB中linprog函数

    C++内点法求解大规模线性规划问题--对标MATLAB中linprog函数 文章目录 C++内点法求解大规模线性规划问题--对标MATLAB中linprog函数 1. 项目场景 2. 约束的规范化 3 ...

  2. matlab 矩阵角标,MATLAB中的矩阵索引

    MATLAB中的矩阵索引 作者:SteveEddins and Loren Shure   译:王茂春 利用矩阵的索引取出原矩阵的子集元素是一种有效的方式.MATLAB的多种索引类型不仅强大.灵活,而 ...

  3. m 文件 dll matlab 中调用_如何在matlab中调用python程序

    现在python很火,很多代码都是python写的,如果你和我一样,习惯了使用matlab,还想在matlab中调用Python的代码,应该怎么办呢?其中一条思路:首先在matlab中调用系统脚本命令 ...

  4. php调用python绘图程序_如何在matlab中调用python程序

    现在python很火,很多代码都是python写的,如果你和我一样,习惯了使用matlab,还想在matlab中调用Python的代码,应该怎么办呢?其中一条思路:首先在matlab中调用系统脚本命令 ...

  5. 在MATLAB中调用 Python

    在MATLAB中调用 Python 您可以通过将 py. 前缀添加到 Python 名称,直接从 MATLAB 访问 Python 库.要调用 Python 标准库中的内容,请在 Python 函数或 ...

  6. matlab randi 函数,MATLAB中的randi函数

    randi Pseudorandom integers from a uniform discrete distribution.来自一个均匀离散分布的伪随机整数 R = randi(IMAX,N) ...

  7. MATLAB中常见数字信号处理相关函数汇总

    MATLAB中常见数字信号处理相关函数汇总 现将MATLAB信号处理工具箱函数进行分组,便于记忆查询和长期回顾. Waveform Generation(波形产生) chairp: 产生扫频余弦函数: ...

  8. 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结

    Python 之 Python与MATLAB 矩阵操作小结 一.线形代数理论基础 线形代数(linear algebra)是数学的一个分支,研究矩阵理论.向量空间.线性变换和有限维线形方程组等内容. ...

  9. 全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?

    数百种编程语言,各有优劣,各自也都有自己最为适用的场景.那么就科学计算领域而言,主流的 MATLAB.Julia.Python 会有哪些最为独特的优势呢?又存在哪些让开发者无力的缺陷?在本文中,我们将 ...

最新文章

  1. LeetCode19. Remove Nth Node From End of List 删除链表中的倒数第n个位置的元素
  2. UIUC教授季姮:叫我带头人,而不是女性带头人(附视频)
  3. opencv-contrib配置过程
  4. Linux下rpm包x86、i386、i486、i586、i686和x86_64 后缀含义
  5. 使用 go 实现 Proof of Stake 共识机制
  6. 看看牛人们是怎么评价编程语言的
  7. 新视野教育计算机题库,校园网.新视野教育计算机等级考试《二级公共基础》课后习题答案...
  8. unity3d___UGui中如何创建loading...进度条
  9. SLAM 学习与开发经验分享
  10. 滴水课后作业(1-5)
  11. jmeter 计数器_JMeter函数
  12. yolox-keras的源码,超越YOLOv5,可以用于训练自己的模型
  13. python打开txt文件找不到-Docker Python脚本找不到文件
  14. python糖尿病数据挖掘
  15. 原生JS实现动态表格的生成
  16. python视频补帧_我花了三天写了手机补帧神器
  17. hash+跳表,玩转Redis有序集合
  18. 基于简单MLP模型的加州房价预测
  19. db2怎么恢复误删除的数据_db2数据库被误删后 oracle数据库误删数据恢复
  20. USB电路EMC设计标准电路详解

热门文章

  1. 基于springboot实现电子招投标系统项目源码
  2. 软件程序流程图使用规范
  3. 【AI绘图本地部署,无显卡部署stable-diffusion-webui吗,使用CPU运算】
  4. 人工智能发展史-从图灵测试到大数据
  5. Linux学习--Shell脚本的创建
  6. 代码计算体重是否标准
  7. Sqlserver根据身份证号码查询年龄分布 籍贯分布DATEDIFF Case函数
  8. 使用matplotlib进行简易的数据分析
  9. 组建比较不只有箱线图,还有这些
  10. 使用python解决codewar中问题,个人答题思路及代码总结(2)