分享matlab程序之——濾波器篇(高通,低通)

 快畢業了,把本身寫的現成的matlab函數分享給有須要的人,因爲我的水平有限,寫的很差請見諒,願意拍磚的儘管拍好了。目前還不考慮讀博,因此寫的程序仍了惋惜,因此就拿出來分享。好了不廢話了,開始正題。html

 

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

1.低通濾波器測試

使用說明:將下列代碼幅值而後以m文件保存,文件名要與函數名相同,這裏函數名:lowp。url

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設計

--------------------------------------htm

低通濾波器使用例子的代碼blog

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文件調用get

%這段例子還調用了我本身寫的專門畫頻譜圖的函數,也給出,否則得不出個人結果it

%畫信號的幅頻譜和功率譜
%頻譜使用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
    if nargin==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{1};
        fn=varargin{2};
        ni=round(f1 * nfft/fs+1);
        na=round(fn * nfft/fs+1);
        plot(y_f(ni:na),abs(y_ft(ni:na)*2/nfft));
    endio

elseif 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('信號功率譜');
end
end

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

分享matlab程序之——濾波器篇(高通,低通)

分享matlab程序之——濾波器篇(高通,低通)

分享matlab程序之——濾波器篇(高通,低通)

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程序之——濾波器篇(高通,低通) 



分享matlab程序之——濾波器篇(高通,低通)

相關文章
相關標籤/搜索