2014-06-29 50 views
0

因此,我正在嘗試讀取.wav文件的幅度數據,以便稍後在DFT中使用它,並使用此代碼獲取C#中的幅度數據,以及把它放到一個txt文件以一定的間隔從WAV文件中讀取幅度數據

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using NAudio.Wave; 

namespace SoundToAmplitudes 
{ 
    class Program 
    { 
     private static int Main(string[] args) 
     { 
#if DEBUG 
      Console.WriteLine(String.Join(", ", args)); 
      args = new[] { @"C:\Users\s550c\Documents\visual studio 2010\Projects\DFT\DFT\newrecord.wav" }; 
#endif 
      return Cli(args); 
     } 

     static int Cli(string[] args) 
     { 
      System.IO.StreamWriter file = new System.IO.StreamWriter("d:\\test6.txt"); 
      string fileName = args[0]; 
      var soundFile = new FileInfo(fileName); 
      foreach (float s in AmplitudesFromFile(soundFile)) 
      { 
       Console.WriteLine(s); 

       file.WriteLine(s); 


      } 
      file.Close(); 
      //Console.WriteLine(); 
#if DEBUG 
      Console.Read(); 
#endif 
      return 0; 
     } 

     public static IEnumerable<float> AmplitudesFromFile(FileInfo soundFile) 
     { 
      var reader = new AudioFileReader(soundFile.FullName); 
      int count = 4096; // arbitrary 
      float[] buffer = new float[count]; 
      int offset = 0; 
      int numRead = 0; 
      while ((numRead = reader.Read(buffer, offset, count)) > 0) 
      { 
       foreach (float amp in buffer.Take(numRead)) 
       { 
        yield return amp; 
       } 
      } 
     } 
    } 
} 

程序給我約1秒聲音文件數據的一個長長的清單,(145920個數據是精確的),所以我的問題是這樣的:

  1. 每個數據之間的時間間隔是多少? (如1^-10秒或smt?),我怎麼知道它?

  2. 如果我想自己設置每個數據之間的間隔,應該如何更改代碼?

+0

我沒跟着。你爲什麼要把波形文件樣本當作浮點數來處理?假設你試圖打開未壓縮的PCM文件,緩衝區應該是短整型。看起來你只是發現了一些代碼,並不知道如何使用它。你知道標題有多少樣本。我假設你的AudioFileReader應該加載這種信息。 – Tarec

+0

是的,例如我將間隔設置爲0.01秒,那麼我得到的數據將是0秒處的幅度; 0.01秒; 0.02秒等等。 – Megazero

+0

@Tarec是的,就像我說過的我從未玩過音頻文件,所以我完全瞎了這些東西是如何工作的。我不能將它改爲short,因爲來自NAudio庫的函數AudioFileReader.Read需要浮動 – Megazero

回答

1

回答問題1:數據的間隔由採樣率決定。這可以通過reader.WaveFormat.SampleRate訪問。這是每秒樣本數,因此樣本之間的時間間隔爲1/SampleRate。

對於問題2:我不熟悉NAudio,所以我不知道它是否有任何功能可以做到這一點,但是您可以跳過樣本以僅獲取所需的樣本。

+0

非常感謝,這確實對我有幫助。但是,當我試圖看到我的wav文件的採樣率是44100時,程序會返回給我145920個數據,如果它的採樣率意味着44100數據/秒,那麼它將等於3.3秒左右,而我的聲音文件只是升技超過1秒,你有什麼想法爲什麼^^? – Megazero

+0

它是立體聲嗎? 16Bit的?有幾個參數需要考慮。 – TaW

+0

@ user3702271:'WaveFormat.Channels'指定流中的通道數量。可能有兩個(單聲道文件可能會變成立體聲),在這種情況下,採樣是交錯的(Left1,Right1,Left2等)。該文件的持續時間將是1.6秒。 – Herman

相關問題