基于C的PCM音频数据的读取、处理与写入(一)

本文介绍如何使用C语言读取和处理PCM音频数据,涉及单声道16KHz、16位的PCM文件。通过短整型到浮点型的转换进行音量调整,避免数据精度损失导致的噪声。文中提出的数据转换流程为:short_in → float_in → (float_in * float_vol) → short_out,并讨论了fopen_s替代fopen、运算符优先级、指针参数保护、结构体使用和位移操作等后续探究主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PCM音频数据,是模拟音频信号经过数模转换后直接形成的二进制序列,是一种罕见的音频文件格式,因此在对pcm文件进行读写的时候,要选用以二进制的形式打开。
此次读写的PCM文件,单声道,采样率是16KHz,分辨率是16位,也就是2个字节的长度。
在程序编写之前,要考虑一个问题,pcm文件内的数据为short型,我们调整音量倍数可能是float型,因此两者相乘后值为float型,若强行进行取整运算,则会对数据产生较大影响,即引入了较大噪声,因此我们通过以下流程进行实现:short_in→float_in→float_in*float_vol=float_out→short_out。
在short<—>float的转换中,我们利用了归一化的思想,通过几组数据,验证得出他们之间的替换关系,如下:

*short型数据,在人为查看时,并不能直观判定该数据大小,即并不知晓其占满量程的百分比,因此通常归一化为float数据,
    那如何进行shortfloat之间的转换那,可以用以下代码来验证,最后得出两个常量值,当short为负数时,除以32768,且要乘以-1,
    当short为正数时,除以32767,就可将short转换为float,当需要存储到文件的时候,再乘以相应的数值,转换为short后进行存储。*/
    
    const short MAX_VOL_S16_N = 32768;   //16Bit满量程转换
    const short MAX_VOL_S16_P = 32767;
    
  //  以下代码进行了short-float之间的转换
/*
    short test_a = 32767;
    float test_b = 0.5;
    short test_c = -32768;
    float test_d = -0.5;

    short tmp_s;
    short tmp_s2;
    float tmp_f;
    float tmp_f2;
    
      
    tmp_s=(short)(test_b*MAX_VOL_S16_P);
    tmp_s2=(short)(test_d*MAX_VOL_S16_N);

    tmp_f=(float)test_a/MAX_VOL_S16_P;
    tmp_f2=(float)test_c/MAX_VOL_S16_N;
 
    printf("%d\n",tmp_s); //运行结果为16383,符合预期
    printf("%f\n",tmp_f);//运行结果为1,符合预期
    printf("%d\n",tmp_s2);//运行结果为16384,不符合预期
    printf("%d\n",(short)(-1*test_d*MAX_VOL_S16_N));  //运行结果为-16383,符合预期
    printf("%f\n",tmp_f2);//运行结果为1,不符合预期
    printf("%f\n",(float)-1*test_c/MAX_VOL_S16_N); //运行结果为-1,符合预期
    */
    /*综上,4个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值