如何以简单的方式分析波形文件的频率?没有额外的模块。
答案 0 :(得分:5)
“分析”是什么意思?它可能意味着很多不同的东西,但我知道的最简单的方法之一是使用convolution,你可以轻松地为discrete functions实现(你将在数组中有点或者尝试离散步骤) :
可以通过以下方式轻松完成:
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公式:
时间与频率域:
答案 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