2009-06-23 61 views
11

我想要看起來像這樣的東西。兩種不同的顏色不是無用的。如何可視化音頻數據?

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

我已經在兩個int陣列,每一個用於左和右信道從立體聲WAV音頻數據(一個樣品/毫秒)。我已經做了一些嘗試,但他們看起來並沒有像這樣清晰,我的嘗試變成了spikey或緊湊的團塊。

任何建議嗎?我在c#中工作,但psuedocode是可以的。

假設我們有

  • 的函數的DrawLine(顏色,X1,Y1,X2,Y2)與
  • 兩個int陣列數據向右[]和左邊的[] lenght大號
  • 數據值在32767和-32768之間

如果您做出任何其他假設,只需在答案中寫下它們即可。

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

這就是我申請the solution Han provided時的結果。 (只有一個頻道)
alt text http://www.imagechicken.com/uploads/1245877759099921200.jpg

+0

Audacity是開源的,所以你可以看看代碼。我會假設像下面這樣... func getHeight(v){return abs(v)* 32767/viewArea.height/2); samplesPerPixelColumn = samples.len/viewArea.width; for i = 1 to viewArea.width {avgV = Avg(samples [i-i + samplesPerPixelColumn]); colHeight = getHeight(avgV);如果avgV> = 0 DrawLine(black,i,viewArea.height/2,i,(viewArea.height/2)+ colHeight)else DrawLine(black,i,viewArea.height/2,i,(viewArea.height/2 ) - colHeight);你可能需要在那裏做一些舍入/範圍處理,但這應該是主要的。 – steamer25 2009-06-23 23:14:21

+0

你爲什麼不把它寫成答案。 – Nifle 2009-06-24 07:01:11

回答

2

對於每個像素,您可能會有超過1個樣本。對於映射到單個像素的每組樣本,可以從樣本組中的最小值到最大值繪製(垂直)線段。如果你放大每個像素或更少的樣本1個樣本,這就不再適用了,'nice'解決方案將顯示sinc插值。 由於DrawLine無法繪製單個像素,因此當最小值和最大值相同時會出現小問題。在這種情況下,你可以在期望的位置複製單個像素的圖像,如在下面的代碼:

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; 
} 

注意Value2Pixel縮放的採樣值的像素值(在y方向上)。

0

你可能想看看這個R語言。我沒有太多的經驗,但主要用於統計分析/可視化場景。如果他們沒有一些平滑功能來擺脫你所提到的極端情況,我會感到驚訝。

而且你應該沒有麻煩導入你的數據。您不僅可以讀取平面文本文件,而且它還可以用C輕鬆擴展,所以也可能有某種C#接口。