绘制波形 - 转换为DB压缩它

时间:2012-06-18 22:20:13

标签: c++ audio waveform

我有一个wave文件,我有一个函数可以检索每个像素2个样本,然后我用它们绘制线条。在我处理缩放之前快速而轻松。我可以显示振幅值没问题

enter image description here

这是波形的精确图像。为此,我使用了以下代码

//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);

波形图像看起来像这样。

enter image description here

这不准确,看起来像被压扁了。我正在做的事情有什么问题吗?我需要找到一种方法,从振幅转换为分贝,同时保持动态。我认为我不应该在转换为DB时取平均值。

1 个答案:

答案 0 :(得分:2)

对于概视图片,请勿转换为dB。没有人这样做。

您应该找到绝对值的最大值,而不是在块上找到平均值。通过平均,您将在高频峰值中失去很多振幅。