麦克风啸叫抑制解决方案之移频法

麦克风啸叫抑制解决方案之移频法

前记

扩声系统为人们的日常文化活动带来很多便捷。但是,声反馈现象作为扩声系统中不可避免的问题,不断产生再生混响,对音频数据的传输造成一定程度的影响,严重时,会引起啸叫现象。尖锐刺耳的啸叫现象会导致音频信号失真,影响听觉效果。

抑制啸叫的方法有很多种,如移频、自适应反馈抑制、陷波等。由于在所有的抑制方法中,移频是一个常用的并且相对简单的方法,最近由于实际的项目需要,笔者就针对移频的算法做了一些深入的研究。

移频原理

利用升高或降低输入音频信号的频率成分来破坏啸叫产生条件的方法,改变了频率的输出信号再次进入系统不会和原始信号频率叠加,达到抑制啸叫。具体实现方法是将反馈信号进行频移过后叠加到输入信号上,再通过扩音器路径播放出来,然后通过声场反馈路径传递回去,再做频移和叠加,如此循环。具体的如下所示:

图一:移频的原理图

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的代码涉及到公司商业机密,就不能贴出来了。