matlab 濾波器篇

2021-07-10 01:47:59 字數 4269 閱讀 7286

快畢業了,把自己寫的現成的matlab函式分享給有需要的人,由於個人水平有限,寫的不好請見諒,願意拍磚的儘管拍好了。目前還不考慮讀博,所以寫的程式仍了可惜,所以就拿出來分享。好了不廢話了,開始正題。

以下兩個濾波器都是切比雪夫i型數字濾波器,不是巴特沃爾濾波器,請使用者注意!

1.低通濾波器

使用說明:將下列**幅值然後以m檔案儲存,檔名要與函式名相同,這裡函式名:lowp。

function y=lowp(x,f1,f3,rp,rs,fs)

%低通濾波

%使用注意事項:通帶或阻帶的截止頻率的選取範圍是不能超過取樣率的一半

%即,f1,f3的值都要小於 fs/2

%x:需要帶通濾波的序列

% f 1:通帶截止頻率

% f 3:阻帶截止頻率

%rp:邊帶區衰減db數設定

%rs:截止區衰減db數設定

%fs:序列x的取樣頻率

% rp=0.1;rs=30;%通帶邊衰減db值和阻帶邊衰減db值

% fs=2000;%取樣率

%wp=2*pi*f1/fs;

ws=2*pi*f3/fs;

% 設計切比雪夫濾波器;

[n,wn]=cheb1ord(wp/pi,ws/pi,rp,rs);

[bz1,az1]=cheby1(n,rp,wp/pi);

%檢視設計濾波器的曲線

[h,w]=freqz(bz1,az1,256,fs);

h=20*log10(abs(h));

figure;plot(w,h);title('所設計濾波器的通帶曲線');grid on;

%y=filter(bz1,az1,x);%對序列x濾波後得到的序列y

end低通濾波器使用例子的**

fs=2000;

t=(1:fs)/fs;

ff1=100;

ff2=400;

x=sin(2*pi*ff1*t)+sin(2*pi*ff2*t);

figure;

subplot(211);plot(t,x);

subplot(212);hua_fft(x,fs,1);

%低通測試

% y=filter(bz1,az1,x);

y=lowp(x,300,350,0.1,20,fs);

figure;

subplot(211);plot(t,y);

subplot(212);hua_fft(y,fs,1);%hua_fft()函式是畫頻譜圖的函式,**在下面給出,要儲存為m檔案呼叫

%這段例子還呼叫了我自己寫的專門畫頻譜圖的函式,也給出,不然得不出我的結果

%畫訊號的幅頻譜和功率譜

%頻譜使用matlab例子表示

function hua_fft(y,fs,style,varargin)

%當style=1,畫幅值譜;當style=2,畫功率譜;當style=其他的,那麼花幅值譜和功率譜

%當style=1時,還可以多輸入2個可選引數

%可選輸入引數是用來控制需要檢視的頻率段的

%第乙個是需要檢視的頻率段起點

%第二個是需要檢視的頻率段的終點

%其他style不具備可選輸入引數,如果輸入發生位置錯誤

nfft=2^nextpow2(length(y));%找出大於y的個數的最大的2的指數值(自動進算最佳fft步長nfft)

%nfft=1024;%人為設定fft的步長nfft

y=y-mean(y);%去除直流分量

y_ft=fft(y,nfft);%對y訊號進行dft,得到頻率的幅值分布

y_p=y_ft.*conj(y_ft)/nfft;%conj()函式是求y函式的共軛複數,實數的共軛複數是他本身。

y_f=fs*(0:nfft/2-1)/nfft;�t變換後對應的頻率的序列

% y_p=y_ft.*conj(y_ft)/nfft;%conj()函式是求y函式的共軛複數,實數的共軛複數是他本身。

if style==1

ifnargin==3

plot(y_f,2*abs(y_ft(1:nfft/2))/length(y));%matlab的幫助裡畫fft的方法

%ylabel('幅值');xlabel('頻率');title('訊號幅值譜');

%plot(y_f,abs(y_ft(1:nfft/2)));%論壇上畫fft的方法

else

f1=varargin;

fn=varargin;

ni=round(f1 * nfft/fs+1);

na=round(fn * nfft/fs+1);

plot(y_f(ni:na),abs(y_ft(ni:na)*2/nfft));

endelseif style==2

plot(y_f,y_p(1:nfft/2));

%ylabel('功率譜密度');xlabel('頻率');title('訊號功率譜');

else

subplot(211);plot(y_f,2*abs(y_ft(1:nfft/2))/length(y));

ylabel('幅值');xlabel('頻率');title('訊號幅值譜');

subplot(212);plot(y_f,y_p(1:nfft/2));

ylabel('功率譜密度');xlabel('頻率');title('訊號功率譜');

endend

下面三幅圖分別是濾波前的時頻圖,濾波器的濾波特性曲線圖和濾波後的時頻圖,通過圖可以看出成功留下了100hz的低頻成分而把不要的高頻成分去除了。

2.高通濾波器

function y=highp(x,f1,f3,rp,rs,fs)

%高通濾波

%使用注意事項:通帶或阻帶的截止頻率的選取範圍是不能超過取樣率的一半

%即,f1,f3的值都要小於 fs/2

%x:需要帶通濾波的序列

% f 1:通帶截止頻率

% f 2:阻帶截止頻率

%rp:邊帶區衰減db數設定

%rs:截止區衰減db數設定

%fs:序列x的取樣頻率

% rp=0.1;rs=30;%通帶邊衰減db值和阻帶邊衰減db值

% fs=2000;%取樣率

%wp=2*pi*f1/fs;

ws=2*pi*f3/fs;

% 設計切比雪夫濾波器;

[n,wn]=cheb1ord(wp/pi,ws/pi,rp,rs);

[bz1,az1]=cheby1(n,rp,wp/pi,'high');

%檢視設計濾波器的曲線

[h,w]=freqz(bz1,az1,256,fs);

h=20*log10(abs(h));

figure;plot(w,h);title('所設計濾波器的通帶曲線');grid on;

y=filter(bz1,az1,x);

end下面是高通濾波器的例子

fs=2000;

t=(1:fs)/fs;

ff1=100;

ff2=400;

x=sin(2*pi*ff1*t)+sin(2*pi*ff2*t);

figure;

subplot(211);plot(t,x);

subplot(212);hua_fft(x,fs,1);

%------高通測試

z=highp(x,350,300,0.1,20,fs);

figure;

subplot(211);plot(t,z);

subplot(212);hua_fft(z,fs,1);

下面三幅圖分別是濾波前的時頻圖,濾波器的濾波特性曲線圖和濾波後的時頻圖,通過圖可以看出成功留下了400hz的高頻成分而把不要的低頻成分100hz去除了。

matlab設計濾波器

陳懷琛的 數字訊號處理教程 matlab釋義與實現 從效能上來說,iir濾波器傳遞函式包括零點和極點兩組可調因素,對極點的惟一限制是在單位圓內。因此可用較低的階數獲得高的選擇性,所用的儲存單元少,計算量小,效率高。但是這個高效率是以相位的非線性為代價的。選擇性越好,則相位非線性越嚴重。fir濾波器傳...

matlab設計低通濾波器

輸入 被白雜訊汙染的正弦訊號,fs 100khz,訊號頻率為10khz,雜訊訊號為20khz,現在要濾掉20khz的正弦訊號 clear all fs 100000 t 0 1 fs 0.003 f1 10000 f2 20000 signal1 sin 2 pi f1 t signal2 sin ...

matlab帶阻濾波器設計

程式設計 任務書中給出的要求為中心頻率200hz,頻寬150hz。故設上通帶截止頻率為110hz,下通帶截止頻率290hz,阻帶上限頻率140hz,阻帶下限頻率260hz。此處僅以boxcar窗為示例,其他窗函式的程式 基本相同,只是在window boxcar n n ceil 1.8 pi de...