数字信号处理-8-自相关
创始人
2024-02-10 06:46:14

1 皮尔森相关系数

假设 x 和 y 均为 N 个样本的数组,皮尔森公式如下:
在这里插入图片描述
皮尔森相关系数总是在 -1 到 +1 之间(包含这两个字)。ρ 的绝对值意味着相关性的强度。ρ 接近 +1 表示强正相关;ρ 接近 -1 表示强负相关,即随着一个值的增大另一个值减小。

如计算两个相位差为 1 的 sin 函数的相关性,从图形中可以看出两者具有相关性,一个升高,另一个也升高:
在这里插入图片描述
皮尔森相关系数矩阵如下,两者相关性为 0.52
在这里插入图片描述
皮尔森相关性计算代码:

# jupyter notebook 中运行
# 导入需要的包
import numpy as np
from matplotlib import pyplot as plt
import math# 常数值 2π
# jupyter notebook 中运行
# 导入需要的包
import numpy as np
from matplotlib import pyplot as plt
import math# 常数值 2π
PI2 = math.pi * 2
#采样率
framerate = 11025
# 采样时长:秒
duration = 0.01def make_ys(amp=1, f=440, offset=0):"""amp:振幅f:频率offset:相位偏移"""# 样本数n = round(duration * framerate)# 采样时间点ts = np.arange(n) / framerateys = amp * np.sin(PI2*f*ts + offset)return yswave1 = make_ys(offset=0)
wave2 = make_ys(offset=1)
# ddof=0 表示corrcoef 应该除以 N,而不是默认的 N-1
corr_matrix = np.corrcoef(ys1, ys2, ddof=0)
corr_matrix

2 序列相关

信号代表的是随时间变化的数值的度量。比如声音信号代表的是对电压的度量,对应于空气压力的变化,也即我们所感知到的声音。

这样的信号前后序列之间是相关的,为计算序列相关性,我们可以平移信号,然后计算平移之后的信号与原始信号之间的相关性。

# 上一节函数,产生序列
wave1 = make_ys(offset=0)
# 计算自相关
def serial_corr(wave, lag=1):# 序列长度n = len(wave)y1 = wave[lag:]y2 = wave[:n-lag]# 相关系数值corr = np.corrcoef(y1, y2, ddof=0)[0,1]return corr
serial_corr(wave1)

结果为 0.969655978695559

3 自相关

上一节只计算了 lag=1 的相关性,实际上可以设 lag 为不同值,从而得到一个不同 lag 对应的相关性值序列。

def autocorr(wave):# 最大 lag 为波形长度的一半,因为超过一半的话前后序列就不相交了lags = range(len(wave)//2)corrs = [serial_corr(wave, lag) for lag in lags]return lags, corrs
lags, corrs = autocorr(wave1)
plt.plot(lags, corrs)

lags 是一串从 0 到半个波形长的整数序列,corrs 是对应各个 lag 的序列相关性值的数组。
在这里插入图片描述

因为 sin 函数是周期函数,所以间隔一定 lag 之后,它的波形与原始波形又变为相同,相关性为 1。

据此在一段任意的波形中,通过计算序列自相关性找到最大的自相关位置,该位置我们就可以认为是此波形的周期

3.1 通过自相关计算频率

如上图所示,自相关最大的第一个 lag 位置为 0(排除),随后 lag 滞后 25 相关性变最大,因此该点即为周期点。滞后 25 个样本之后波形变得重复,采样率为 11025,25个样本对应时间为 25/11025 秒,因此周期为 25/11025 秒。频率为周期的倒数,所以频率为 441Hz=11025/25。非常接近与我们设定的 440Hz。

3.2 Numpy 计算自相关

NumPy 提供了一个函数 correlate 来计算两个函数之间的相关性或者一个函数的自相关。

# mode='same' 对应的时滞范围为 -N/2 到 N/2,N为波形数组长度
corrs2 = np.correlate(wave1,wave1,mode='same')
N = len(corrs2)
x = range(-N//2, N//2, 1)
plt.plot(x, corrs2)

在这里插入图片描述

结果是对称的,这是因为针对同一个信号,一个信号的负时滞和对另一个结果的正时滞是一样的,所以取一半即可

# 时滞取一半,后一半
N = len(corrs2)
half = corrs2[N//2:]
# np.correlate 计算相关时,并没有除序列长度,可以通过除序列长度纠正
lengths = range(N, N//2, -1)
half /= lengths
# 结果归一化,这样 lag=0 时的相关性为 1
half /= half[0]
plt.plot(half)

与之前定义的函数结果相同 autocorr(wave)
在这里插入图片描述

参考

漫画傅里叶解析
Python数字信号处理应用

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...