我正试图写一个音频指纹库用于教育目的。它基于Computer Vision for Music Identification . 我有几个与论文内容有关的问题。在
我知道两个字节代表一个样本,所以我写了这个类从一个pcm文件中提取样本。我想知道这是否正确(如果太明显,很抱歉:)。在
class FingerPrint:
def __init__(self, pcmFile):
self.pcmFile = pcmFile
self.samples = []
self.init()
def init(self):
# Current samples
currentSamples = []
# Read pcm file
with open(self.pcmFile, 'rb') as f:
byte = f.read(2)
while byte != '':
self.samples.append(byte)
byte = f.read(2)
fp = FingerPrint('output.pcm')
如果上面的代码没问题,那么根据这本书,下一步要做的就是用低通滤波器卷积信号,每8个采样一次。我不明白为什么要这么做,如果有人能帮我理解(如果可能的话用代码)
在读取两个字节后,需要将其转换为int。可以使用struct module。在
但我觉得你应该用NumPy,SciPy:
要读取wave文件,可以调用
scipy.io.wavfile.read()
http://docs.scipy.org/doc/scipy-0.10.0/reference/tutorial/io.html#module-scipy.io.wavfile
如果您的档案是原始PCM资料,您可以呼叫
numpy.fromfile()
http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html
例如:
要设计低通滤波器,可以在中使用滤波器设计函数化学信号公司名称:
http://docs.scipy.org/doc/scipy-0.10.1/reference/signal.html#filter-design
要进行卷积,可以在中使用卷积函数化学信号公司名称:
http://docs.scipy.org/doc/scipy-0.10.1/reference/signal.html#convolution
numpy中还有一个卷积函数:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.convolve.html
听起来你使用的算法是做一个过滤和抽取操作,将数据的采样率降低8倍。这会导致输入到其他下游函数的样本更少,这些下游函数的计算成本可能很高,但不需要输入数据的全部带宽。您引用的卷积函数使用与所需滤波器形状相对应的脉冲滤波器响应对输入数据执行低通滤波。这些是标准的信号处理操作,你应该能够在任何有关数字信号处理的文本中阅读。在
相关问题 更多 >
编程相关推荐