2016-03-25 24 views
0

現在、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へのテント、私はコード内に実際の結果が元々返されることを妨げたいくつかの他の問題がありました。

しかし、ディスクに書き込まれているファイルは非常に途切れています。これは私のラップトップと実行しようとしているプロセスの数に問題があると確信しています。

+1

BitConverter.ToSingle(バッファ、インデックス) ' - あなたのバッファにFloat32サンプルが含まれていることは確かですか? (Int16またはInt32ではない) –

+0

バッファに実際に 'float'サンプルが含まれている場合、使用している' sampleAggregator'が問題である可能性もあります。後者の場合、[この回答](http://stackoverflow.com/a/20414331/2994596)を試すことができます。 – SleuthEye

+0

バッファにはバイト配列が返されますが、ASIOを使用しているときにこの問題は発生しませんでした。@SleuthEyeで提供されているサンプルも私が掘り下げたコードです:) – JBrian30221

答えて

0

NAudio WPFデモプロジェクトでは、1024サンプルのブロックを格納してからFFTを実行するSampleAggregatorというクラスで再生中にFFTを計算する例があります。

このようなことをしようとしているようです。問題は、32ビットではなく16ビットのサンプルが得られていることが疑わしい。すべてのバイトのペアでBitConverter.ToShortを使用してみてください。

+0

こんにちは@Mark、24 BitConverter.ToShortは認識されません。私はInt16/32を試しましたが、両方とも0とNaNを無作為に返しました。あなたが提案したデモプロジェクトを見てきました。ウェーブファイルをディスクに書き込んだ後、FFT変換のためにそれをストリーミングしますか? – JBrian30221

+0

私はあなたがWaveInにいるとは思わない。 WaveFormatを確認してください –

+0

申し訳ありませんが私の間違いだったのは確かに16ビットのサンプルです、私は今、より正確な周波数を取得していますが、保存されているファイルは非常に不安定です、これは両方の処理すぐにこれを達成するより効率的な方法がありますか? – JBrian30221

関連する問題