RK3308--8声道改成双声道+录音增益

2023-05-16

改为双声道

修改dts文件

相关路径:

  • Y:\hxy\RK3308\sdk-1.5\kernel\arch\arm64\boot\dts\rockchip
  • Y:\hxy\RK3308\sdk-1.5\kernel\Documentation\devicetree\bindings\sound
  • Y:\hxy\RK3308\sdk-1.5\kernel\sound\soc\rockchip

通过指令grep -rin "rockchip,rk3308-multi-dais"查找相关文件

相关文件:

  • rk3308-evb-dmic-pdm-v13.dts
  • rockchip,multidais.txt
  • rockchip_multi_dais.c

对以下部分进行修改:

	pdm_i2s_dais: pdm-i2s-dais {
		status = "okay";
		compatible = "rockchip,rk3308-multi-dais", "rockchip,multi-dais";
		dais = <&pdm_8ch>, <&i2s_8ch_2>;
-	    capture,channel-mapping = <6 2>;
+		capture,channel-mapping = <2 0>;	
		playback,channel-mapping = <0 2>;
		bitclock-inversion = <1 0>;
	};

<6 2> 改成 <2 0>

一开始SDK刚拿到的时候,在维持8声道配置时编出固件时,用 arecord 指令录不了音(录后拷贝出来发现数据容量很小),其原因就是 dts 文件中有一个vccio口没配置好:

&io_domains {
	status = "okay";

	vccio0-supply = <&vcc_io>;
	vccio1-supply = <&vcc_io>;
-	vccio2-supply = <&vcc_io>;
+	vccio2-supply = <&vcc_1v8>;
	vccio3-supply = <&vcc_1v8>;
	vccio4-supply = <&vcc_1v8>;
	vccio5-supply = <&vcc_io>;
};

RK_EVB_RK3308_DDR3P116SD4_V13_20181029.pdf 文件中可以看到各 vccio 的作用:
硬件图

了解asound.conf的作用

路径:Y:\hxy\RK3308\sdk-1.5\buildroot\board\rockchip\rk3308\fs-overlay\etc

一开始查找路径时找到以下4个路径:

  1. Y:\hxy\RK3308\sdk-1.5\buildroot\output\rockchip_rk3308_release\target\etc
  2. Y:\hxy\RK3308\sdk-1.5\buildroot\output\rockchip_rk3308_64_dueros\target\etc
  3. Y:\hxy\RK3308\sdk-1.5\buildroot\board\rockchip\rk3308\fs-overlay\etc
  4. Y:\hxy\RK3308\sdk-1.5\buildroot\board\minnowboard\fs-overlay-graphical\etc

相关文件:asound.confAsound_Configuration_CN.pdf

录音增益

增益补丁包patch

路径:Y:\hxy\RK3308\sdk-1.5\buildroot\package\alsa-lib

文件:0005-add-gain-for-audio-input.patch,补丁包来着,这个其实已经过时了,里面要求改的 RK 默认的 pcm.c 就已经改好了,如果按照patch包的改法的话,有如下新增:

  1. 1171行的static void add_gain_rk_16(void* pIn,int length, int channels)
  2. 1205行的static void add_gain_rk_32(void* pIn,int length, int channels)
  3. 2096行的add_gain_rk_16((void*)buffer, tmp * pcm->frame_bits / pcm->sample_bits, pcm->channels);函数
  4. 2103行的add_gain_rk_32((void*)buffer, tmp * pcm->frame_bits / pcm->sample_bits, pcm->channels);函数

patch格式解析:参考链接01 参考链接02

patch包的一些内容解析如下:

diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c	
index 9c90afb..281fbe3 100644
--- a/src/pcm/pcm.c		##原文件,a是原文件对应的目录
+++ b/src/pcm/pcm.c		##修改后的文件,b是对应目录,可通过下级目录找到这个文件

下面表示@@-旧文件开始行数,旧行数 +新文件开始行数,新行数@@;旧文件从825行的void DCBDoing开始,共6行;新文件也从825行开始,共23行:

@@ -825,6 +825,23 @@ void DCBDoing(void* pIn, int length, int channels)
     }
 }
 #endif
+void add_gain(void* pIn, int length, int channels)
+{
+    int i = 0;
+    int16_t * pInBuf  =  (int16_t *)pIn;
+    char *alsa_gain_level = getenv("ALSA_LIB_ADD_GAIN");
+    if(alsa_gain_level) {
+        int level = atoi(alsa_gain_level);
+        //printf("gain level:%d\n",level);
+        for(i = 0; i < length; i ++ ) {
+            int curChannel = i % channels;
+            if(curChannel < channels - 2 ) {//audio loopback no need to add gain
+                (*pInBuf) <<= level;
+            }
+            pInBuf++;
+        }
+    }
+}

修改pcm.c

路径:Y:\hxy\RK3308\sdk-1.5\buildroot\output\rockchip_rk3308_release\build\alsa-lib-1.1.5\src\pcm

在8声道的时候,录音得到的声音很小,有添加录音增益补丁之后,在控制台上输入指令export ALSA_LIB_ADD_GAIN=4才能实现录音增益;在刚修改完为双声道的时候,遇到了在控制台上输入上面指令失效的问题,这时候还要对 pcm.c 进行修改(notepad++快速跳转到某行的快捷方法:Ctrl+G):

1.2090行,snd_pcm_readi函数中有这样的一个判断条件:

if(pcm->channels != 2 && tmp > 0){...}

改为以下:

if(pcm->channels <= 2 && tmp > 0) {...}

2.增加一个2089行中一个printf信息如下:

printf("dcb size=%d,tmp=%d,sam_bits=%d,framebits=%d,format=%d,channels=%d,\n",size,tmp,pcm->sample_bits,pcm->frame_bits,pcm->format,pcm->channels);

3.注释掉add_gain_rk_16函数和add_gain_rk_32函数中的判断条件:

if(curChannel < channels - 2 ) {...}

并各增加以下语句:

printf("rk_16 channels:%d level:%d \n",channels,level);
printf("rk_32 channels:%d level:%d \n",channels,level);
  1. 改完之后,要到cd work/hxy/RK3308/sdk-1.5/buildroot/output/rockchip_rk3308_release/下执行 make alsa-lib-rebuild 命令
  2. 试过在Y:\hxy\RK3308\sdk-1.5\buildroot\output\rockchip_rk3308_release\build\alsa-lib-1.1.5\src\pcm下进行make,但没有效果

mic硬件电路图

相关文件:EVB_CN.pdf
mic规格:MSM261D4030H1CPM

6+0+2 麦克风阵列方案说明

圆形麦克风阵列,对于不同的麦克风位置,可实现不同的通道组合,例如下图的方案,等间距布置在圆周上的6个麦克风
PDM麦克风阵列
在本麦克风阵列方案中,圆周阵列麦也可设计用来做语音唤醒功能,因此不需要单独的唤醒麦。同时,为获得更好的回声消除效果,在左右声道喇叭网络上,通过主控自带的ADC将输出端的音频信号回采,这样的回采方式能最贴近喇叭播放的实际效果。

因此6+0+2麦克风阵列的含义是:6个圆周麦克风(capture)、0个唤醒麦、2路回采(playback)音频信号。

PDM麦克风原理图

电路中,每2个数字麦对应一个PDM_SDI信号,如下图,因此6个麦需要使用3个SDI信号:
PDM麦克风原理图

连接座

FPC:Flexible Printed Circuit,挠性印刷电路
麦克风阵列子板通过30Pin_0.5mm间距的FPC线与RK3308_EVB主板连接,其接口定义如下:
麦克风阵列接口
PDM麦克风对应的PCB板丝印为: RK_EVB_DMIC-PDM_6C70_V11_20180427J

控制台console试验

录音arecord试验

1.先使用以下3个指令:

  • export ALSA_LIB_ADD_GAIN=4
  • arecord -Dhw:0,0 -c 2 -r 8000 -f S16_LE /data/test01.wav
  • aplay /data/test01.wav

使用以下printf 出的 log 信息如下(后面再源代码中注释掉了):

rk_16 channels:2 level:3 
dcb size=1000,tmp=1000,sam_bits=16,framebits=32,format=2,channels=2,

改了文件系统类型试验

2.若文件系统类型改为ext2类型的话,会导致aplay无法播放音频,arecord能录到(有push出来进行试听)

dts参数修改意义的试验

问题1capture,channel-mapping = <2 0>; 是不是意味着只用了6个mic中的2个,具体是哪两个?

答:通过物理试验,在麦上触摸会发出刺耳的声音,从而判断出是mic1和mic2。

问题2:用了 mic1 和 mic2,实际的录音是取的哪个mic的数据?是哪个mic声音大取哪个?还是合一起了?还是我们这边软件自己选取的?

答:通过音源离mic远近进行播放,听左右喇叭播出的声音有啥不同,如果是合成的,那两个喇叭播出来的声音应该是一样的,实际上并不是,而是 mic1 和 mic2 对应喇叭的左右声道。

问题3:手册上说PDM支持8路录音是什么意思?因为这里只有6个麦,对应只有6路才对,另外两路是干嘛的?

答:有可能另外两路是模拟mic,或者是其他输入源,如耳机。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RK3308--8声道改成双声道+录音增益 的相关文章

  • geometry_msgs::TransformStamped与geometry_msgs::PoseStamped消息互转

    geometry msgs TransformStamped与geometry msgs PoseStamped消息互转 下面是一个将geometry msgs TransformStamped转换为geometry msgs PoseSt
  • ros中获取小车当前位置

    ros中获取小车当前位置 一 tf2获取小车当前位置 xff1a include 34 tf2 ros transform listener h 34 include 34 tf2 ros buffer h 34 include 34 tf
  • 记一次被正点原子坑了的经历

    被正点原子坑 xff0c 不是买了他们的板子 xff0c 而是用了他们的一个Lwip的配置文件lwipopt h文件 xff0c 事情是这样的 xff0c 我现在开发的这个项目用lwip的库 xff0c 版本是1 4 1 xff0c 上手的
  • SecureCRT连接超时设置-The semaphore timeout period has expired

    设置 设置后就不会出现短时间没有操作连接超时的局面 xff0c 要求需要再次重连的问题 FR 徐海涛 xff08 hunk Xu xff09 QQ技术交流群 xff1a 386476712
  • CANoe-Trace-CAN Error

    CANoe软件CAN Error排查经验案例 系统模拟充电桩 xff0c 和实车车辆通过枪线连接 xff0c 启动充电流程 xff0c 在Trace界面看到CAN1有故障 xff0c CAN Error xff0c 并且是TxError 原
  • Makefile的使用

    Makefile规则 规则解析 一个简单的 Makefile 文件包含一系列的 规则 xff0c 样式如下 xff1a 目标 target 依赖 prerequiries lt tab gt 命令 command 目标 xff08 targ
  • STM32用一个定时器输出多路不同频率及占空比的PWM(输出比较模式)

    我们使用STM32输出PWM时会使用定时器的PWM输出模式来进行生成 xff0c 但是这样子生成PWM是有局限的 xff0c 它只能生成四路频率相同的PWM xff0c 当你设定了TIMx PSC xff08 预分频寄存器 xff09 和T
  • 虚拟机的安装与开发环境的配置

    前言 最近开始接触嵌入式 xff0c 之前也就学过C语言 xff0c 但是都是是非常基础的一些知识 知识最高峰的时期就是为了过国家计算机二级C 而一通猛学 下面就放入我最近学习笔记的内容 一 Linux开发环境的搭建 下载VirtualBo
  • C语言:基础知识

    基础C语言 基本知识 如何在虚拟机上写代码 1 打开终端 xff08 Ctrl xff0b Alt xff0b t xff09 xff0c mkdir day01 创建目录 cd 目录名 2 vim file c xff0c 进入vim文本
  • 详解scanf、gets、getchar和getch 使用及其原理。

    scanf gets getchar和getch 使用及其原理 一 说在最前 xff1a 回车及换行 概念 在计算机还没有出现之前 xff0c 有一种叫做电传打字机 在电传打字机打字时 xff0c 在每行后面加两个表示结束的字符 xff0c
  • 小项目:学生成绩管理系统

    学生成绩管理系统 前言 xff1a 此项目不具有商业价值 xff0c 旨在总结C语言所学知识点及各知识点在项目中的运用 xff0c 主要锻炼编码能力 xff0c 程序设计能力 xff0c 对业务逻辑的理解能力 文章目录 学生成绩管理系统系统
  • C语言:指针学习以及理解

    C语言 xff1a 关于指针学习以及理解 文章目录 C语言 xff1a 关于指针学习以及理解一 什么是指针二 为什么使用指针 什么情况下使用指针三 如何使用指针四 使用指针要注意的问题五 指针与数组的关系六 指针的运算七 指针与const配
  • 二叉树的性质及计算式

    二叉树的性质 1 一般二叉树的性质 2 完全二叉树的性质 3 满二叉树性质
  • 消息队列函数(msgget、msgctl、msgsnd、msgrcv)详细说明

    消息队列函数由msgget msgctl msgsnd msgrcv四个函数组成 下面的表格列出了这四个函数的函数原型及其具体说明 1 msgget函数原型 msgget 得到消息队列标识符或创建一个消息队列对象 所需头文件 include
  • 什么是C++

    什么是C 43 43 C 43 43 是一种使用广泛的计算机程序设计语言 它是一种通用程序设计语言 xff0c 支持多重编程模式 xff0c 例如过程化程序设计 数据抽象 面向对象程序设计 泛型程序设计和设计模式等 比雅尼 斯特劳斯特鲁普博
  • 小项目:网络版ATM(C)

    网络版ATM 设计结构体 span class token macro property span class token directive keyword ifndef span STRUCT H span span class tok
  • c++中 new的使用方法

    c 43 43 中 xff0c new的用法很灵活 xff0c 这里进行了简单的总结 1 new 分配这种类型的一个大小的内存空间 并以括号中的值来初始化这个变量 2 new 分配这种类型的n个大小的内存空间 并用默认构造函数来初始化这些变
  • C中表达式、语句、代码块

    表达式 Expression 表达式 61 运算符 43 操作数 表达式必须有一个执行结果 xff0c 这个结果必须是一个值 xff0c 例如 3 4 43 5 的结果 17 xff0c a 61 c 61 d 61 10 的结果是 10
  • #ifndef #define #endif 防止头文件被重复引用

    想必很多人都看过 头文件中的 ifndef define endif 防止该头文件被重复引用 但是是否能理解 被重复引用 是什么意思 是不能在不同的两个文件中使用include来包含这个头文件吗 xff1f 如果头文件被重复引用了 xff0
  • C/C++报错:全局变量重定义或是多次定义

    很多人可能直接把全局变量写进 h文件 xff0c 然后用多个文件包含这个头文件 xff0c 编译时就会报错 xff1a 变量重定义 头文件的作用就是要给外部提供接口使用的 xff0c 所以请记住 xff0c 只在 h中做声明 xff0c 在

随机推荐

  • 字符串查找函数:strchr、strrchr、strchrnul、strstr、strrstr

    strchr char strchr const char str int ch 功能 xff1a 寻找字符串中某字符第一次出现的位置 参数 str 要查找的字符串或字符串指针 ch 要查找的字符 返回值 成功返回一个指向在字符串str中第
  • PX4 代码中 position_estimator_inav(互补滤波)理解

    Local position estimator 为卡尔曼滤波估计 position estimator inav 需要解决三个问题 xff1a 如何由加速度进行速度和位置估计 xff1b 加速度偏差的计算 xff1b 如何使用融合过程 借
  • ArduPilot-sitl仿真-Mission Planner联合显示

    ArduPilot sitl仿真 Mission Planner联合显示 To start the simulator first change directory to the vehicle directory For example
  • Ros_PX4_Mavros从零入门--哪些坑

    写在前面的话 xff1a 一定要确保mavros安装成功 我在安装mavros的时候采用的是官网默认的安装方式 xff0c 期间一定有Error出现 xff0c 没有成功 xff0c 导致后面需要补充安装一些东西 验证是否安装成功 xff0
  • PX4-mavros之Roslaunch使用 及流程介绍

    首先在Ros工程目录src下 xff0c 创建新的功能包 使用命令 catkin create pkg px4 launch 注意此处不需要添加任何依赖了 然后建立一个launch文件夹 xff0c 如下图所示 2 改写launch文件即可
  • 聊一聊那些应该了解的大佬(飞控,人工智能方向)

    写在前面的话 xff1a 以下内容与图片大多来自于网络 xff0c 如有侵权 xff0c 请告知我进行修改 部分评论仅为个人观点 xff0c 无人机方面大牛很多 xff0c 无法一一评说 xff0c 在此随意发挥 也欢迎各位看官补充完善 R
  • ArduPilot+mavros+gazebo+QGC联合仿真初体验

    首先给出最终效果图 xff1a 实现内容与PX4官网代码功能类似 xff0c 四旋翼飞机自动起飞至2 5m高度 xff0c 悬停一定时间 xff0c 然后自主降落 记录如下几个需要注意的地方 xff1a 一共使用到三个文件夹 xff0c 其
  • ArduPilot姿态控制方法解析---(倾转分离)

    先给出一些预备知识 xff1a 欧拉角 xff1a 即所谓的Roll Pitch Yaw 而事实上 xff0c 根据其定义 xff0c 欧拉角的具有不同的表示 存在先绕哪个轴 xff0c 后绕哪个轴转的差别 xff08 将旋转分解成绕三个轴
  • C中main函数解析

    参考链接 main函数不同写法 以下为main函数的6种不同写法 xff1a span class token function main span span class token punctuation span span class
  • ArduPilot姿态环控制-----传感器初始化

    参考链接 xff1a https blog csdn net lixiaoweimashixiao article details 80540295 首先我们假定从void AP Vehicle setup 开始 xff0c 这里是飞控所有
  • ArduPilot飞行前检查——PreArm解析

    ArduPilot飞行前检查 主要包括两个部分 1 初始化中遥控器输入检查 xff1b 2 1Hz解锁前检查 附 xff1a 显示地面站信息 参考文章 xff1a Ardupilot Pre Arm安全检查程序分析 1 初始化中遥控器输入检
  • ROS_PX4_gazebo学习记录

    在官方程序上 xff08 PX4 wiki上为offboard起飞到2m高度 xff09 进行更改 xff0c 实现首先起飞到固定点 xff08 x 61 1 y 61 2 z 61 5 然后按照给定角度飞行 补充 xff1a 最终实现效果
  • Rospy初次使用记录-定点飞行

    由于接触到pytorch xff0c 所以用python完成与ROS的通信 xff0c 下面例子为从程序中摘出来的一部分 xff0c 用到了ROS消息的订阅与发布 xff0c 服务的通信 xff0c 可以作为参考使用 xff1a span
  • 四旋翼飞行器数学模型

    最近接触到四旋翼无人机的位置控制方法 xff0c 就又了解了一下四旋翼飞机的数学模型 xff0c 现总结如下 xff1a 位置环 xff08 均定义在惯性坐标系下 xff09 P
  • 基于ROS与optitrack的四旋翼飞机开发流程

    本文将一些注意点记录下来 xff0c 适合于开发调试 xff1a 目前只是分段调试通了 xff0c 带后续联合开发的时候在来补充还有没有什么注意点 xff08 过程也算麻烦 xff0c 也算不麻烦 xff09 xff1b xff32 xff
  • ROS_调试(三) 打印输出

    ROS INFO 采用类似C语言的形式 ROS DEBUG ROS DEBUG STREAM 采用类似C 43 43 语言的形式打印 ROS DEBUG STREAM NAMED ROS DEBUG STREAM THROTTLE NAME
  • px4调试bug--添加mavlink_log_info信息

    写在前面的话 有一阵子没有看px4的代码了 由于项目和论文的需要 又要接触这个 其中又遇到一些新的问题 找到了一些新的解决方法 故在此记录一下 总是在几种飞控代码之间跳来跳去 没有认真研究一个 有点遗憾 PX4的代码调试还没有找到什么好的方
  • APM,PX4之开源协议

    APM代码设计的是GPLv3协议 xff0c PX4代码采用的是BSD协议 从上图可以看出 xff0c ardupilot的代码是允许别人修改 xff0c 但是修改之后必须开源且采用相同的许可证书 而PX4代码则是允许别人修改 xff0c
  • C语言实现mavlink库与px4通信仿真

    参照网址 http mavlink io en mavgen c 首先从github上下载对应的C uart interface example 对应的github仓库网址为https github com mavlink c uart i
  • RK3308--8声道改成双声道+录音增益

    改为双声道 修改dts文件 相关路径 xff1a Y hxy RK3308 sdk 1 5 kernel arch arm64 boot dts rockchipY hxy RK3308 sdk 1 5 kernel Documentati