【问题标题】:autocorrelation function calculated with numpy is not positive definite?用numpy计算的自相关函数不是正定的?
【发布时间】:2022-01-20 21:04:10
【问题描述】:

我正在使用 Numpy 的 FFT 通过首先计算功率谱来计算信号的自相关函数。我相信autocorrelation functions are positive definite。但是,当我test 时,如果我的模拟自相关函数是正定的,它通常会失败。下面是一些示例代码:

import numpy as np

def is_pos_def(x):
    return np.all(np.linalg.eigvals(x) > 0)

n = 5
signal = np.random.random(size=(n,n)) #create a real valued signal
F = np.fft.fftn(signal)               #FFT of real signal is conjugate symmetric
A = np.abs(F)                         #amplitudes/magnitudes
ps = A**2                             #power spectrum is square of magnitudes
acf = np.fft.ifftn(ps)                #autocorrelation function is ifft of the power spectrum
acf = acf.real                        #.real to clean up since the acf is real anyways by definition, and indeed the imaginary terms are zero.

print(is_pos_def(acf))

这会输出False。我错过了什么吗?

【问题讨论】:

  • 我不知道你的问题的答案是什么,但我确实注意到你得到的几个特征值是is_pos_def 是复杂的。这是预期的行为吗?
  • 嗯,我运行它时没有得到复杂的值。然而,运行它几次后,我偶尔会得到复杂的值,我猜这只是依赖于随机种子。
  • “自相关函数是正定的”,但是你链接到一个关于自相关矩阵的问题,这不是一回事。 “正定”是矩阵的属性,而不是函数的属性。请注意,如果输入是 1D 函数或 3D 函数,那么您将无法进行计算。
  • @CrisLuengo 哦,我没有意识到它们是不同的。我想我的意思是矩阵,而不是函数,因为我正在使用 numpy 数组(如果它是一个 numpy 数组而不是一个 numpy 矩阵有关系吗?)。我会更新问题说矩阵。
  • 不,你的数组是一个离散函数,它不是一个自相关矩阵。自相关矩阵来自随机向量,而不是来自信号或函数。 en.wikipedia.org/wiki/… — 我们在这里谈论不同的概念。没有理由期望图像矩阵的特征值是正的,甚至存在……

标签: python numpy signal-processing fft linear-algebra


【解决方案1】:

关于正定函数

在评论几轮之后,我怀疑您想检查自相关是否为positive definite function

import scipy.linalg;
n = 5; # number of independent signals
m = 10; # number of samples each vector
signal = np.random.random(size=(m)) #create a real valued signal
# auto-correlation function
acf = np.fft.ifft(np.abs(np.fft.fft(signal))**2)
# check function spectrum of the matrix a[i,j] = f(x[i]-x[j])
spectrum = np.linalg.eigvals(scipy.linalg.toeplitz(acf))

自相关函数的正定性由

assert np.allclose(spectrum, spectrum.real) # real
assert np.all(spectrum.real > 0) # positive

原来的答案

首先,信号的自相关是ifft(abs(fft(x)**2),而不是ifft(fft(x))。 从卷积定理我们知道给定A=fft(A)B=fft(b)ifft(A*B) = conv(a,b)

此自相关将计算信号与其不同延迟版本的相关性。

另一方面,自相关矩阵计算矩阵中每对列之间的相关性。

n = 5; # number of independent signals
m = 10; # number of samples each vector
signal = np.random.random(size=(m,n)) #create a real valued signal
acf = signal.T.conj() @ signal;

那么acf保证是一个对称的半定正矩阵,即所有的特征向量都是实数且非负的(>=0

【讨论】:

  • 我确实在我的代码中使用了 ifft(abs(fft(x))**2),即功率谱。但是,我的代码结果给出了一个特征值不是正数的 acf,因此我提出了问题。另外,我对你的最后一行感到困惑。 acf 不仅仅是信号的共轭转置(我不确定 @ 信号是什么,这只是一个拼写错误,意味着 # 用于评论的信号?)。
  • 请注意,对于复杂值A**2abs(A)**2 不同
  • 是的,但我在上面的行中做了 A = np.abs(F)
  • 对不起,我在第一次阅读时错过了那个细节,我再也没有阅读过嘿嘿
猜你喜欢
  • 2018-07-28
  • 2011-12-20
  • 2012-10-12
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2018-05-01
  • 2017-03-27
相关资源
最近更新 更多