回答編集履歴

1 追記

KSwordOfHaste

KSwordOfHaste score 18118

2017/04/25 21:25  投稿

.NETにWav(RIFF)フォーマットで出力するためのライブラリーがないか探してみましたが自分には見つけられませんでした。どうも存在してない気がします。
stackoverflowにもWAVフォーマットを自前で書きこむような話題しか見当たりません。音声処理に関するオープンソースはいくつかありますがPCM前提のものが多くIEEE 32bit float前提のものが見つかりません。
WAVフォーマットはそれほど複雑ではないのでそれを参照して書き込み処理を作ってみるのが案外早いかも知れません。パラメータ決め打ちのサンプルページがありますが、大抵が16bit PCM前提かつフォーマットについての解説皆無なのでやはりWAVフォーマットそのものを解説したサイトを参考にするとよいと思います。個人的には[このサイト](http://www.web-sky.org/program/other/wave.php)が必要充分な情報が載っているように思えました。
kinectからの波形データはIEEE 32bitモノラルだと思います。よって、上記サイトの波形フォーマットのWAVE_FORMAT_IEEE_FLOATでチャネル数=1で出力することになると思いまs。
float->short(符号付16bit)に変換してやればWAVE_FORMAT_PCMで出力することも可能だと思います。(floatの波形データ範囲は-1.0~1.0であり、shortへ変換する際には-32768~32767の範囲へ変換するという点に注意してください。)
float->short(符号付16bit)に変換してやればWAVE_FORMAT_PCMで出力することも可能だと思います。(floatの波形データ範囲は-1.0~1.0であり、shortへ変換する際には-32768~32767の範囲へ変換するという点に注意してください。)
---
追記:PCM形式(16bit signed integer)のWAVファイルはよく見ますが、IEEE floatを試したことがなかったのでやってみました。結果Windows 10で再生できましたのでサンプルコードを載せておきます。この例では波形は計算で求めたもの(440Hz,正弦波)で、0.5秒分の波形データとしています。
```C#
using System;
using System.IO;
using System.Text;
class MainClass {
 public static void Main() {
   SaveRiff("a.wav");
   Console.WriteLine("Save done");
 }
 static ushort WAVE_FORMAT_PCM       = (ushort)0x0001;//未使用
 static ushort WAVE_FORMAT_IEEE_FLOAT = (ushort)0x0003;
 static uint BYTES_PER_SAMPLE_IEEE_FLOAT = 4U;
 static void SaveRiff(string path) {
   uint sampleRate = 44100; // 44.1 KHz
   ushort numChannels = 1; // モノラル
   uint numSamples = 22050; // 0.5 sec
   ushort waveFormat = WAVE_FORMAT_IEEE_FLOAT;
   uint bytesPerSample = BYTES_PER_SAMPLE_IEEE_FLOAT;
   using (var fs = new FileStream(path, FileMode.Create))
   using (var wr = new BinaryWriter(fs)) {
     // RIFF header
     wr.Write(MagicToBytes("RIFF")); //+00
     wr.Write(36U + bytesPerSample * numChannels * numSamples); //+04
     wr.Write(MagicToBytes("WAVE")); //+08
     // fmt chunk
     wr.Write(MagicToBytes("fmt ")); //+0C
     wr.Write(16U);                //+10: chunk length
     wr.Write((ushort)waveFormat); //+14
     wr.Write((ushort)numChannels); //+16
     wr.Write(sampleRate);         //+18
     wr.Write(bytesPerSample * numChannels * sampleRate); //+1C
     wr.Write((ushort)(bytesPerSample * numChannels));   //+20
     wr.Write((ushort)(8U * bytesPerSample));            //+22
     // data chunk
     wr.Write(MagicToBytes("data"));        //+24
     wr.Write(bytesPerSample * numSamples); //+28
                                            //+2C
     // 以降は波形データ。(この例では440Hzの正弦波)
     float amplitude = (float)0.25;
     float freq = 440;
     
     for (uint i = 0; i < numSamples; i++) {
       double th = i * Math.PI * freq / sampleRate;
       double w = amplitude * Math.Sin(th);
       wr.Write((float)w);
     }
   }
 }
 static byte[] MagicToBytes(string magic) {
   return Encoding.ASCII.GetBytes(magic);
 }
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る