52matlab技术网站,matlab教程,matlab安装教程,matlab下载

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 19499|回复: 0

基于移动终端麦克风的音频信号在健康方面的应用探索

[复制链接]

123

主题

207

帖子

2992

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2992
发表于 2021-12-16 01:07:03 | 显示全部楼层 |阅读模式
本帖最后由 matlab的旋律 于 2021-12-17 03:36 编辑

    前面介绍了基于移动终端麦克风的睡眠监测功能,本文试图通过移动终端采集的人体睡眠过程中产生的音频信号进行分析,从而实现人体异常情况筛查,如
  • 睡眠呼吸暂停综合征(SAS):是一种睡眠时候呼吸停止的睡眠障碍。最常见的原因是上呼吸道阻塞,经常以大声打鼾、身体抽动或手臂甩动结束。睡眠呼吸暂停伴有睡眠缺陷、白天打盹、疲劳,以及心动过缓或心律失常和脑电图觉醒状态);
  • 说梦话:通过朋友圈分享个人睡眠中的梦话等信息,具有一定的社交价值;
  • 环境噪声:卧室环境越安静,睡眠质量就会越好。即使累得在嘈杂的房间里睡着了,睡眠质量也会受到影响。可以根据监测噪声强度通过智能家居进行一定的干预。
如常见的睡眠监测系统包括人体音频信号的监测。

下面首先介绍一下音频信号基本参数的应用范围,具体包括:
  • 采样率 :8000Hz - 电话所用采样率, 对于人的说话已经足够
    11025Hz-AM调幅广播所用采样率
    22050Hz和24,000 Hz- FM调频广播所用采样率
    32000Hz - miniDV 数码视频camcorder、DAT(LP mode)所用采样率
    44100Hz - 音频 CD, 也常用于MPEG-1音频(VCD, SVCD, MP3)所用采样率
    47250Hz - 商用 PCM 录音机所用采样率
    48000Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
  • 声道数:声道数是音频传输的重要指标,现在主要有单声道和双声道之分。双声道又称为立体声,在硬件中要占两条线路,音质、音色好,但立体声数字化后所占空间比单声道多一倍。
  • 量化位数:量化位是对模拟音频信号的幅度轴进行数字化,它决定了模拟信号数字化以后的动态范围。由于计算机按字节运算,一般的量化位数为8位和16位。
  • 编码算法:编码的作用其一是采用一定的格式来记录数字数据,其二是采用一定的算法来压缩数字数据以减少存贮空间和提高传输效率,常见的音频编码有AAC、APTX、LDAC。
  • 存储格式:常用的格式.m4a、.pcm和 .wav。
通过上面参数的分析,可以得出比较适合人体相关的音频信号参数以及存储方法,具体如下:
  • 采样率 :8000Hz,可以识别人声和鼾声;
  • 声道数:单声道;
  • 量化位数:16位;
  • 编码算法:AAC编码;
  • 存储格式:.m4a格式,目前使用iphone采集1小时的数据文件大小为42.23MB,参数为采样率44100Hz,双声道,存储格式为.m4a。
对于需要进行实时监测的音频信号,如此设置的参数量
方法流程:
  • 先进行端点检测(常见的端点检测方法包括基于时频特征的双门限法、自相关函数法等);
  • 然后使用鼾声与语音信号的时频特征进行分类识别。
其中音频信号端点检测的效果如下图所示:

      不过这样的监测方法方法也存在缺点,虽然端点检测可以在下位机进行实时计算,但相关的传统实时分类目前还没有一个被行业认可的高精度算法,从零开始研究费时费力。
      常见实现语音信号分类识别的有基于机器学习和深度学习网络等方法。如在AudioSet 数据集上训练的YAMNet模型可以识别521种声音。通过长度25毫秒,步长为10毫秒,且具有周期性Hann时间窗的短时傅里叶变换计算出声谱图作为模型输入,然后使用YAMNet进行分类。其中YAMNet进行分类效果如图所示:
其中对应代码如下:
  1. [audioIn,fs] = audioread('shuohua.wav');%读取原始音频信号
  2. audioIn = audioIn(:,1);%只需要保留单声道
  3. [sounds,timeStamps] = classifySound(audioIn,fs);%分类,输出类别和对应的时间戳

  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. %绘制原始信号
  6. t = (0:numel(audioIn)-1)/fs;
  7. plot(t,audioIn)
  8. xlabel('Time (s)')
  9. axis([t(1),t(end),-1,1])
  10. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  11. textHeight = 1.1;
  12. for idx = 1:numel(sounds)%绘制对应类别的位置
  13.     patch([timeStamps(idx,1),timeStamps(idx,1),timeStamps(idx,2),timeStamps(idx,2)], ...
  14.         [-1,1,1,-1], [0.3010 0.7450 0.9330], 'FaceAlpha',0.2);
  15.     text(timeStamps(idx,1),textHeight+0.05*(-1)^idx,sounds(idx))
  16. end
复制代码
当然直接使用这种方法也存在明显的不足之处,就是计算量大,不宜在下位机进行实时运算。一种较好解决运算量较大的方法具体步骤如下:
第一步:通过端点检测法识别可能为信号的位置,并保存,同时计算噪声分贝数;
第二步:上传保存的信号到APP端;
第三步:对保存的信号进行分类,这一步包括两部分,短时傅里叶变换和输入迁移后的YAMNET分类;
第四步:应用。
具体流程图​如下所示:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|52matlab技术网站 ( 粤ICP备14005920号-5 )

GMT+8, 2024-3-28 23:33 , Processed in 0.098315 second(s), 21 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表