项目经历

项目一 :助听器性能优化项目

STM32F4系列芯片:最高180MHz主频,1M闪存,192KB的内存。现在 频率降低到12MHz,4.5ms,仍然有下降的可能。内存的话看编译器这里是64位的编译器,要计算全局变量,一个char是一个字节等等。int 4个字节,long8字节,数组最烦了。char*8字节指针类型存储的是所指向变量的地址,所以32位机器只需要32bit,而64位机器需要64bit。
项目描述:经过几代的硬件版本的优化,盒式助听器模型已经基本确定,并且在前任实验室师兄的努力下,助听器的代码也已经有了整体框架,并且能在硬件平台上得到一个比较好的助听效果。但是仍然存在啸叫、主频大、功耗大等不足需要改进。
项目任务:在已经能够基本实现声音放大及降噪处理的助听器上进行性能的完善,包括解决啸叫问题、降低主频、代码结构优化及声音质量的提高等。
项目角色:主要负责人之一
助听器技术的简介:

  1. 首先是硬件方面:
    声音先通过双麦克风阵列,然后通过硬件上的放大器进行放大,然后再给AD/DA芯片(WM8978语音芯片两路的AD通道),这个是16位的AD,也就是说分辨率是1/(216-1),如果是8位那么分辨率就是1/(28-1)也就是1/255了,如果电压是5V那么就是5V对应着255,0V对应着0,现在的16位意味着若参考电压是5V的话数模转换后的数就是:Vf*(5/(2^16-1))。这个是转换值那么还有一个值是AD采样率,一般助听器需要的或者说能接收到的声音频率不会超过8Khz,所以采样率就是16K。
    得到数字信号后(这就是已经是离散的了,变成了一个一个点了,后面就可以分针加窗了)然后再通过STM32F4进行信号的一系列处理:分帧加窗、AGC、FFT、啸叫抑制、维纳滤波、WDRC等。
    2、软件方面的介绍:
    有几点关于语音的知识点:1)关于分贝:分贝的定义就是功率的计量,dB=lg(pi/po),而P=I^2*R.电压、电流与功率是成平方的关系。所以如果是功率的话就是10为系数,如果是电压电流的话就是20为系数。2)人的听觉神经能识别的时间为100ms=0.1s。3)做256个点的FFT不够点的补上零。4)语音识别中常用的帧长为20ms-30ms,帧移为10ms。

VAD(Voice Activity Detection语音估计)-----AGC(自动增益控制)把太高的降低把太低的增高-----HAD(啸叫检测与抑制)-------前处理(分帧加窗补零–FFT(256)-- 平滑129至65个点 – )------- 维纳滤波(噪声抑制,在有语音的时候才有这个,没有语音的时候就不执行了)维纳滤波是核心算法---------将系数进行扩展反FFT回去还原就可以得到时域的数据了。然后就把当前帧送出去。

  • 1VAD:四帧的帧能都大于平均帧能的则为语音帧;连续15帧的帧能都小于平均帧能的就判为无声,平均帧能是测出来的。
  • 2AGC:利用线性放大和压缩放大的有效组合对助昕器的输出信号进行调整。当弱信号输入时,线性放大电路工作,保证输出信号的强度;当输入信号达到一定强度时,启动压缩放大电路,使输出幅度降低。自动增益控制(AGC)是输出限幅装置的一种,它利用线性放大和压缩放大的有效组合对助听器的输出信号进行调整。当弱信号输人时,线性放大电路工作,保证输出声信号的强度;当输人信号强度达到一定程度时,启动压缩放大线路,使声输出幅度降低。满足了一些听觉动态范围较窄的聋人的需要。也就是说,AGC功能可以通过改变输人输出压缩比例自动控制增益的幅度,扩大了助听器的使用范围。
  • 3HAD:计算帧间的相关性,根据规律来说,啸叫一般发生在1500Hz以上,而且啸叫是由于耳机播放出来的声音重新进入麦克风形成正反馈,然后就一直增大就会产生很尖锐的声音,啸叫之间的相关性很高,而语音的相关性会比较低一些。而且在低频段是不会产生啸叫的。所以利用相关性和信号的频段位置关系就可以区分开语音和啸叫了。在这里我们做了大量的实验,在PC端打印音频信号的各项指标数值找到规律,把语音和啸叫完全分开。
  • 下面就是相关系数的公式在这里插入图片描述
  • 一开始选择最简单的方法就是移频法去啸叫,我们还尝试做了移频操作,曾经试过256点(8000/256=31.25Hz)、512点(15.6Hz)、1024点(7.8Hz)、2048点(运算量太大)的FFT。移动3到8Hz不会对声音产生影响,但是抑制啸叫的效果不明显。但是经过试验发现如果移动的频率大了,是明显降低啸叫了但是声音却破坏了。找不到一个平衡点。最好的效果就是1024个点但是达不到要求,啸叫还是很明显。
  • 第二个尝试的方法查阅文献了解到有一篇论文的实现,有两个特征来判断。是在频域上,通过计算子带幅度占全部子带幅度的的比率(去掉直流0点和128点),因为啸叫的幅度一般都很大,占的比重大一些,还有一个特性就是相位(matlab有直接求相角的函数),啸叫的相位应该差别不大但是在matlab上实验的时候发现相位并没有什么很大的用处。然而在仿真上幅度占比是有用的,但是移植到板子上结果不是很好,因为语音有时候也会有能量特别高的时候想送气的音P,所以在只有一个条件的情况下是不可以的。
  • 最开始是马敏师姐做了回声消除(做一堆的噪声估计还要估计延迟等等,不适合板子上复杂的环境),在PC上是可以的,但是如果移植到板子上的话运算量太大了。

现在开始讲整个的过程:数据进来之后缓存三帧,每帧是80个点,5ms为什么是80个点呢?因为信号最高是 8K,然后采样率是16K,1/16 *80=5ms。然后加窗以最后一帧为中心,从前面帧取88个点,后面再补88个零总共256个点,然后做FFT。FFT是对称的,取0-128点就好了,做完FFT然后做平滑,每相邻两点相加然后除2,剩下65个点。然后就做维纳滤波了,为什么维纳滤波是65个点呢?因为为了减少运算量。

啸叫抑制

用到了三个特征:
1、 相关性 这个用处是最大的,效果最好的
2、 位置 800hz以下肯定是没有啸叫的
在这里插入图片描述
800Hz的波长=340/800=0.425m,这个波长已经很长了,是形成不了反馈的。
3、 幅度占比 啸叫的占比会大一些。

降低主频

即减少运算量:1、 在程序中的公式用STM32F4的固件库函数代替:如开方、平方、最大值、最小值、累加、累乘、卷积等等。
2、 傅里叶变换和反傅里叶变换是最花运算量的,总共用了6M,所以就把傅里叶变换中的浮点数运算改成整数运算,后续的算法还是使用浮点数运算。这里遇到了一个很诡异的事情,定点运算反而比浮点运算运算量大了。

代码结构的优化

1、 缓存几帧的调整,一帧移多少个点的调整,(为了减少时间的考虑,后面的FFT要分帧补零,处理完一帧要往前移动两帧所以要看时间的延迟防止掉帧)
2、 调整顺序,FFT只做一次,已经做过的函数尽量复用,FFT的数据用了三次
**3、**先做VAD声音活动检测,AGC,HAD,维纳然后逆FFT回去

声音质量的优化----瞬噪问题是对于维纳滤波中的卷积滤波器的系数的修正。

解决瞬噪问题:瞬噪就是突然产生很大的尖锐的声音的时候如果被助听器放大了的话会让人更加的不舒服。检测帧间增加或者下降的幅度,在相邻的几帧内用一个线性函数修正。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值