pcm 32bit float 双声道转换16bit单声道

多通道音频转单通道

音频多通道是按照采样点进行交叉排列,比如双声道的16bit音频,16bit为一个采样点,那就是按照

通道1(16bit) 通道2(16bit) 通道1(16bit) 通道2(16bit)

进行交叉排列,如果是32bit,那每个采样点是32bit数据,c语言demo双声道转单声道

int ReSample2CTo1C(char* in, char* out, int nInputLen, int bit) {int count = 0;if (bit == 16) {count = nInputLen / 2 / 2; //16bit 一个采样点可以转成short 2个字节}else if (bit == 32) {count = nInputLen / 2 / 4; // 32bit 一个采样点是float 4个字节}for (int i = 0; i < count; i++) {if (bit == 16) {((short*)out)[i] = ((short*)in)[2 * i]; //交叉排列取第一路数据}else if (bit == 32) {((float*)out)[i] = ((float*)in)[2 * i]; //交叉排列取第一路数据}}return nInputLen / 2;
}

32bit float 数据转16bit

音频每个采样点里记录的数据是有上限的,如果是16bit数据 ,一个short能表示最大32767,最小-32766
,而32bit的float能表示的范围远比short大,我们要做的就是让float的数据范围落到short的区间,如下

int ReSample32bitTo16(char* in, char* out, int nInputLen) {int count = nInputLen / 4;for (int i = 0; i < count; i++) {float tmp = ((float*)in)[i];//printf("tmp = %f\n", tmp);short reout;if (tmp < -0.999999f) {reout = -32766;}else if (tmp >= 0.999999f) {reout = 32767;}elsereout = (short)(tmp * (32767.0f));((short*)out)[i] = reout;}return nInputLen / 2;
}

经过上述的转换,可以让音频从32bit双声道转到16bit的单声道

采样率转换

采样率就是1秒中采集了多少个采样点,48000hz采样转16000hz的话就是正好三分之一的采样点,所以我们可以每3个采样点取一个

int ReSample(char* in, char* out, int nInputLen) {int count = nInputLen / 3; for (int i = 0; i < count; i++) {((short*)out)[i] = ((short*)in)[3 * i]; //交叉排列取第一路数据}return nInputLen / 3;
}

但其实采样率转换还是比较复杂,上述采样方法辉出现混叠(需要被采样的数字信号频率高于采样频率1/2的频率,高出来的频率将被重采样成低于采样率的1/2频率的信号,高频信号被低频信号代替,两种波形完全重叠在一起,形成严重失真,这种频谱的重叠导致的失真称为混叠),要解决这种问题我们再重采样时就需要滤波器来重采样,滤波器的好坏也决定了音频的质量(或者针对不同的使用场景而做了不同的修改)

pcm 32bit float 双声道转换16bit单声道相关推荐

  1. 基于FFmpeg, 实现 8k 16bit 立体声 转码 16k 16bit 单声道。

    基于FFmpeg, 实现 8k 16bit 立体声 转码 16k 16bit 单声道. 命令

  2. 双声道转化为单声道matlab实现

    通过一段matlab代码,实现声信号的声道转换,有兴趣的可以看一下. clear; close all; clc; [x,FS]=audioread('庐州月.wav'); % 将 WAV 文件转换成 ...

  3. PCM双声道分离为单声道 C++ 实现

    这里主要是写 的是 16位 双声道 PCM数据的分离: 这个方法仅适用于非 planar 音频格式:就是如下图: 可以看这篇文章查看双声道PCM的内存结构: http://blog.csdn.net/ ...

  4. PCM双声道分离为单声道

    双声道的数据存储格式 https://blog.csdn.net/chinabinlang/article/details/72932947 有两种类型, LRLR...每个采样点交替, LLL... ...

  5. python音频处理(一):双声道转成单声道,降采样

    实现方法:利用ffmpeg自带的命令来完成 首先要确保ffmpeg的/bin放到了环境变量中,在cmd里输入ffmpeg可测试是否能用 接着便是在python里 import subprocess 这 ...

  6. 记录一个音频PCM数据由双声道转单声道出错问题

    引言 工作需要将一份 双声道的PCM数据转换成单声道数据,我采用的是将左右声道样点值对应相加求平均样点值的办法. 计算式如下: typedef int s32; typedef unsigned in ...

  7. ffmpeg音频解码重采样(立体声转成单声道)

    https://blog.csdn.net/qq_37003193/article/details/93870141 PCM双声道分离为单声道 https://blog.csdn.net/chinab ...

  8. 用FFmpeg将WAV(2通道)换成单声道(1通道)

    命令ffmpeg -i input.wav -ac 1 output.wav是FFmpeg的一个命令,用于将WAV格式的立体声(2通道)音频文件转换成单声道(1通道)音频文件. 下面是该命令的各个组成 ...

  9. 16bit的pcm双声道转单声道

    最近搞音频有点多,就稍微写一下,记录一下成长经历吧. pcm格式应该算是音频的原始数据吧,后面再经过不同的编码算法,转为不同的音频文件,比如mp3,amr等等.转为amr有很成熟的编码算法,AMR-N ...

最新文章

  1. 思科预计全球云数据流量将以66%的混合年增长率递增
  2. Github上的十大机器学习项目
  3. python基础教程:多态、多继承、函数重写、迭代器详细教程
  4. python对文件夹内文件去重
  5. nyist -- 组队赛(一)
  6. 数据结构小总结(成都磨子桥技工学校数据结构前12题)
  7. C语言函数返回1和返回0究竟哪个好?
  8. ggplot2中显示坐标轴_R可视化08|ggplot2图层标度图层(scale layer)图例篇
  9. @程序员,掌握这四点,想不优秀都难!
  10. oracle类似sqlcmd工具,Oracle:是否有跟踪查询的工具,例如用于SQL Server的Profiler?...
  11. c++ linux 获取毫秒_Linux下gettimeofday()函数和clock()函数:精确到毫秒级的时间
  12. 4999元起!iQOO 9 Pro赛道版上架:迄今为止成本最高手机后盖
  13. 笔者认为,中国的互联网行业需要真正的CEO
  14. TikTok广告投放必备指南
  15. FLV在线flash播放器JW PLAYER
  16. C/C++如何调用Java
  17. 牛客寒假基础集训营 | Day1 G题—eli和字符串
  18. 全年爆文率14%+,这个小红书品牌的内容营销密码是什么?
  19. 7-22 验证手机号
  20. uniapp textarea编辑保留空格换行

热门文章

  1. hadoop的一些名词解释
  2. Flink 最锋利的武器:Flink SQL 入门和实战
  3. 把无限循环小数化为分数
  4. python变量使用前需要定义吗_python需要定义变量吗
  5. 人类和超级人工智能的关系发展,多年来一直都是一个热门话题
  6. Vue 深度选择器:deep()与::v-deep详解
  7. VUE day_01(7.15) vue的入门---使用vue脚本可以实现的一些功能
  8. 每日新闻丨​苹果联想共占全球移动计算设备市场36%
  9. 计算机二级为什么靠Java的少,计算机二级考试:Java语言学习六大要点
  10. 2021-2027全球及中国游泳池水循环系统行业研究及十四五规划分析报告