2009-06-30 65 views
5

Có ai biết cách lấy biên độ trung bình của tệp .wav bằng C# (ngay cả khi nó có nghĩa là gọi chương trình dòng lệnh ngoài và phân tích cú pháp đầu ra)? Cảm ơn!Biên độ trung bình của một .wav trong C#

+0

Quên đề cập đến rằng .wav là mono, nếu điều đó làm cho tình hình bất kỳ dễ dàng hơn/khác nhau. – BarrettJ

Trả lời

3

Đây là một snip đọc trong phần âm thanh nổi và đặt dữ liệu vào hai mảng. Đó là chưa được kiểm tra bởi vì tôi đã phải loại bỏ một số mã (chuyển sang mono và tính toán một đường trung bình)

/// <summary> 
    /// Read in wav file and put into Left and right array 
    /// </summary> 
    /// <param name="fileName"></param> 
    private void ReadWavfiles(string fileName) 
    { 
     byte[] fa = File.ReadAllBytes(fileName); 

     int startByte = 0; 

     // look for data header 
     { 
      var x = 0; 
      while (x < fa.Length) 
      { 
       if (fa[x]  == 'd' && fa[x + 1] == 'a' && 
        fa[x + 2] == 't' && fa[x + 3] == 'a') 
       { 
        startByte = x + 8; 
        break; 
       } 
       x++; 
      } 
     } 

     // Split out channels from sample 
     var sLeft = new short[fa.Length/4]; 
     var sRight = new short[fa.Length/4]; 

     { 
      var x = 0; 
      var length = fa.Length; 
      for (int s = startByte; s < length; s = s + 4) 
      { 
       sLeft[x] = (short)(fa[s + 1] * 0x100 + fa[s]); 
       sRight[x] = (short)(fa[s + 3] * 0x100 + fa[s + 2]); 
       x++; 
      } 
     } 

     // do somthing with the wav data in sLeft and sRight 
    } 
+0

Nếu tệp wav là mono, tôi có thể chỉ nhận xét ra sRight [x] = (ngắn) (fa [s + 3] * 0x100 + fa [s + 2]) hay không; dòng và thay đổi s = s + 4 đến s = s +2? Tôi không quen với định dạng wav. Cảm ơn! – BarrettJ

+0

Không phải tôi, nhưng tôi nghĩ bạn có thể bỏ qua sRight. – Nifle

+2

Thực hiện các thay đổi mà tôi đã liệt kê ở trên và tuyên bố sLeft là "var sLeft = new short [fa.Length/2];" thực sự làm việc cho các tệp đơn. – BarrettJ

1

Thông thường, phương pháp root-mean-squared được sử dụng để tính toán biên độ "trung bình" của tín hiệu sin (x).

+0

Tôi nghĩ rằng OP đang yêu cầu nhiều hơn liên quan đến khía cạnh thực tế của vấn đề. Mặc dù thực sự, anh ta sẽ muốn tính giá trị RMS. – Noldorin

+0

Cảm ơn bạn đã thông tin này vì tôi đã không nhận thức được điều này và nó đã thực sự giúp đỡ rất nhiều. – BarrettJ

3

Thư viện cho các âm thanh .NET như đặt cược tốt nhất của bạn. Nó cho phép truy cập vào dạng sóng của một tệp âm thanh, có thể lặp lại để tính giá trị của ampltiude trung bình.

Các vấn đề liên quan