現在、Windows 8.1のWinformsアプリケーションを作成していますが、デバイスのマイクからの入力データに対してFFTを実行できましたASIO Outを使用して私のマシンでASIOを使用できるようにするには、ASIO4ALLをダウンロードする必要がありました。Naudio WaveInを使用してFFT変換とディスクへの書き込みをリアルタイムで実行する(ASIO以外)
これはマイクロフォンのフィードバック量が非常に大きいため、周波数の読み取りが不正確になっていますサウンド自体をディスクにコピーして再生しました)、
これを回避するために、私はNaudioのWaveInクラスを使用するようにコードを修正しようとしていましたが、 FFTアルゴリズムのNaN(問題なく再生されるディスクに録音を保存することはできますが)
私はこの問題をいくつかの時点で解決しようとしてきましたが、どこかで愚かな間違い助けが大いに評価されるだろう!以下は
(私は私が間違っているつもり99%確信している)「OnDataAvailable」イベントのコードです:
void OnDataAvailable(object sender, WaveInEventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new EventHandler<WaveInEventArgs>(OnDataAvailable), sender, e);
}
else
{
byte[] buffer = e.Buffer;
int bytesRecorded = e.BytesRecorded;
int bufferIncrement = waveIn.WaveFormat.BlockAlign;
for (int index = 0; index < bytesRecorded; index += bufferIncrement)
{
float sample32 = BitConverter.ToSingle(buffer, index);
sampleAggregator.Add(sample32);
}
if (waveFile != null)
{
waveFile.Write(e.Buffer, 0, e.BytesRecorded);
waveFile.Flush();
}
}
}
任意の詳細および/またはコードが必要な場合は私に知らせてください。
waveFile:ファイルライターの名前
e.Buffer:
e.BytesRecorded記録されたデータを含むバッファ下記参考のため
を記録したバイトの総数が作業コードであります
void asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e)
{
byte[] buf = new byte[e.SamplesPerBuffer * 4];
for (int i = 0; i < e.InputBuffers.Length; i++)
{
Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer * 4);
}
for (int i = 0; i < e.SamplesPerBuffer * 4; i++)
{
float sample32 = Convert.ToSingle(buf[i]);
sampleAggregator.Add(sample32);
}
}
EDIT::ASIOのクラスを使用するときに返されているサンプルは、今コンバート駅を変更した後に正確ですこのページのアドバイスによるとInt16へのテント、私はコード内に実際の結果が元々返されることを妨げたいくつかの他の問題がありました。
しかし、ディスクに書き込まれているファイルは非常に途切れています。これは私のラップトップと実行しようとしているプロセスの数に問題があると確信しています。
BitConverter.ToSingle(バッファ、インデックス) ' - あなたのバッファにFloat32サンプルが含まれていることは確かですか? (Int16またはInt32ではない) –
バッファに実際に 'float'サンプルが含まれている場合、使用している' sampleAggregator'が問題である可能性もあります。後者の場合、[この回答](http://stackoverflow.com/a/20414331/2994596)を試すことができます。 – SleuthEye
バッファにはバイト配列が返されますが、ASIOを使用しているときにこの問題は発生しませんでした。@SleuthEyeで提供されているサンプルも私が掘り下げたコードです:) – JBrian30221