2009-06-23 10 views
11

私はこのようなものを持っていたいと思います。 2つの異なる色は自然ではありません。オーディオデータをどのように視覚化できますか?

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

Iはすでに2つのINTアレイ、左右のチャンネルに1つずつステレオwavファイルからオーディオデータ(1サンプル/ミリ秒)を有します。私はいくつかの試みをしましたが、彼らはこのように近くでは見えません。私の試みは、スパイキーやコンパクトな塊になります。

良い提案はありますか?私はC#で働いていますが、psuedocodeは大丈夫です。

は、我々は関数DrawLine(色、X1、Y1、X2、Y2)のデータと

  • 2 INTアレイ右[]と左[]な長さLの
  • データ値

    • があると32767と-32768の間

    あなたが他の仮定をしているのであれば、答えに書き留めてください。

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

    これは、the solution Han providedを適用したときの結果です。 (1つのチャンネルのみ)
    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; i = 1〜viewArea.width {avgV = Avg(samples [i-i + samplesPerPixelColumn]); colHeight = getHeight(avgV);もし、avgV> = 0の場合、DrawLine(黒、i、viewArea.height/2、i、(viewArea.height/2)+ colHeight)else DrawLine(黒、i、viewArea.height/2、i、(viewArea.height/2 ) - colHeight);おそらくそこでは丸め/レンジ処理をする必要があるでしょうが、それは要点でなければなりません。 – steamer25

    +0

    あなたはそれを答えに入れませんか? – Nifle

    +1

    私はすぐに役立つかもしれないが、その一部がオフになっている場合は下降しないようなものをあなたに与えたいと思っていました。もっと考えてみましょう:縦線の代わりに、前のグラフポイントと次のグラフポイントの間に対角線を描きます。また、十分にズームインすると、1サンプルあたり複数のピクセルが表示されます。 – steamer25

    答えて

    2

    ピクセルごとに1つ以上のサンプルがある可能性があります。 1つのピクセルにマップされたサンプルグループごとに、サンプルグループの最小値から最大値まで(垂直)線分を描くことができます。ピクセルあたり1サンプル以下に拡大すると、これはもう機能しません。また、「いいねえ」のソリューションは、sincの補間値を表示することです。 DrawLineは単一のピクセルをペイントできないため、最小値と最大値が同じであれば小さな問題があります。そのケースでは、以下のコードのように、所望の位置に単一のピクセルイメージをコピーできますValue2Pixelは(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; 
    } 
    

    注意。

    0

    この場合、R言語を調べるとよいでしょう。私はあまり経験はありませんが、主に統計分析/視覚化シナリオで使用されています。あなたが言ったような極端なものを取り除く機能を持っていなければ、私は驚くでしょう。

    また、データをインポートする際に問題はありません。フラットテキストファイルを読むだけでなく、Cで簡単に拡張できるように設計されているので、おそらくC#インターフェイスもあります。

    +0

    ビットマップを描画するために外部アプリケーションを呼び出すことはうまくいくとは思えません。私は何回もビットマップを更新しています。 – Nifle

    関連する問題