python - 对音频信号进行卷积

标签 python audio-fingerprinting audio

我正在尝试编写一个用于教育目的的音频指纹库。它基于Computer Vision for Music Identification 。我有几个与本文内容相关的问题。

  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 个样本进行一次采样。我不明白这些以及为什么必须这样做,如果有人能帮助我理解(如果可能的话用代码)那就太棒了

最佳答案

读取两个字节后,需要将其转换为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/

相关文章:

python - 如何让 python 加载一个大(2 小时)wav 文件并将其内容转换为时频数组?

python - Hadoop:HiveServer2 的 Python 客户端驱动程序无法安装

python - Pandas 使用滚动总和和递减窗口创建新列

java - 提取歌曲的标签

audio - 从 Arduino 中的 FFT 检测特定模式

python-3.x - TypeError:float()参数必须是字符串或数字,而不是 'PolyCollection'

python - 在 Pyside2 中显示 SVG 作为主窗口的背景

python - x = os.system(..) 的返回值

ios - Echoprint iOS 缺少框架

iphone - 如何从NSArray获取声音文件名并播放?