我正在尝试编写一个用于教育目的的音频指纹库。它基于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。您可以使用结构模块。
但我认为你应该使用 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 中的卷积函数:
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
关于python - 对音频信号进行卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12031224/