前记
扩声系统为人们的日常文化活动带来很多便捷。但是,声反馈现象作为扩声系统中不可避免的问题,不断产生再生混响,对音频数据的传输造成一定程度的影响,严重时,会引起啸叫现象。尖锐刺耳的啸叫现象会导致音频信号失真,影响听觉效果。
抑制啸叫的方法有很多种,如移频、自适应反馈抑制、陷波等。由于在所有的抑制方法中,移频是一个常用的并且相对简单的方法,最近由于实际的项目需要,笔者就针对移频的算法做了一些深入的研究。
移频原理
利用升高或降低输入音频信号的频率成分来破坏啸叫产生条件的方法,改变了频率的输出信号再次进入系统不会和原始信号频率叠加,达到抑制啸叫。具体实现方法是将反馈信号进行频移过后叠加到输入信号上,再通过扩音器路径播放出来,然后通过声场反馈路径传递回去,再做频移和叠加,如此循环。具体的如下所示:
图一:移频的原理图
matlab算法实现
clf; fs=16;N=128; %采样频率和数据点数 n=0:N-1;t=n/fs; %时间序列 x=0.5*sin(2*pi*15*t); %信号 y=fft(x,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 shiftIndex=4; for i = shiftIndex:N y3(i + 1 - shiftIndex) = y(i) end for i = 1:shiftIndex y3(N + i - shiftIndex) = y(i) end sprintf("y31:%d y11:%d ",y3(3),y(1)); z = ifft(y3,N); y4=fft(z,N); %对移频信号之后的数据进行处理 maga=abs(y4); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 subplot(2,2,1),plot(f,mag); %绘出随频率变化的振幅 subplot(2,2,2),plot(n,x); %绘出随频率变化的振幅 subplot(2,2,3),plot(n,z); %绘出随频率变化的振幅 subplot(2,2,4),plot(f,maga); %绘出随频率变化的振幅 xlabel('频率/Hz'); ylabel('振幅');title('N=128');grid on;
算法仿真结果
从仿真结果上可以看出,移频的算法使用的时候有一定的缺陷就是移频的HZ不能太多,太多了会导致信号失真,在防啸叫里面,一般的参数就是:
3-8HZ之内。
总结
移频算法使用比较简单,运算速度快,不过,通过实际的产品使用发现这里面有几个问题,一个就是啸叫使用这个算法并不能消除的很干净,因为移频不能完全的消除啸叫,只是会抑制一些。另外一个就是会导致 信号稍微的失真。这里在高端的产品上,效果有些欠缺。顺便打一个call,欢迎有需求或者有这方面爱好的的朋友沟通交流。后续我会给出实际产品的效果图。C的代码涉及到公司商业机密,就不能贴出来了。
作者:虚生 出处:https://www.cnblogs.com/dylancao/ 以音频和传感器算法为核心的智能可穿戴产品解决方案提供商 ,提供可穿戴智能软硬件解决方案的设计,开发和咨询服务。 勾搭热线:邮箱:1173496664@qq.com weixin:18019245820 市场技术对接群:347609188 |
![]() |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2019-08-26 一个python问题引发的思考