CSR8670项目实战:BlueHeartSound2电子心音计
Posted NiceBT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSR8670项目实战:BlueHeartSound2电子心音计相关的知识,希望对你有一定的参考价值。
为了让CSR867x的开发更容易,现与思度科技联合推出CSR867x学习板【思度科技CSR开发板】。
技术交流QQ群号:743434463
开发板会员QQ群号:725398389(凭订单号入群,赠PPT、项目源码、视频教程)
——————————正文分割线———————————–
1. 引言
在BlueHeartSound蓝牙听诊器的基础上,增加了OLED显示屏、android APP实时录音、电池供电、软件滤波等功能。
2. 主要功能
- 支持心音采集,通过耳机输出
- 支持音量控制
- 支持android APP实时心音录制
- 支持OLED显示信息(电池电量、配对信息、滤波模式、当前心率)
系统框图如下:
3. 项目难点
项目的难点主要有两个。第一点是打通传感器输入到安卓手机的音频链路,第二点是滤波器的设计。
3.1 打通音频链路
先谈第一个难点。常规的思路是在手机和CSR8670之间建立SPP连接,传感器信号在压缩编码后通过SPP链路传送到手机端,在手机端将压缩后的数据解码成PCM格式并显示:
ADK4.3中新增的voice assistant功能提供了一个可复用的框架,示意图如下:
传感器的采集的数据首先经过sbc编码将码率压缩1/4,然后通过管道类型的流将数据搬运到VM层,再通过基于RFCOMM管道的GAIA协议将数据通过蓝牙连接发送给手机端的GAIA协议。
3.2. 滤波器设计
客户的需求是能够让传感器数据通过一组带通滤波器再由耳机输出。同时客户可以方便地修改滤波器的通带和阻带的截止频率,且阻带衰减大于12dB。
这里我们使用窗函数FIR滤波器来生成滤波器系数,matlab代码如下:
% 生成滤波器系数,16k采样频率,20Hz~500Hz带通,默认hamming窗,600阶
% [20 500] 16k 0.0025 = 20/8000, 0.0625 = 500/8000
command1 = 'b = fir1(600,[0.0025 0.0625]);';
eval(command1);
freqz(b,1);
生成的滤波器响应如下:
然后我们将fir滤波器系数保存成文件并include到CSR8670的kalimba DSP中编译。
- matlab生成dat文件:
% create data file for use in kalimba code
fid=fopen('fir_coefs_1.dat','w');
fprintf(fid,'// filter coefficients for use in my_second_dsp_app\\n');
fprintf(fid,'// created in matlab using : %s\\n',command1);
for i = 1:length(b-1)
fprintf(fid,'%12.9f',b(i));
if (i ~= length(b))
fprintf(fid,',\\n');
else
fprintf(fid,'\\n');
end
end
fclose(fid);
- 在dsp工程中编译:
.VAR/DMCIRC $user_code.fir_filter.filter_coefs_1[$FILTER_LENGTH] =
#include "fir_coefs_1.dat"
;
为了能在android APP和本地耳机端同时听到心音,需要修改dsp中的音频链路,示意图如下:
传感器的输入在经过FIR滤波后复制两份输出给2个Gain模块,这两个Gain模块可分别控制输出给耳机和手机APP的信号幅度。
4. 总结
后续改善的方向可以是降低sensor input的采样率,使得FIR的滤波器阶数可以减小一半。节省出的dsp资源可用来增强传感器输入信号的降噪处理以抑制噪声,同时增加本地心率检测功能。
以上是关于CSR8670项目实战:BlueHeartSound2电子心音计的主要内容,如果未能解决你的问题,请参考以下文章