前記
擴聲系統為人們的日常文化活動帶來很多便捷。但是,聲反饋現象作為擴聲系統中不可避免的問題,不斷產生再生混響,對音頻數據的傳輸造成一定程度的影響,嚴重時,會引起嘯叫現象。尖銳刺耳的嘯叫現象會導致音頻信號失真,影響聽覺效果。
抑制嘯叫的方法有很多種,如移頻、自適應反饋抑制、陷波等。由於在所有的抑制方法中,移頻是一個常用的並且相對簡單的方法,最近由於實際的項目需要,筆者就針對移頻的算法做了一些深入的研究。
移頻原理
利用升高或降低輸入音頻信號的頻率成分來破壞嘯叫產生條件的方法,改變了頻率的輸出信號再次進入系統不會和原始信號頻率疊加,達到抑制嘯叫。具體實現方法是將反饋信號進行頻移過后疊加到輸入信號上,再通過擴音器路徑播放出來,然后通過聲場反饋路徑傳遞回去,再做頻移和疊加,如此循環。具體的如下所示:
圖一:移頻的原理圖
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的代碼涉及到公司商業機密,就不能貼出來了。