打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【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 && vol<0)        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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

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

vol = 40; tmp = (*in_buf)*vol;
  • 1
  • 2

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

参考资料

1.PCM声音数据解析
2.音频重采样与PCM音量调节最后代码
3.PCM 音量调节

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
PCM音频重采样,音量控制(c实现)
一段比较通用读取配置文件的代码
Weed-FS之Volume数据迁移
Linux下一个很简单的C病毒研究
VOL/地量买点
Linux系统编程练习 ELF文件头读取和修改
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服