1

教育目的で音声指紋ライブラリを作成しようとしています。これは、音楽識別のためのコンピューター ビジョンに基づいてい ます。論文の内容に関していくつか質問があります。

  1. 2 バイトがサンプルを表すことはわかっているので、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

2 バイトを読み取った後、int に変換する必要があります。struct モジュールを使用できます。

しかし、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

于 2012-08-20T01:32:35.753 に答える
1

使用しているアルゴリズムがフィルターとデシメーション操作を実行して、データのサンプルレートを8分の1に減らしているようです。これにより、他のダウンストリーム関数に送られるサンプルが少なくなり、計算コストが高くなる可能性があります。入力データの全帯域幅は必要ありません。参照する畳み込み関数は、目的のフィルター形状に対応するインパルスフィルター応答を使用して入力データのローパスフィルター処理を実行します。これらは標準的な信号処理操作であり、デジタル信号処理に関する任意のテキストで読み取ることができるはずです。

于 2012-08-20T02:41:39.433 に答える