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;
}

上面程序中,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

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

  1. PCM音频数据音量大小调节

    转载:http://blog.csdn.net/timsley/article/details/50683084 PCM音频数据增大或减小的原理主要是,将采样的数据乘上一个数字或者是除以一个数字,但要 ...

  2. PCM音频和音量调节

    声音的本质是一种能量波,由振动而产生的能量波,通过传输介质传输出去.声音有三个属性: 音调(Pitch):声音频率的高低.表示人的听觉分辨一个声音的调子高低的程度.音调主要由声音的频率决定,同时也与声 ...

  3. 【C语言】PCM音频数据处理---左右声道分离

    我用一麦克风录制的PCM数据是16bit,双声道的,用Audacity工具查看可知,右声道是没有声音的,左声道才有声音,如下图所示 所以为了节省存储空间,完全可以将左右声道分离出来,左右声道分离的方法 ...

  4. 【C++】基于OpenGL的音乐可视化(一):PCM音频数据的解析

    PCM的数据解析出音量信息首先要知道的一些基础常识: 采样频率,指每秒钟取得声音样本的次数,采样频率越高,包含的声音信息自然就越多,声音也就越好,频率越高,保存需要的空间也会高. 采样位宽,即采样值, ...

  5. 视音频数据处理入门:PCM音频采样数据处理

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  6. PCM音频基础知识及采样数据处理

    PCM音频基础知识及采样数据处理 目录 PCM简介 采样频率.量化精度(采样位数)和声道数 音频帧 录播过程 音频混音 PCM音频采样数据处理 转载自:音频PCM知识整理 视音频数据处理入门:PCM音 ...

  7. PCM音频采样数据处理

    PCM音频采样数据处理 PCM 脉冲编码调制是Pulse Code Modulation的缩写.脉冲编码调制是数字通信的编码方式之一.主要过程是将话音.图像等模拟信号每隔一定时间进行取样,使其离散化, ...

  8. C++ 调节PCM音频音量大小

    在用解码器解码音频数据得到PCM音频数据块之后,可以在将数据送给声卡播放之前调节其音量大小,PCM格式本身就是以一定的数据位记录音量的高低(如16位,便是以2个byte的长度记录采样时间点音量的大小) ...

  9. 视音频数据处理入门:RGB、YUV像素数据处理【转】

    转自:http://blog.csdn.net/leixiaohua1020/article/details/50534150 ==================================== ...

最新文章

  1. Oracle12c多租户如何启动关闭CDB或PDB (PDB自动启动)
  2. ChromeDriver启动Chrome浏览器后,地址栏只显示data;——chromeDriver版本不对
  3. MongoDB-JAVA-Driver 3.2版本常用代码全整理(4) - 地理空间索引
  4. Qt数据库操作(三) -- 使用SQL模型类
  5. 怎么new一个指针_19. Go语言里的 make 和 new 有什么区别?
  6. 左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)
  7. webservice 出现No service was found
  8. cascade rcnn论文总结
  9. c++远征之多态篇——运行时类型识别(RTTI)
  10. matlab设置非平坦结构元,详解MATLAB/Simulink通信系统建模与仿真图书信息
  11. mysql nest loop伪代码_Nested Loop Join
  12. 有读二本国防计算机学校,好的二本计算机大学
  13. DNS服务器配置图解过程(1)
  14. DPlayer开发弹幕后台
  15. Git过程中遇到Enter passphrase for key '/c/Users/XXX/.ssh/id_rsa':
  16. flog和flag_立flag是什么梗 立个flag是什么意思
  17. 恶意软件家族分类 模型集成方案总结
  18. 电话号码的字母组合(Java)
  19. トゥーヴァ / 土法
  20. Xilinx FPGA高速串行收发器简介

热门文章

  1. 用AI给漫画线稿自动上色工具
  2. 移动应用测试篇(4)——App测试技术(2)
  3. vs19c++求arccos值
  4. 【学习笔记】CRT 欧拉定理及扩展
  5. c++ Builder TMemo控件自动滚动
  6. 使用GPT-2加载CPM-LM模型实现简单的问答机器人
  7. 云卷水乡 云端时代2017年渠道大会召开
  8. python:关于三维装箱问题的算法研究-3
  9. linux添加3g模块,Linux下华为3g模块e220上网
  10. 2022-2028全球与中国氯苯胺氨基甲酸酯市场现状及未来发展趋势