1. 程式人生 > 實用技巧 >麥克風嘯叫抑制解決方案之移頻法

麥克風嘯叫抑制解決方案之移頻法

前記

 擴聲系統為人們的日常文化活動帶來很多便捷。但是,聲反饋現象作為擴聲系統中不可避免的問題,不斷產生再生混響,對音訊資料的傳輸造成一定程度的影響,嚴重時,會引起嘯叫現象。尖銳刺耳的嘯叫現象會導致音訊訊號失真,影響聽覺效果。

 抑制嘯叫的方法有很多種,如移頻、自適應反饋抑制、陷波等。由於在所有的抑制方法中,移頻是一個常用的並且相對簡單的方法,最近由於實際的專案需要,筆者就針對移頻的演算法做了一些深入的研究。

移頻原理

利用升高或降低輸入音訊訊號的頻率成分來破壞嘯叫產生條件的方法,改變了頻率的輸出訊號再次進入系統不會和原始訊號頻率疊加,達到抑制嘯叫。具體實現方法是將反饋訊號進行頻移過後疊加到輸入訊號上,再通過擴音器路徑播放出來,然後通過聲場反饋路徑傳遞回去,再做頻移和疊加,如此迴圈。具體的如下所示:

圖一:移頻的原理圖

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的程式碼涉及到公司商業機密,就不能貼出來了。