1. 問題描述
本人并非信號處理專業(yè)鹅经,僅在結(jié)構(gòu)監(jiān)測研究中遇到濾波問題瞬雹,特總結(jié)常規(guī)的低通濾波技術酗捌,去除高頻噪音胖缤。
由于環(huán)境的干擾因素哪廓,監(jiān)測信號中總會包含噪音成分涡真,影響信號處理過程哆料,如下圖:
接收信號中出現(xiàn)很多“毛刺”东亦,即為高頻噪音典阵,預期通過低通濾波器過濾處理壮啊。
2. 技術背景
在MATLAB中有很多種濾波器可供選擇撑蒜,本文僅介紹一筆者實現(xiàn)的濾波方式:切比雪夫濾波器充坑。
低通濾波的技術要點有:
- 濾波器參數(shù)設置
[n,Wp]=cheb1ord(Wp,Ws,Rp,Rs); % Cheby1
[b,a]=cheby1(n,Rp,Wp);
freqz(b,a,2048,fs); % 查看設計濾波器的曲線
- 信號濾波運算
y = filter(b,a,x);
此處僅說明代碼實現(xiàn),理論問題不再說明份企。
3. 解決方案
濾波器參數(shù)的設置是有效濾波的關鍵司志,最重要的參數(shù)是確定濾波的范圍:
- 通過頻率$f_{pass}$
- 截止頻率$f_{stop}$
上圖可以看出,原信號的頻域范圍主要在100~300kHz腰根。故可以設置:
- 通過頻率$f_{pass}= 300 kHz$
- 截止頻率$f_{stop}= 500 kHz$
即過濾掉500 kHz以上的高頻噪音。
4. 實施示例
4.1 數(shù)據(jù)讀入
%% 數(shù)據(jù)讀入
clc,clear,close all
[M,dt] = tools.getcsv(); % 讀入csv信號和采樣周期dt
fs = 1/dt; % 采樣頻率
t = M(:,1);
s = detrend(M(:,3)); % 去趨勢的信號
4.2 濾波參數(shù)設置
%% 參數(shù)設置
prompt0 = { % 對話框參數(shù)
'通過頻率 f-pass(kHz)', 300
'截止頻率 f-stop(kHz)', 500
'Passband ripple in decibels Rp',0.1
'衰減值Rs(Db)',30
};
dlg0.title = '濾波參數(shù)輸入-馬騁';
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
為筆者自定義函數(shù)工具箱。
4.3 濾波器生成
%% cheby1低通濾波圖示
para.type = 1; % 濾波器類型:切比雪夫-1
s_lp = tools.lowp(s,para); % 濾波
可以看出,濾波器在頻域300-500 kHz范圍內(nèi)逐漸衰減靠闭。
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. 常見問題
濾波核心函數(shù)如下:
function y=lowp(x,para)
% 題目: 低通濾波器
% 輸入:
% x -- 原始信號序列
% para.
% f1 -- 通帶截止頻率
% f3 -- 阻帶截止頻率
% rp -- 邊帶區(qū)衰減DB數(shù)設置
% rs -- 截止區(qū)衰減DB數(shù)設置
% fs -- 序列x的采樣頻率
% type-- 濾波器類型
% 輸出:
% y -- 濾波后的信號
% 功能:
% 低通濾波愧膀,濾除高頻噪音
% Cheby1
% Butterworth
% 注意:
% 通帶或阻帶的截止頻率的選取范圍是不能超過采樣率的一半
% f1,f3的值都要小于fs/2
% rp=0.1;rs=30;%通帶邊衰減DB值和阻帶邊衰減DB值
% 作者: 未知
% 修改: 馬騁
% 2016.04.21 @HIT
%% 參數(shù)輸入
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'); % 計算濾波器系統(tǒng)函數(shù)分子分母多項式
[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
注:此函數(shù)中,僅切比雪夫-1濾波器測試成功点弯,2型濾波器測試失敗扇调。
示例程序下載:
https://coding.net/u/frank0449/p/MATLAB_lowpassFilter/git
本文用時 25 m