1

我正在尝试为教育目的编写一个音频指纹库。它基于 用于音乐识别的计算机视觉 。我有几个与论文内容有关的问题。

  1. 我知道两个字节代表一个样本,所以我编写了这个类来从 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')
    
  2. 如果上面的代码没问题,那么根据书,接下来要做的就是用低通滤波器对信号进行卷积,并每 8 个样本进行一次。我不明白这些以及为什么必须这样做,如果有人可以帮助我理解,那就太棒了(如果可能的话,用代码)

4

2 回答 2

2

读取这两个字节后,需要将其转换为 int。您可以使用结构模块。

但我认为你应该使用 NumPy、SciPy:

要读取波形文件,您可以调用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 中使用卷积函数:

http://docs.scipy.org/doc/scipy-0.10.1/reference/signal.html#convolution

numpy中还有一个convolve函数:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.convolve.html

于 2012-08-20T01:32:35.753 回答
1

听起来您正在使用的算法正在执行过滤和抽取操作,以将数据的采样率降低 8 倍。这导致提供给其他下游函数的样本更少,这可能在计算上很昂贵,但是不需要输入数据的全部带宽。您引用的卷积函数正在使用与所需滤波器形状相对应的脉冲滤波器响应对输入数据执行低通滤波。这些是标准的信号处理操作,您应该能够在任何有关数字信号处理的文本中阅读它们。

于 2012-08-20T02:41:39.433 回答