設計bandstop濾波器 -Matlab/c/c++

第一種方式:利用Matlab自帶的函數。

 

clear ;close all;
filename ='25.wav';
[x  ,fs] = audioread(filename);

parametricEQ = fdesign.parameq('N,Flow,Fhigh,Gref,G0,GBW,Gst', 2, 1700, 2300 ,0,-40,-10,-1,fs);
Hd = design( parametricEQ,'cheby2');
[b1 ,a1] =tf(Hd);
fvtool(Hd)


y1 = filter(b1,a1,x);
audiowrite('out.wav',y1,fs);


 

第二種方式:按照書本《DAFX: Digital Audio Effects  Second Edition 》 第二章 Filters and delays 中tabel2.2得到2階濾波器的設計公式

clear ;close all
filename ='24.wav';
[x  ,fs] = audioread(filename);
fc = 3000 ;
fb = 600 ;

beta = 0.2; % 0.2 ; 0.5 ; 主要決定陷波的深度
Q =beta* fc / fb ;
K = tan(pi* fc/fs);

b0 =   Q*(1+K^2)/(K^2*Q + K + Q);
b1 =   2*Q*(K^2 - 1)/(K^2*Q + K + Q) ;
b2 =   Q*(1+ K^2) / (K^2*Q + K + Q) ;
a0 =   1 ;
a1 =   2*Q*(K^2 - 1)/(K^2*Q + K + Q) ;
a2 =  (K^2*Q - K + Q) /(K^2*Q + K + Q) ;

a=[a0 a1  a2 ];
b=[b0 b1  b2 ];
[H,f]=freqz(b,a,1000,fs);   % 求數字濾波器幅頻曲線
y1=filter(b,a,x);           % 對降採樣後的數據進行濾波
figure(1)
plot(f,20*log10(abs(H)),'k');
grid; 
xlabel('頻率/Hz'); ylabel('幅值')
title('巴特沃斯濾波器的幅值響應')

audiowrite('out24.wav',y1,fs);




 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章