MATLAB|切比雪夫低通濾波器設計與濾波實現

1. 問題描述

本人并非信號處理專業,僅在結構監測研究中遇到濾波問題,特總結常規的低通濾波技術,去除高頻噪音。

由于環境的干擾因素,監測信號中總會包含噪音成分,影響信號處理過程,如下圖:

接收信號中出現很多“毛刺”,即為高頻噪音,預期通過低通濾波器過濾處理。

2. 技術背景

在MATLAB中有很多種濾波器可供選擇,本文僅介紹一筆者實現的濾波方式:切比雪夫濾波器。

低通濾波的技術要點有:

  • 濾波器參數設置
[n,Wp]=cheb1ord(Wp,Ws,Rp,Rs);                                   % Cheby1
[b,a]=cheby1(n,Rp,Wp);
freqz(b,a,2048,fs);                                             % 查看設計濾波器的曲線    
  • 信號濾波運算
y = filter(b,a,x);

此處僅說明代碼實現,理論問題不再說明。

3. 解決方案

濾波器參數的設置是有效濾波的關鍵,最重要的參數是確定濾波的范圍:

  • 通過頻率$f_{pass}$
  • 截止頻率$f_{stop}$

上圖可以看出,原信號的頻域范圍主要在100~300kHz。故可以設置:

  • 通過頻率$f_{pass}= 300 kHz$
  • 截止頻率$f_{stop}= 500 kHz$

即過濾掉500 kHz以上的高頻噪音。

4. 實施示例

4.1 數據讀入

%% 數據讀入

clc,clear,close all
[M,dt] = tools.getcsv();                                            % 讀入csv信號和采樣周期dt

fs = 1/dt;                                                          % 采樣頻率
t = M(:,1);
s = detrend(M(:,3));                                                % 去趨勢的信號

4.2 濾波參數設置

%% 參數設置

prompt0 = {                                                         % 對話框參數
    '通過頻率 f-pass(kHz)', 300
    '截止頻率 f-stop(kHz)', 500
    'Passband ripple in decibels Rp',0.1
    '衰減值Rs(Db)',30
};

dlg0.title = '濾波參數輸入-馬騁';
dlg0.save = 'lp';

para_input = tools.paradlg(prompt0,dlg0);

para.f1 = para_input{1}*1e3;
para.f3 = para_input{2}*1e3;
para.rp = para_input{3};
para.rs = para_input{4};
para.fs = fs;

注:以上tools為筆者自定義函數工具箱。

4.3 濾波器生成

%% cheby1低通濾波圖示

para.type = 1;                                                      % 濾波器類型:切比雪夫-1
s_lp = tools.lowp(s,para);                                          % 濾波

可以看出,濾波器在頻域300-500 kHz范圍內逐漸衰減。

4.4 濾波效果

%% 處理信號繪圖

figure
plot([t t],[s s_lp])
legend({'原始信號','低通濾波信號'})
title('cheby1低通濾波效果示例'),grid on
xlim([min(t) max(t)])

figure
subplot(211)
plot(t,s)
legend('原始信號'),grid on 
xlim([min(t) max(t)])

subplot(212)
plot(t,s_lp)
legend('濾波信號'),grid on 
xlim([min(t) max(t)])

顯然,濾波后的信號平滑很多。

5. 常見問題

濾波核心函數如下:

function y=lowp(x,para)
% 題目: 低通濾波器
% 輸入:
%       x       -- 原始信號序列
%       para.
%           f1  -- 通帶截止頻率
%           f3  -- 阻帶截止頻率
%           rp  -- 邊帶區衰減DB數設置
%           rs  -- 截止區衰減DB數設置
%           fs  -- 序列x的采樣頻率
%           type-- 濾波器類型
% 輸出:
%       y      -- 濾波后的信號
% 功能:
%       低通濾波,濾除高頻噪音
%       Cheby1
%       Butterworth
% 注意:
%       通帶或阻帶的截止頻率的選取范圍是不能超過采樣率的一半
%       f1,f3的值都要小于fs/2
%       rp=0.1;rs=30;%通帶邊衰減DB值和阻帶邊衰減DB值
% 作者: 未知
% 修改: 馬騁
% 2016.04.21 @HIT

%% 參數輸入

f1 = para.f1;
f3 = para.f3;
Rp = para.rp;
Rs = para.rs;
fs = para.fs;

%% 濾波器設計
Wp = f1/(fs/2);                                                     % 采用fs/2歸一化,Nyquist frequency.
Ws = f3/(fs/2);

if para.type==1
    [n,Wp]=cheb1ord(Wp,Ws,Rp,Rs);                                   % Cheby1
    [b,a]=cheby1(n,Rp,Wp);
    freqz(b,a,2048,fs);                                             % 查看設計濾波器的曲線    
    title(sprintf('n = %d Cheby1 Lowpass Filter',n))
    xlim([0 f3])
else
    
    [n,Wn] = buttord(Wp,Ws,Rp,Rs,'s');                              % Butterworth
    [b,a] = butter(n,Wn,'s');                                       % 計算濾波器系統函數分子分母多項式
    
    [z,p,k] = butter(n,Wn);
    sos = zp2sos(z,p,k);    
    freqz(sos,2048,fs)
    title(sprintf('n = %d Butterworth Lowpass Filter',n))
    xlim([0 f3])    
end

%% 濾波
y = filter(b,a,x);                                                  % 對序列x濾波后得到的序列y

end  % lowp

注:此函數中,僅切比雪夫-1濾波器測試成功,2型濾波器測試失敗。


示例程序下載:

https://coding.net/u/frank0449/p/MATLAB_lowpassFilter/git

本文用時 25 m

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容