音频多声道数据的操作
一、前言:
近期因为项目中没有和硬件沟通好,导致在Android的alsa中录制数据时,硬件给过来的数据参数和需要的不一样,没办法,需要进行重采样,故看了下网上的重采样介绍,这里简单记录下。
二、重采样算法:
首先对录制的数据,当两声道及以上时,需要确认一点就是是否交织,这将决定我们的算法如何剥离数据。
这是网上找到的关于交织与非交织数据的图示,简单来说,交织的数据就是对每一个采样点都写上所有声道的数据之后才进行下一个采样点的数据写入,而非交织则是按到声道个数,一次性写入所有的采样数据。
在我本次的项目中,因为是对Android中tinyalsa的数据进行处理,所以确认数据是交织的。
而重采样的目的是将底层录制的48k采样率数据改为16k采样率数据,所以我们只需要在原来数据的基础上每隔三个点保存一下,保存完毕后,就是16k采样率的数据了。
具体代码实现如下:
/* data_buf为从alsa获取的48k原数数据,xmos_data_buf为重采样之后的数据 */int count = 0;int readCount = 0;short* pu16Src = NULL;short* pu16Dst = NULL;pu16Src = (short*)(data_buf);pu16Dst = (short*)(xmos_data_buf);/* 重采样处理:48k->16k,每隔三个点重采样一次 */for (count = 0; count < 320; count++){pu16Dst[count] = pu16Src[count * 3];}
从代码中可以看到,因为数据位宽是16bit的,所以以short指针的方式去读取缓存中的数据,其次,只要计算出需要处理的帧数(帧数 = 采样率/1000 * 位宽 * 时间),那么转换就可以完成了,经过重采样处理之后的数据体积肯定只有原来的三分之一。
三、分离声道数据:
上面经过重采样之后获取的数据是两个声道的总数据,我们还需要对数据进行声道分离,因为是交织方式获取的,所以算法如下:
/* 分离两个channel的数据 */int u32Channel = 0;int i = 0;for (u32Channel = 0; u32Channel < 2; u32Channel++){pu16Src = (short*)(xmos_data_buf);/* 两个声道的数据分别存在pChannelBuf的两个缓冲区中 */pu16Dst = (short*)(pChannelBuf[u32Channel]);for (i = 0; i < 160; i++){pu16Dst[i] = pu16Src[(i * 2) + u32Channel];}}
这里就实现了数据的重采样和分离,但是,对于这种操作我还是推荐硬件给过来的数据就是对的,毕竟,每一次录制都需要使用软件操作还是很占用系统资源的。
音频多声道数据的操作相关推荐
- 音频左右声道数据合并到一个声道
最近在学音频数据的处理,需要对不同的声道数据进行处理,这里分享一下如何将左右声道数据的合并到同一个声道里面. 其实左右声道数据的合并很简单的,就是把左右声道数据相加就可以了,不过要注意相加后的数据不要 ...
- webaudio ajax,Web Audio 入门之读取左右声道数据
说到音频,大家应该立刻会想到Audio,和Audio标签完全不同,Web Audio的功能更为强大.Audio 和 Web Audio的关系,就像img和canvas的关系一样. Web Audio ...
- (3.1)【多媒体中的数据隐藏】数字音频中的数据隐藏、原理、音频隐写工具 S-TOOLS、提取工具MP3Stego
目录 一.多媒体简介 1.1.流行: 1.2.隐患: 二. 数字音频中的数据隐藏 2.1.简介: 2.2.原理: 三.简单音频文件嵌入技术(不可感知的方法) 3.1.历史: 3.2.原理: 3.3. ...
- 201912一种改进动物音频分类的数据增强方法
Data augmentation approaches for improving animal audio classification 标题:一种改进动物音频分类的数据增强方法 作者: Lori ...
- 使用Java分离音频左右声道
使用Java分离音频左右声道 1.音频属性相关 音频采样所得的PCM都含有三个要素:声道(channel).采样率(sample rate).采样位数.时长. 1.1.声道 记录声音时,如果每次生成一 ...
- java实现声道分离,使用Java分离音频左右声道
使用Java分离音频左右声道 1.音频属性相关 音频采样所得的PCM都含有三个要素:声道(channel).采样率(sample rate).采样位数.时长. 1.1.声道 记录声音时,如果每次生成一 ...
- pcm转mp3_前端音频可视化——PCM数据解决方案
一.概述 本文的需求来自于标注团队对于音频文件的标注,需要将音频准确定位到毫秒位置进行内容标注,方便团队训练Ai模型 而产品也对标注功能提出了三项不可妥协的需求: 1.波形图必须基于音频原WAV无损格 ...
- nodejs操作sqlserver数据_pyspark操作MySQL、SQLServer数据库进行数据处理操作
欢迎访问本人的CSDN博客[Together_CZ],我是沂水寒城. https://yishuihancheng.blog.csdn.net 在大数据处理领域里面,Hadoop和spark可以说是最 ...
- mysql每组随机一条_MySql分组后随机获取每组一条数据的操作
思路:先随机排序然后再分组就好了. 1.创建表: CREATE TABLE `xdx_test` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAUL ...
最新文章
- Microbiome:微生物所刘双江组建立人肠道微生物资源库(hGMB)
- php springboot,springboot是什么?
- pc控制iphone的软件_如何在iPhone上下载升级最新的iOS 13公测版
- linux内存管理策略,Glibc内存管理—ptmalloc内存分配策略(1)
- Angular应用启动时创建的injection token一览
- Python线程指南 ---转自 http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
- 2021-2025年中国一次性马桶马桶座套行业市场供需与战略研究报告
- 《Velocity 模板使用指南》中文版[转]
- ubuntu samba
- Web基础(Java前端基础)
- Java中删除文件或文件夹的几种方法
- 微信小程序template模板使用
- 基于comsol软件的三维单模光纤模拟
- cass简码大全_Cass简码成图
- 国内 OA 办公自动化系统 现状
- react里面点击按钮触发复制文本功能
- CleanMyMac X如何维护脚本 优化mac电脑系统
- 海量数据去重之SimHash算法简介和应用
- 人流量监测-yolov5实现
- MySQL的启动与简单命令_002
热门文章
- css 按空格键对按钮暂停,当按下回车键后,怎么清空回车键的空格,或者模拟发送按键让光标向上?...
- 初识postgrest
- Boostnote是什么?-是为程序员开发的一种开放源代码记事本
- 【Python】不同目录下的.py文件调用问题
- 客厅计算机笔记本cpu,自己装一台客厅迷你小电脑,我很幸运避开数个大坑
- ILRuntime学习——从零开始
- 网络地址不在同一网段能通信吗
- UserBehavior用户行为分析
- 监听手机接收短信——模拟获取短信的验证码
- C++11的更新内容--auto--右值引用和移动构造--1114