2011-02-11 107 views
2

我发现了这个自相关代码,但我根本不知道什么是“float_vec_t”,例如。这是一堂课还是什么? (我想将其翻译为动作脚本或JavaScript,我知道好)解释C++自相关代码

class LPCAnalysis{ 
    public: 
     float_vec_t LPCAnalysis::autoCorrelation(const float_vec_t &x); 

}; 


/* Calculate the (UN-normalized) autocorrelation for a frame of a 
signal */ 

float_vec_t LPCAnalysis::autoCorrelation(const float_vec_t &x) 
{ 
    short order=x.size(); 

    float_vec_t R(order); 
    float sum; 
    int i,j; 

    for (i=0;i<order;i++) { 
     sum=0; 
     for (j=0;j<order-i;j++) { 
      sum+=x[j]*x[j+i]; 
     } 
     R[i]=sum; 
    } 
    return R; 
} 
下面

是我迄今取得的进展:

function LPCAnalysis (x:Array) { 

    var order:int = x.length 

    var R:Array= [] 
    var sum:Number 
    var i:int 
    var j:int 

    for (i=0;i<order;i++) { 
     sum = 0 
     for (j=0;j<order-i;j++) { 
      sum+=x[j]*x[j+i] 
     } 
     R[i] = sum 
    } 
    return R 

} 

另外,我怎么能提取的最终频率阵列R? (如果R是一个数组)。我应该给这个函数的参数是什么?一个FFT结果,一个麦克风信号?

回答

2

您将需要找到float_vec_t的声明以确切知道什么是(虽然我想它是一个std::vector<float>)。尝试对源代码进行全局搜索以找到声明的位置。

至于“提取频率”;自相关不直接给你频率。您需要在R上执行FFT(这会给出功率谱密度),然后搜索峰值。在实践中,您可能还需要一些其他处理,如在应用窗口函数之前对数据进行处理。

+0

真的吗? FFT非常不准确!我试图用自相关从他们身边逃走,现在你告诉我,我将再次需要它们= /我在这里问了我如何为吉他调谐器提取频率,并且这些人告诉我使用自相关而不是FFT。如果我不得不使用FFT,他们为什么告诉我那个? – 2011-02-11 20:03:12

+0

自相关在数学上等同于功率谱的逆FFT,因此两者之间的“精度”没有差异。 – 2011-02-11 22:19:57

2

根据其用法,它是一个类/对象。它看起来像一个浮标的标准Vector类。

没错上http://newsgroups.derkeiler.com/Archive/Comp/comp.dsp/2006-06/msg01218.html

我发现这一点:

typedef std::vector<float> float_vec_t; 

这意味着它几乎可以肯定是一个std ::载体,在javascript只是转移到一个标准的对象,因为JavaScript没有需要任何特殊的矢量处理。