如何分析波形文件的频率

时间:2012-11-14 10:38:13

标签: python wave

如何以简单的方式分析波形文件的频率?没有额外的模块。

4 个答案:

答案 0 :(得分: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 :(得分:1)

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

我会研究傅立叶分析。 Fourier transformation会将您的输入从时域转换为频域。让我再解释一下:

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

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

您应该研究离散傅里叶分析和快速傅里叶变换(FFT)的实现。

这个问题涉及更多的FFT分析: Scipy/Numpy FFT Frequency Analysis

修改

我在网上无耻地窃取了一些图片:

FFT公式:

enter image description here

时间与频率域:

enter image description here

答案 2 :(得分:1)

如果您的波形文件只包含一个音符,则只需检测波形的周期性即可获得基频(而不是谐波)。通过寻找0交叉来做到这一点。

答案 3 :(得分: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