2016-06-11 67 views
1

我正在研究在聲音文件上應用濾波器的應用程序,這些濾波器應用於頻域,因此我使用NAudio庫使用此代碼從.wav文件獲取樣本:將樣本浮點數組轉換爲WAV文件格式

audio = new AudioFileReader(wav_file); 
samples = new float[wave.Length]; 
audio.Read(samples, 0, samples.Length); 

在應用了前面的代碼之後,現在我將樣本作爲float數組,然後對獲取頻域數據的樣本應用短時傅立葉變換,然後將濾波器應用於頻域數據。
然後對頻域數據應用逆短時傅立葉變換以將其轉換回時域,該時域應該與初始樣本相似,但應用了濾波器。
再次以下步驟:

  1. 獲取樣本(時域數據)從wav文件數組。
  2. 對樣本應用短時傅立葉變換得到頻域數據。
  3. 在頻域數據上應用濾波器。
  4. 在頻域數據上應用反向短時傅里葉變換以獲得樣本(時域數據)。
  5. 將樣本再次轉換爲wav格式以保存並播放它。

現在問題是在最後一步,我有float數組樣本(時域數據),我該如何將它轉換成.wav文件並播放它?

+0

你應該能夠在這裏找到你所需要的:http://stackoverflow.com/questions/19715553/double-array-to-wav - 或這裏:http://stackoverflow.com/questions/9805407/normalizing-audio-how-to-convert-a-float-array-to-a-byte-array - 它有一些額外的步驟,但我相信到最後,它只需要生成你的wav文件。 – gmiley

回答

0

向樣品保存爲.wav文件,下面的代碼用於:

WaveFormat waveFormat = new WaveFormat(sampleRate, bitDepth, channels); 
using (WaveFileWriter writer = new WaveFileWriter("C:\\track1.wav", waveFormat)) 
{ 
    writer.WriteSamples(floatOutput, 0, floatOutput.Length); 
} 

sampleRatebitDepth,和channels從輸入文件中提取這樣的:

​​
0

1 - 創建一個實現ISampleProvider的類 2-使用此代碼播放 (sourse is ISampleProvider)

  var xs = new NAudio.Wave.SampleProviders.SampleToWaveProvider16(source); 
       var l = new NAudio.Wave.WaveOut(); 
       l.Init(xs); 
       l.Play();