スペック不明のPCMデータをWAVファイルに変換する

 arecordで記録したraw pcmデータや自作コードで生成したPCM波形を、後になってから再生しようとして記録・生成時のサンプルレートやフォーマットを忘れて困ったという事態に遭遇することが稀にあります。
 フォーマットが判らない以上は、総当たりで変換かかけてみるしかない訳ですが、再生可能なWAVファイルを得ることができるはずです(変換できなければ単なるリニアPCMデータではないということになるでしょう)。
 

 以下の例ではサンプリング周波数、チャネル数、符号有無、ビット深度、エンディアンを片っ端から変えてffmpegを使ってWAVファイルの生成を試行します。
 具体的には、サンプリング周波数が32KHz, 44.1KHz, 48KHzでモノラルまたはステレオでフォーマットがs16le, s24le, s32le, u16le, u24le, u32le, s16be, s24be, s32be, u16be, u24be, u32beの全ての組み合わせを試行します。
 元データがリニアPCMなら、生成されたWAVファイルのどれか1つが正常に再生できるはずです*1

input=./UnknownPCM.bin
for fs in 32000 44100 48000; do
  for ch in 1 2; do
    for sign in s u; do
      for bit in 16 24 32; do
        for endian in le be; do
          pcmformat=${sign}${bit}${endian}
          output=./${fs}_${ch}_${pcmformat}.wav
          ffmpeg -f ${pcmformat} -ar ${fs} -ac ${ch} -i ${input} ${output}
        done
      done
    done
  done
done

 



以上。

*1:音程が低いという場合にはサンプリング周波数96KHzや192KHzも試してみると良いでしょう