KinectのマイクロフォンからのデータをFFTできたら面白いかなあと思った続き。
いろいろあって、すごく時間が空いてしまったような気がするけど、とりあえず、kinectのマイクロフォンのデータを取得する関数からの出力を使って、FFTができるようになった。
いろいろ変なところもあろうが、該当部分のソースを晒してみることにした。
- FFTの本体
const int fftLength = 1024;
byte[] rawData;
const int rawDataLength = 1024 * 2;
AForge.Math.Complex[] fftBuf;
public void doFFT(Stream audioStream)
{
int recordLength = rawDataLength;
while (recordLength > 0)
{
int count = audioStream.Read(rawData, 0, recordLength);
recordLength -= count;
}
for (int i = 0; i < fftLength; i++)
{
fftBuf[i].Re = (rawData[2 * i + 1] << 8 | rawData[2 * i]);
fftBuf[i].Im = 0;
}
AForge.Math.FourierTransform.FFT(fftBuf, AForge.Math.FourierTransform.Direction.Forward);
}
- 使う側
using (var source = new KinectAudioSource())
{
source.SystemMode = SystemMode.OptibeamArrayOnly;
using (var audioStream = source.Start())
{
while (true)
{
doFFT(audioStream);
}
}
}
ぶっちゃけ、これだけ。あとは枝葉末節(AForgeライブラリに関しては、以前の記事を参照のこと)。
スピードは、FFTの処理自体は付いてきてくれているはずだけど。。。この後、前回記事のように、FFTの結果をスペクトルっぽく表示しているのだけど、ちょっと遅れているように感じる。。。どこか悪いのだろうか??
あと、関数から取得できるデータって、1入力だけなのかしら。マイク4つあるはずだから、4入力取得できる方法があるのかしら(しっかりマニュアル読んでないだけだけど)。
しかし、慣れてないせいもあって、C#、というよりWindowsで図とか表示するの難しいなあ。KinectやらFFTで悩んでいる時間より、画面に図形とかを表示する方法が分からなくて悩んでいる時間のほうが長いや。。。