1

Wave ファイルがあり、ピクセルごとに 2 つのサンプルを取得する関数があり、それらを使用して線を描画します。ズーミングを行う前に、すばやく簡単に。問題なく振幅値を表示できます

ここに画像の説明を入力

これは波形の正確なイメージです。これを行うには、次のコードを使用しました

//tempAllChannels[numOfSamples] holds amplitude data for the entire wav
//oneChannel[numOfPixels*2] will hold 2 values per pixel in display area, an average of min amp, and average of max
for(int i = 0; i < numOfSamples; i++)//loop through all samples in wave file
{
    if (tempAllChannels[i] < 0) min += tempAllChannels[i];//if neg amp value, add amp value to min
    if (tempAllChannels[i] >= 0) max += tempAllChannels[i]; 

    if(i%factor==0 && i!=0)     //factor is (numofsamples in wav)/(numofpixels) in display area
    {
        min = min/factor;       //get average amp value
        max = max/factor;
        oneChannel[j]=max;
        oneChannel[j+1]=min;
        j+=2;                   //iterate for next time
        min = 0;                //reset for next time
        max = 0;
    }   
}

それは素晴らしいことですが、データベースに表示する必要があるため、静かな波の画像は途方もなく小さくなりませんが、上記のコードに次の変更を加えると

oneChannel[j]=10*log10(max);
oneChannel[j+1]=-10*log10(-min);

波のイメージはこんな感じ。

ここに画像の説明を入力

正確ではありませんが、押しつぶされているように見えます。私がしていることに何か問題がありますか?ダイナミクスを維持しながら、振幅をデシベルに変換する方法を見つける必要があります。DBに変換するときに平均を取るべきではないと考えています。

4

1 に答える 1

3

概観のために dB に変換しないでください。誰もそれをしません。

ブロック全体の平均を見つける代わりに、絶対値の最大値を見つける必要があります。平均化することで、高周波ピークで多くの振幅が失われます。

于 2012-06-19T15:34:29.713 に答える