我正在尝试编写一个用于教育目的的音频指纹库。它基于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个样本。我不明白这些以及为什么要这样做,如果有人可以帮助我理解(如果可能的话有代码)那将是很棒的
答案 0 :(得分:2)
读取两个字节后,需要将其转换为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
例如:
data = numpy.fromfile("test.pcm", dtype=np.int16)
要设计低通滤波器,可以在scipy.signal中使用滤波器设计功能:
http://docs.scipy.org/doc/scipy-0.10.1/reference/signal.html#filter-design
要进行卷积,您可以在scipy.signal中使用convoliving函数:
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
答案 1 :(得分:1)
听起来你正在使用的算法是进行过滤和抽取操作,以将数据的采样率降低8倍。这样可以减少采样到其他下游功能的样本数量。计算量很大,但不需要输入数据的全部带宽。您参考的卷积函数是使用对应于所需滤波器形状的脉冲滤波器响应对输入数据执行低通滤波。这些是标准的信号处理操作,您应该能够在任何有关数字信号处理的文本中阅读。