【C语言】PCM音频数据处理---音量增大或减小

PCM音频数据增大或减小的原理主要是,将采样的数据乘上一个数字或者是除以一个数字,但要注意溢出处理。具体实现如下

C语言实现

#define OLD_FILE_PATH "file.pcm"
#define VOL_FILE_PATH "vol.pcm"


int volume_adjust(short  * in_buf, short  * out_buf, float in_vol)
{
    int i, tmp;

 

    // in_vol[0, 100]
    float vol = in_vol - 98;

 

    if(-98         vol = 1/(vol*(-1));
    else if(0<=vol && vol<=1)
        vol = 1;
    /*
    else if(1<=vol && vol<=2)
        vol = vol;
    */
    else if(vol<=-98)
        vol = 0;
    else if(vol>=2)
        vol = 40;  //这个值可以根据你的实际情况去调整

 

    tmp = (*in_buf)*vol; // 上面所有关于vol的判断,其实都是为了此处*in_buf乘以一个倍数,你可以根据自己的需要去修改

 

    // 下面的code主要是为了溢出判断
    if(tmp > 32767)
        tmp = 32767;
    else if(tmp < -32768)
        tmp = -32768;
    *out_buf = tmp;

 

    return 0;
}

 

void pcm_volume_control(int volume)
{
    short s16In = 0;
    short s16Out = 0;
    int size = 0;

 

    FILE *fp = fopen(OLD_FILE_PATH, "rb+");
    FILE *fp_vol = fopen(VOL_FILE_PATH, "wb+");

 

    while(!feof(fp))
    {
        size = fread(&s16In, 2, 1, fp);
        if(size>0)
        {       
            volume_adjust(&s16In, &s16Out, volume);
            fwrite(&s16Out, 2, 1, fp_vol);      
        }
    }

 

    fclose(fp);
    fclose(fp_vol);
}

 

int main(void)
{
    pcm_volume_control(100);
    return 0;
}

上面程序中,main函数中pcm_volume_control(100),这里设置为100主要是为了让其走入volume_adjust函数中的最后一个else语句,而最终放大的数据,是将其乘上一个40,这个值可以根据你自己的需求去调整。

vol = 40;
tmp = (*in_buf)*vol;12

 

经过上面的算法放大后,可以用Audacity工具去查看,放大后的PCM数据,如下图所示,上面的波形是原始数据,下面的波形是经过音量放大后的数据


参考资料

1.PCM声音数据解析
2.音频重采样与PCM音量调节最后代码
3.PCM 音量调节
---------------------
转载:https://blog.csdn.net/timsley/article/details/50683084

你可能感兴趣的:(Alsa)