2012-11-14 29 views

回答

5

这是什么意思“分析”?这可能意味着很多不同的东西,但是我知道最简单的方法一个大约是使用convolution,你可以很容易地实现对discrete functions(你必须在数组中的点或是试图分立步骤):

Equation of discrete convolution

这可以很容易地做到:

for i in main_array: 
    from = i - len(convolution_kernel)/2 
    // Todo: check boundaries 
    result[i] = 0 

    for j in convolution_kernel: 
     result[i] += convolution_kernel[j] * main_array(from+j) 

或者你可以使用循环卷积(想法来自eryksuns评论拍摄):

result = [sum(f[m]*g[n-m] for m in xrange(len(f))) for n in xrange(len(g))] 

这将使您能够测试某个信号是否出现在另一个信号中(并且您将尝试频率10,20,50,...并获得最佳结果)。

你也可以google determine wave frequency或研究Fourier transformation有点(这是很多信号处理算法的基础)。

+1

或者你可以做一个循环卷积,假定零填充,如DFT的作用:'结果=Σ(F [M] * G [(纳米)%LEN(克)]为米xrange(len(f)))for n in xrange(len(g))]''。 – eryksun

+0

微小更新:由于Python包装负指数,模操作是多余的。你可以使用'g [n-m]'。 – eryksun

1

免责声明:信号处理是不是我的专业,这个答案可能有点粗糙和简陋;随时纠正/我:)

我会去了解一下傅立叶分析。 A Fourier transformation将您的输入从时域转换到频域。让我来解释一下,多一点:

抽样时的声音,例如,你确定你的采样频率和您的位深度。我相信CD的采样率为44.1 kHz,分辨率为16位。样品。这意味着音乐每秒采样44,100次并转换为16位值。音乐被表示为长度为44,100的矢量(或数组)。它是时间的函数,因此这是时间域。

在另一方面,进行数据的傅里叶变换,你就会有表现为频率的函数,而不是数据。你仍然会有一个向量44,100个元素长,但每个元素将代表幅度 - 你在每个频率上采样了多少“信号”!换句话说,您的信号在整个采样周期内包含的每个给定频率有多少信号。

你应该看看离散傅立叶分析和快速傅立叶变换(FFT)的实现。

这个问题倒是FFT分析多一点: Scipy/Numpy FFT Frequency Analysis

编辑:

我无耻地偷走一些图形在线:

FFT计算公式:

enter image description here

时间与频率范围:

enter image description here

1

如果你的波形文件只包含一个音符,你可以简单地通过检测波的周期性得到的基频(而不是谐波)。通过查找0交叉口来做到这一点。

1

如果您不希望实现整体FFT算法,不希望任何额外的模块,那么我会的电子书籍,其Goertzel Algorithm是有效的傅里叶变换为特定的工频突变,让您在该频率的电​​源样品:

define goertzel(sample, target_frequency, sample_rate): 
    s_prev = 0 
    s_prev2 = 0 
    normalized_frequency = target_frequency/sample_rate 
    coeff = 2 * cos(2 * PI * normalized_frequency) 
    for element in sample: 
     s = element + coeff * s_prev - s_prev2 
     s_prev2 = s_prev 
     s_prev = s 
    end 
    power = s_prev2 * s_prev2 + s_prev * s_prev - coeff * s_prev * s_prev2 
    return power