尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LIS25BA骨传导拾音实战:TDM接口与振动信号处理全记录

LIS25BA骨传导拾音实战:TDM接口与振动信号处理全记录 去年调一块骨传导方案的板子被风噪折磨了一个星期。TWS耳机里那两颗MEMS麦克风在户外风一吹采集到的全是呼啸声语音完全提不出来。后来把骨传导拾音从麦克风换成了LIS25BA——一颗带TDM接口的低噪声、高带宽3轴数字输出加速度计问题才真正解决。这颗传感器跟普通加速度计完全不是一路货它本身就是为了拾取语音频段的振动而设计的接口直接走音频总线接法、驱动、数据处理的思路都得换一套。这篇应用笔记就是把我在LIS25BA上从选型、贴片、调时序、配寄存器到跑算法的全过程做一个记录适合正在评估这颗料或者想做骨传导拾音、结构振动监测的工程师参考。1. 为什么LIS25BA会在骨传导拾音场景里杀出来1.1 它跟普通加速度计最大的差别先看参数差在哪。普通消费级加速度计比如手机里用的那种输出数据率一般几百赫兹带宽即便放开也就几百Hz噪声密度通常几百μg/√Hz起步。这类传感器做倾角、计步、抬手亮屏完全够用但拿来采集语音振动是没法用的——语音信号的能量范围大约在100Hz到4kHz大部分普通加速度计的高频段早就衰减没了。LIS25BA的参数是另一个量级输出数据率能到26.7kHz量级频率响应主要覆盖到几kHz三轴噪声密度标称在75μg/√Hz这个级别量程±3.85g接口直接给TDM兼容I2S时序。这意味着它能把语音频段内骨骼、皮肤、组织的振动完整采下来而且信噪比够高不至于让后续的语音增强算法在噪声底里捞信号。我经常跟人打的一个比方普通加速度计像是用拍立得拍视频能拍但帧率不够动起来全是拖影LIS25BA相当于是正经的摄像机帧率够、快门够、底噪干净才有资格做“振动视频”的源信号。选型之前先问自己一个问题——我要拾取的振动信号最高到多少Hz如果答案超过1kHz普通加速度计就直接出局。1.2 低噪声这三个字为什么值钱很多人选加速度计只看带宽忽略了噪声密度。噪声密度这个参数要结合带宽来看总噪声约等于噪声密度乘以带宽的平方根。以75μg/√Hz为例假设后端使用4kHz带宽那RMS噪声大概是75×√4000 ≈ 4.7mg。这是什么概念在骨传导拾音里说话时皮肤表面的振动幅度大约在几十mg到几百mg级别4.7mg RMS的底噪不会完全盖住语音但已经是需要认真对待的水平。如果换成一款噪声密度300μg/√Hz的普通加速度计同样4kHz带宽下RMS噪声会到19mg左右这底噪比一部分轻声说话时的信号还大后端就算用再强的降噪算法也救不回来。所以“低噪声”不是纸面参数好看它直接决定了系统能拾到的最小语音信号有多小决定了整机在安静环境下播放给对方的底噪有多高。还有一点容易被忽略LIS25BA这种数字输出的传感器噪声是完整的模拟链数字链综合结果。用模拟输出加速度计外部ADC的方案PCB走线、参考电压、ADC位数、抗混叠滤波全部要自己扛任何一个环节做得不到位实际噪声会比数据手册标称值差很多。LIS25BA把整个信号链封装在芯片内部TDM直接输出数字码流只要电源纹波控制好噪声指标基本就是手册值省心太多。1.3 为什么是TDM而不是SPI/I2C传统传感器用I2C或SPI跟MCU通信读一个轴的数据要发命令、等响应哪怕I2C跑到1MHz在几十kHz的数据率下也非常紧张更别提要跟音频数据流保持严格同步。LIS25BA给出的方案是TDM——直接把三轴数据按时隙挂在音频总线上跟codec共用BCLK和WSMCU只需配置DMA按时隙把数据搬进内存即可。TDM最核心的价值是同步。骨传导振动信号采下来之后要跟麦克风信号做时域的融合和滤波两个数据流必须是同一个时钟域里对齐的。用I2C采加速度计、用I2S采麦克风两边各自有各自的时间基准软件打时间戳也只能做到毫秒级同步相位差根本补不齐。TDM方案让加速度计和麦克风在硬件上就共享同一个时钟数据帧天然对齐这是后续算法能跑起来的前提。2. TDM接口细节多声道时序到底怎么对2.1 TDM总线的“站点”思想TDM的原理可以理解成一条数据单行线上按时间片轮流传送不同通道的数据。每个时间片叫一个slotslot的数量、每个slot的位宽、数据在哪条边沿翻转这些参数由主控制器统一决定所有挂在总线上的从设备都必须按同一套规则收发。拿LIS25BA挂在音频总线上举例一个典型的TDM帧可能长这样帧同步信号WS先给出一个脉冲或电平跳变表示一帧开始然后BCLK连续翻转每个BCLK周期对应一位数据主控跟声卡约定好slot0放左声道、slot1放右声道、slot2放X轴、slot3放Y轴、slot4放Z轴如此循环。只要每个设备都清楚自己在帧里的位置数据线只有一根也完全不会乱。相比之下I2S只是TDM的一种特例——固定两声道左/右数据在WS电平的左右两个区间分别传输。如果你的主控外设只有I2S而不支持真正的TDM那就要仔细确认I2S模式和LIS25BA的slot配置能不能匹配上。我自己的经验是能开TDM尽量开TDM模式硬用I2S去兼容有时候会丢掉多余slot或者错位。2.2 主设备读取和从设备准备好数据都在BCLK上升沿吗这个问题是被问得最多的因为几乎所有I2S/TDM新手都会在这上面栽一次。先说结论不全是也不能靠猜每种器件都有自己的时序要求必须查数据手册的时序图和AC特性参数表。业界常见的I2S标准Philips协议下发送端是在BCLK的下降沿更新数据位接收端在BCLK的上升沿采样数据位。这样做的好处是数据在边沿之间有半个周期的稳定时间不容易采错。但LIS25BA的TDM模式为了提高灵活性一般会提供时钟极性配置位允许开发者选择数据是在BCLK上升沿还是下降沿翻转。如果主控采样沿和传感器数据翻转沿配置在同一个边沿DMA搬进内存的数据就会有一bit的偏移表现就是数据值翻倍或者完全错乱。我在调试LIS25BA时遇到过一次典型的时序问题数据手册时序图上从设备在BCLK下降沿更新数据但主控我当时配的是“采样沿上升沿”两边正好是一对按理说没问题。结果用逻辑分析仪抓出来的波形X轴数据总是比Y/Z轴超前一个slot发现问题是slot间隔里多了一位空闲位等于每个数据都跟在中间位置的“空挡”后面被整体推后了一个BCLK周期。后来把主控TDM模式里slot与slot之间的位间隔清零数据才对齐。如果你手里有示波器或者逻辑分析仪建议不要省这一步把BCLK、WS、DATA三条线同时抓下来放大看第一个有效bit相对WS边沿的位置再跟手册时序图做比对。数据手册上会标出tSU建立时间、tHO保持时间和时钟沿的口诀照着配置比盲目试寄存器快得多。没有仪器的话也有一个土办法把传感器静止放平读三轴数据看静止值是否符合预期。如果Z轴接近1g、X/Y接近0g说明数据基本对齐如果三轴静止读数全部异常偏大或者乱跳十有八九是时序沿配反或者slot错位。2.3 与主控DMA配合的注意点TDM模式下数据是连续不断的码流靠CPU中断逐字节读不现实必须配合DMA。这里有几个坑值得提前说第一DMA的缓冲区大小要设置成帧的整数倍最好是三轴的整数倍否则DMA搬运的起始位置可能在帧中间取数据时间步就乱了第二24bit数据在主控端往往存放在32bit容器里要确认是左对齐还是右对齐第三先让DMA跑起来但最开始几帧数据不要用。因为上电后传感器可能还没完全锁定BCLK和WS的相位前几帧会出现错位直接在应用里丢弃几十帧是稳妥的做法。我实际调试LIS25BA时还遇到过一个不算问题但很容易忽略的细节TDM的slot长度选择。传感器输出可能是16bit或24bit有效位对应的slot位宽要跟主控配置一致。如果把24bit数据放进16bit的slot里数据会被截断反过来如果slot比数据长不用的低位会被填充0还是符号扩展取决于寄存器配置和主控端的设置。这个一定要两边对齐不能用默认值想当然。3. 从零配置LIS25BA寄存器流程与常见错误3.1 上电初始化顺序LIS25BA的初始化虽然不像MCU那么复杂但顺序还是有讲究的。基本的流程是给传感器供电等待电源稳定一般几个毫秒。发送软件复位命令让芯片回到已知状态。等待BOOT完成。这一步经常被跳过读寄存器时拿到全0或者全0xFF还以为是芯片坏了。配置TDM相关参数slot映射、slot位宽、数据位宽、时钟极性。配置传感器本身的ODR、量程如果寄存器里有对应位。使能数据输出。等待一小段稳定时间丢弃前N帧数据然后开始正常读取。这七步里最容易出问题的在第3、4、7步。BOOT完成一定要轮询状态位不能单纯delay了事因为不同供电电压、不同退耦电容下BOOT时间会有差异。TDM映射要先想清楚再配置不能今天用X/Y/Z顺序明天改成Z/Y/X算法那边的数据解析也要同步改。3.2 关键寄存器的配置思路LIS25BA寄存器字段比较多这里不逐一抄手册只讲功能模块和配置思路。TDM配置部分重点看几类位slot长度常见16bit或24bit一定要跟主控侧对齐。数据位宽选24bit时动态范围更大适合骨传导这种信号动态范围较大的场景选16bit时传输压力小但会对噪声底有一点影响。声道映射X/Y/Z三轴分别放在哪个slot顺序可配。时钟极性决定数据在BCLK哪个沿翻转对应前面讲的时序问题。传感器核心配置部分主要关注ODR和量程。ODR决定采样率上限因为奈奎斯特定理有效信号频率最多到ODR一半。LIS25BA面向音频应用ODR设得足够高时4kHz以内的语音信号都不需要担心混叠。量程方面骨传导振动信号通常不会很大±3.85g的量程已经非常充裕量程太大反而会降低小信号分辨率不要随意放大。下面是一段C语言伪代码展示初始化流程的基本结构。寄存器名和位名是示意性的具体要查对应型号的数据手册#include stdint.h // 伪代码寄存器地址和位掩码以数据手册为准 #define LIS25BA_REG_CTRL1 0x20 #define LIS25BA_REG_STATUS 0x27 #define LIS25BA_REG_TDM_CFG 0x33 #define LIS25BA_REG_CTRL2 0x21 void spi_write(uint8_t reg, uint8_t val); uint8_t spi_read(uint8_t reg); void lis25ba_init(void) { uint8_t status; // 1. 软件复位 spi_write(LIS25BA_REG_CTRL1, 0x01); // 2. 等待BOOT完成轮询状态位 do { status spi_read(LIS25BA_REG_STATUS); } while ((status 0x01) 0); // 3. 配置TDMslot长度24bitX/Y/Z映射到slot0-2极性与主控一致 spi_write(LIS25BA_REG_TDM_CFG, 0x00); // 这里的0x00只是占位实际请按手册填写每一位 // 4. 配置量程和ODR spi_write(LIS25BA_REG_CTRL2, 0x40); // 同上0x40只是示意 // 5. 使能数据输出 spi_write(LIS25BA_REG_CTRL1, 0x80); // 6. 等待稳定丢弃前N帧 for (int i 0; i 50; i) { // 在DMA模式里这里就是空转等待若干帧或者直接让DMA搬完一轮后清缓冲 } }3.3 我踩过的几个坑实际调试过程中我踩过几个值得写出来供大家避坑的典型问题。第一个是配置顺序导致的数据毛刺。最开始我先把数据输出使能了再回头去配置TDM的slot映射结果DMA收到的前几百帧里偶尔会冒出一帧X/Y/Z轴数据对调的情况。原因其实不难理解TDM映射寄存器在数据流运行中被改写从设备可能在一个帧的中间读取了新的映射配置导致半帧旧映射、半帧新映射。解决办法很简单所有TDM配置必须在使能输出之前完成如果运行时确实要调整先关输出再改配置再开输出。第二个是LIS25BA跟codec共用时钟时BCLK频率不要想当然。某个方案里主控已经把BCLK固定在2.048MHz但LIS25BA在TDM模式下要求每个slot的位宽和slot数乘积刚好填满一帧。2.048MHz、48kHz采样率下一帧有大约42.67个BCLK周期这个值不是整数最后就会有周期性的帧错位。后来我把BCLK改成3.072MHz对应每帧64个BCLK所有slot正好填满问题消失。所以画原理图之前先算好BCLK频率、采样率、slot数、slot位宽的乘积关系不要在调试阶段才发现时间步对不上。第三个是数据字节序。24bit的三轴数据在主控端读取时有人按小端解有人按大端解还有人直接左对齐到32bit容器的高24位。这三个选择一旦错了表现就是静止时数据在小范围抖动但数值量级完全不对很多时候不是传感器的问题而是自己数据解析那边字节序搞反了。可以先放一个已知的1g重力场让Z轴朝下打印原始十六进制对照手册里的数据格式手动验算一遍就能立刻定位。4. 数据处理链路从三轴原始数据到可用振动信号4.1 从TDM码流里把三轴数据拆出来LIS25BA通过TDM连续输出X/Y/Z三轴数据DMA搬到内存后本质上是一个线性数组。假设每个轴的数据占24bit存储在主控时占用4字节32bit容器那么每12字节为一组三轴数据。用指针去取数时按12字节步长跳动每次连续读3个32bit容器分别就是X、Y、Z。注意绝对不要在主循环里用memcpy逐字节拷贝来拆数据数据率一高CPU开销扛不住。正确的做法是定一个结构体指针直接强转成三轴数据结构体或者用DMA双缓冲在数据到达中断里只做一个指针切换应用层再去消费已经填满的缓冲区。让CPU在音频码流场景里逐字节搬数据迟早会丢帧。4.2 让信号“干净”起来滤波和去直流LIS25BA原始数据直接拿来做振动检测会有一个明显问题静止时输出不是0g而是1g左右的重力分量。这不是传感器坏了而是加速度计的原理决定的——它测的是加速度重力也是一种加速度。如果直接做FFT或者计算RMS这个直流偏置会把整个分析带偏。所以在数据分析之前必然要加一个高通滤波器把低频的重力分量和走路、佩戴晃动等运动干扰滤掉。以语音骨传导为例高通截止频率设在50Hz~100Hz比较合适如果是水管泄漏检测可以根据实际环境噪声适当调整一般从100Hz开始分析。高通滤波最简单的实现是一阶IIRy[n] α * (y[n-1] x[n] - x[n-1])其中α 1 / (1 2 * π * fc * T)fc是截止频率T是采样周期。这个滤波器计算量极小在MCU上也是几乎零成本。对很多场景来说一个高通就能解决大部分问题如果需要提取特定频段的能量比如泄漏检测只需要几百Hz到几kHz可以再串一个低通或者直接做带通。低通滤波器的选择要格外小心IIR虽然效率高但相位非线性在某些算法场景下会带来问题。如果后端要做多通道的时域相关分析比如用两路传感器做泄漏定位最好用FIR群延迟恒定时间差计算才准。4.3 骨传导场景我到底该用哪一轴LIS25BA是三轴的但骨传导拾音并不是三轴数据都值得用。人佩戴TWS耳机时传感器贴在耳道或耳廓附近的皮肤表面头部骨骼在说话时的主要振动方向大致垂直于皮肤表面。贴近皮肤的那根轴通常贴装后是Z轴振动幅度最大语音信息最丰富另外两个轴更多是佩戴松动、咀嚼、走路带来的机械干扰。我在实际调试时做过对比实验静止佩戴让测试者说话同时记录三轴时域波形和频谱。Z轴的语音能量明显高于X/Y轴X/Y轴的波形里混着明显的低频运动伪迹。最后算法里只用了Z轴做主拾音通道X/Y轴用来做干扰检测——比如检测到X/Y轴有大能量而无Z轴语音时判断为佩戴者在摇头或走路这时候可以适当降低骨传导通路的增益避免把摩擦声放大。不过这个经验是基于“垂直贴装”的假设。如果你的结构设计里LIS25BA是侧着装、斜着装坐标系旋转了那“语音最丰富的那根轴”也要跟着变。我的建议是贴装方案定了之后先做一个简单的录音实验把三轴分别做频谱分析看在预期的语音频段里哪根轴的谱线最丰富再决定软件里用哪个轴。4.4 泄漏检测场景三轴都不能省跟骨传导场景相反塑料水管泄漏振动检测里三轴数据都有用。因为泄漏点在管道上的位置、传感器贴装的方向不确定泄漏激发的振动可能沿管壁径向、轴向同时传播三根轴的耦合程度跟安装位置直接相关。只盯着一根轴可能刚好那根轴垂直于振动传播方向信号幅度很小误判成无泄漏。做法是把三轴分别做带通滤波、计算短时能量然后合并成一个综合指标——可以是三轴RMS的平方和开根号也可以按每一轴在特征频段的能量做加权求和权值根据现场标定得到。这套思路本质上是把三轴当作三个空间方向上的传感器阵列信息融合的收益非常明显。5. 两个落地场景TWS骨传导增强与水管泄漏检测5.1 TWS耳机骨传导拾音的技术闭环LIS25BA在TWS耳机里的典型用法是作为骨传导传感器跟两颗空气传导麦克风配合。原理很简单空气传导麦克风在嘈杂环境里拾到的语音和噪声混在一起而骨传导传感器贴在皮肤上通过骨骼和组织传播的语音信号不受空气噪声影响相当于一条“纯净”的语音通道。但是骨传导信号真正用起来有几个细节。第一骨传导信号的频响跟空气传导不一样通常低频响应更好、高频衰减明显不能直接拿来做语音识别要跟麦克风信号做频域融合把高频细节从麦克风补回来。第二佩戴松紧会影响耦合传感器从皮肤上收到的振动幅度差异可能达到6dB以上算法要考虑增益自适应。第三走路、咀嚼、触摸耳机时产生的机械噪声也通过骨骼传进来需要检测和抑制。这三类问题都不是单靠传感器能解决的需要算法链路的配合。我在调试时做的第一版算法非常简单粗暴Z轴高通后用短时能量估算语音是否存在存在语音时把骨传导信号和麦克风信号做线性融合权重偏重骨传导没有语音时全部信任骨传导。就这么简单的规则在60dB噪声环境里语音可懂度已经明显优于单麦克风。后期再迭代做自适应滤波、风噪检测体验差距会进一步拉开。5.2 塑料水管泄漏振动检测的实施方案基于三轴加速度计的管道泄漏检测是LIS25BA在工业监测方向一个非常典型的应用。塑料水管在泄漏时高压水流从裂缝喷出在管壁激发弹性波。这个弹性波的频率成分、传播速度跟管材、管径、水压、泄漏口形状都有关系不能一概而论但塑料管泄漏信号的集中频段通常在几百Hz到几千Hz正好落在LIS25BA高带宽能力的覆盖范围内。实施方案上传感器通过磁吸座、卡箍或环氧树脂胶粘贴在管道外壁或阀门上采集三轴振动信号。贴装方式直接影响耦合效果磁吸座装卸方便但高频响应差一些胶粘耦合最好但维护不便。采样率建议不低于8kHz因为要看的是几kHz内的信号。数据经过高通去重力和带通提取泄漏特征频段滤波后计算短时能量或RMS值跟无泄漏时的基线做对比超过阈值就判定为疑似泄漏。如果是多传感器方案还可以利用泄漏信号到达两个传感器的时间差做定位。这时两个LIS25BA共用同一个BCLK时钟就非常方便时间对齐精度高定位误差主要取决于采样率和TDM帧同步精度。下表是我在几种常见管材上做测试时总结的参考频段具体数值要结合现场标定但可以作为初筛范围管材类型泄漏信号主要频段推荐采样率贴装方式PVC塑料管800Hz~3kHz≥8kHz环氧胶粘PE塑料管500Hz~2kHz≥8kHz卡箍胶垫金属管1kHz~5kHz≥16kHz磁吸座复合管600Hz~2.5kHz≥8kHz胶粘/卡箍首版实现可以先不考虑自动定位把“有无泄漏”的模式跑通。在管段上人为制造一个可控泄漏点采集泄漏状态和非泄漏状态的振动数据用频域特征做门槛判决。实测下来LIS25BA在管道泄漏检测里比普通加速度计的优势非常明显——普通传感器带宽有限泄漏信号的很多特征谱线根本采不到而LIS25BA完整保留了这些信息后期不管是做经验阈值还是训练分类模型特征都更“富裕”。6. 调试经验与实测总结6.1 示波器抓TDM波形时最容易忽略的细节用示波器或逻辑分析仪抓LIS25BA的TDM时序建议把触发设置在WS边沿上然后让示波器显示整帧。重点看几件事WS从低到高或从高到低之后经过多少BCLK周期DATA线上出现第一个有效bit这个bit是在BCLK高电平期间稳定还是在低电平期间稳定slot之间有没有多余的空闲位。我曾经因为示波器探头的地线夹太长导致抓出来的信号振铃严重误以为LIS25BA数据不稳。换了短地弹簧之后波形干净得多了。这个小细节提醒大家抓高速数字时序时探头接地方式对信号完整性影响很大先排除测量手段的问题再下结论说传感器有问题。6.2 数据校验技巧怎么确认传感器和配置真的对了确认LIS25BA工作正常的最佳方法是“静止旋转”实验。把传感器静止放平看Z轴是否接近1g、X/Y轴是否接近0g。然后让传感器绕某一轴旋转90度对应轴的读数应该跟着变化。这个实验能快速验证三轴数据是否对齐、量程配置是否正确、数据解析是否有字节序错误。更进一步在已知频率下做敲击实验。用一个小的力锤或者螺丝刀柄轻轻敲击传感器安装位置然后在PC端对数据做FFT看频谱是否在敲击频段有明显能量。这能验证整个采集链路——从传感器、TDM总线、DMA搬运、到PC端解析——是否真正通畅。如果敲击时频谱没有任何峰值一定是链路里某个环节断了而不是传感器没输出。6.3 时序配置一句话经验最终负责地把时序这关过掉我的经验就一句话先抓波形再写驱动先跑轮询再上DMA先看静止值再谈算法。LIS25BA这颗料我前后在三个不同项目里用过TWS骨传导、管道泄漏监测、还有一次做电动牙刷的碰撞检测。每一次场景不同但踩坑的思路都差不多把时序、配置、数据解析、干扰排除这四个环节逐一确认它就能稳定地输出高质量的高带宽三轴振动数据。如果你也正在用这颗传感器做类似的项目希望这篇笔记能帮你少走我走过的弯路。
返回列表