【问题标题】:Auto-correlation/correlation in C++C ++中的自相关/相关
【发布时间】:2023-03-11 14:42:01
【问题描述】:

以下函数计算两个向量之间的相关性。

对于小值,它不会给出与 matlab 函数相同的结果:

我真的不知道这个错误是否来自这个函数?默认情况下的最大滞后是 N-1 ?这合理吗?

inline int pow2i(int x) { return ((x < 0) ? 0 : (1 << x)); }`

     vec xcorr(vec x, vec y,bool autoflag)
    {
      int maxlag=0;
      int N = std::max(x.size(), y.size());
      //Compute the FFT size as the "next power of 2" of the input vector's length (max)
      int b = ceil(log2(2.0 * N - 1));
      int fftsize = pow2i(b);
    
      int e = fftsize - 1;
      cx_vec temp2;
    
      if (autoflag == true) {
        //Take FFT of input vector
        cx_vec X = cx_vec(x,zeros(x.size()));
        X= fft(X,fftsize);
        //Compute the abs(X).^2 and take the inverse FFT.
        temp2 = ifft(X%conj(X));
      }
      else{
       //Take FFT of input vectors
      cx_vec X=cx_vec(x,zeros(x.size()));
      cx_vec Y=cx_vec(y,zeros(y.size()));
      X = fft(X,fftsize);
      Y = fft(Y,fftsize);
      //cout<< "Y " << Y << endl;
      //cout<< "X " << X<< endl;
      temp2 =ifft(X%conj(Y));
      //cout<< "temp 2 " << temp2 << endl;
     }
      maxlag=N-1;
      vec out=real(join_cols(temp2(span(e - maxlag + 1, e)),temp2(span(0,maxlag))));
      return out;
    }

【问题讨论】:

  • 什么是vec?可能是一些 typedef?
  • 抛开浮点问题不谈,您确定向上取整 FFT 窗口大小适合此特定任务吗?对于小的输入,为什么不直接计算时域中的相关性并跳过傅里叶变换的开销?
  • vec 是使用犰狳框架的向量定义arma.sourceforge.net/docs.html#Col
  • @nanofarad:谢谢,我会试试的。

标签: c++ armadillo


【解决方案1】:

只需在时域中实现自相关,正如上面提到的 cmets 之一。

犰狳没有实现互相关(和自相关),但实现它们的一种简单方法是使用卷积,犰狳确实有。您只需要反转第二个向量中的其他元素,arma::conv 将基本上计算互相关。

也就是说,您可以轻松计算 arma::vec a 与的自相关

arma::vec result = arma::conv(a, arma::reverse(a));

这给出了与 MATLAB/Octave 中的 xcorr 返回相同的结果(当您仅将一个向量传递给 xcorr 时,它会计算自相关)。 请注意,您可能希望将result 除以N 或除以N-1

【讨论】:

  • 您好,我尝试了您的解决方案。确实给出了与 MATLAB 相同的值,但值不是那么小但是,当我尝试使用以下输入 {1.056e-11, 1.0843e-11,1.113e-11,1.1431e -11,1737e-11}.
  • 而且我无法理解这种差异的原因,从之前的cmets,我尝试学习浮点。但是对于我的情况,我没有得到任何解决该问题的方法。我需要将 MATLAB 代码转换为 C++,并确保它运行良好且没有任何错误。
  • 无论我将 C++ 与犰狳或八度音阶用于任何输入,包括您提到的这个向量,我都会得到相同的响应。数学是正确的,任何差异都必须是由于数值精度。
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
相关资源
最近更新 更多