2009-06-23 29 views
11

Tôi muốn có một cái gì đó trông giống như thế này. Hai màu sắc khác nhau không phải là nessesary.Làm cách nào để trực quan hóa dữ liệu âm thanh?

audacity on mac http://audacity.sourceforge.net/about/images/audacity-macosx.png

Tôi đã có dữ liệu âm thanh (một mẫu/millisecond) từ một wav stereo ở hai int mảng, một cho mỗi kênh trái và phải. Tôi đã thực hiện một vài nỗ lực nhưng họ không nhìn bất cứ nơi nào gần như rõ ràng như thế này, nỗ lực của tôi có được spikey hoặc một khối nhỏ gọn.

Bất kỳ đề xuất nào tốt? Tôi đang làm việc trong C# nhưng psuedocode là ok.

Giả sử chúng ta có

  • một hàm DrawLine (màu sắc, x1, y1, x2, y2)
  • hai int mảng với dữ liệu đúng [] và trái [] của chiều dài L
  • giá trị dữ liệu giữa 32767 và -32768

Nếu bạn thực hiện bất kỳ giả định nào khác, hãy viết chúng trong câu trả lời của bạn.

for(i = 0; i < L - 1; i++) { 
    // What magic goes here? 
} 

Đây là cách nó được bật khi tôi áp dụng the solution Han provided. (chỉ một kênh)
alt text http://www.imagechicken.com/uploads/1245877759099921200.jpg

+0

Audacity là nguồn mở để bạn có thể xem mã. Tôi muốn giả định một cái gì đó như sau ... func getHeight (v) {return abs (v) * 32767/viewArea.height/2); samplesPerPixelColumn = samples.len/viewArea.width; cho i = 1 để xemArea.width {avgV = Trung bình (mẫu [i-i + samplesPerPixelColumn]); colHeight = getHeight (avgV); if avgV> = 0 DrawLine (đen, i, viewArea.height/2, i, (viewArea.height/2) + colHeight) khác DrawLine (đen, i, viewArea.height/2, i, (viewArea.height/2)) - colHeight); Có thể bạn sẽ cần phải làm một số xử lý làm tròn/phạm vi trong đó nhưng đó phải là ý chính. – steamer25

+0

Tại sao bạn không đặt câu trả lời đó vào câu trả lời. – Nifle

+1

Tôi muốn cung cấp cho bạn thứ gì đó có thể hữu ích ngay lập tức nhưng không được giảm giá nếu một phần của nó bị tắt. Suy nghĩ khác: Thay vì các đường thẳng đứng, vẽ đường chéo giữa điểm đồ thị trước đó và tiếp theo ...Ngoài ra, nếu bạn phóng to đủ, bạn sẽ có nhiều pixel cho mỗi mẫu. – steamer25

Trả lời

2

Bạn có thể có nhiều hơn 1 mẫu cho mỗi pixel. Đối với mỗi nhóm mẫu được ánh xạ tới một pixel, bạn có thể vẽ một đoạn thẳng (dọc) từ giá trị nhỏ nhất trong nhóm mẫu đến giá trị lớn nhất. Nếu bạn phóng to 1 mẫu trên mỗi pixel trở xuống, điều này sẽ không hoạt động nữa và giải pháp 'đẹp' sẽ hiển thị các giá trị nội suy sinc. Vì DrawLine không thể vẽ một pixel, nên có một vấn đề nhỏ khi mức tối thiểu và tối đa giống nhau. Trong trường hợp đó bạn có thể sao chép một hình ảnh pixel ở vị trí mong muốn, như trong đoạn code dưới đây:

double samplesPerPixel = (double)L/_width; 
double firstSample = 0; 
int endSample = firstSample + L - 1; 
for (short pixel = 0; pixel < _width; pixel++) 
{ 
    int lastSample = __min(endSample, (int)(firstSample + samplesPerPixel)); 
    double Y = _data[channel][(int)firstSample]; 
    double minY = Y; 
    double maxY = Y; 
    for (int sample = (int)firstSample + 1; sample <= lastSample; sample++) 
    { 
     Y = _data[channel][sample]; 
     minY = __min(Y, minY); 
     maxY = __max(Y, maxY); 
    } 
    x = pixel + _offsetx; 
    y1 = Value2Pixel(minY); 
    y2 = Value2Pixel(maxY); 
    if (y1 == y2) 
    { 
     g->DrawImageUnscaled(bm, x, y1); 
    } 
    else 
    { 
     g->DrawLine(pen, x, y1, x, y2); 
    } 
    firstSample += samplesPerPixel; 
} 

Lưu ý rằng Value2Pixel quy mô giá trị mẫu đến một giá trị pixel (trong y-hướng).

0

Bạn có thể muốn xem ngôn ngữ R cho điều này. Tôi không có nhiều kinh nghiệm với nó, nhưng nó được sử dụng chủ yếu trong các kịch bản phân tích/trực quan thống kê. Tôi sẽ ngạc nhiên nếu họ không có một số chức năng làm mịn để thoát khỏi những thái cực như bạn đã đề cập.

Và bạn sẽ không gặp khó khăn khi nhập dữ liệu của mình vào đó. Không chỉ bạn có thể đọc các tập tin văn bản phẳng, nhưng nó cũng được thiết kế để dễ dàng mở rộng với C, vì vậy có lẽ một số loại giao diện C# là tốt.

+0

Tôi nghi ngờ rằng việc gọi một ứng dụng bên ngoài để vẽ bitmap của tôi sẽ hoạt động. Tôi đang cập nhật bitmap nhiều lần trong một giây. – Nifle

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