簡體   English   中英

Matlab / Python中的低通濾波器,用於消除運動噪聲

[英]Low-pass filter in Matlab / Python for removing movement noise

我正在記錄一段時間內的信號(皮膚電導),即我有一個時間序列。 不幸的是,信號受到運動的影響。 在用戶指南中,我現在閱讀以下內容:

應將低通濾波器應用於數據,以消除可能歸因於運動偽影和其他噪聲成分的高頻噪聲。 由於GSR響應的緩慢變化,可以使用低至1-5 Hz的截止頻率而不會影響目標數據。

如何在Matlab或Python中將這樣的截止頻率低通濾波器應用於我的時間序列?

在Matlab中,最簡單的方法可能是使用butter命令(查找數字濾波器的系數),然后是filter命令: https : //www.mathworks.com/help/signal/ref /butter.html

butter(n, Wn)將要設計的濾波器的階數作為參數(階數越高,濾波器的性能越理想),以及歸一化頻率Wn。 通常,為了正確設計濾波器,您需要知道原始數據的采樣頻率(Hz)。

由於只需要消除基線低頻噪聲,因此請使用高通濾波器。

例:

rawdata=rand(1000,1); %randomly generated data

fs=1000; %frequency at which your data was sampled, assuming 1000 Hz here

fc=5; %cut-off frequency (you mentioned 1-5 Hz in your question so I used 5)

Wn= fc/fs; % Normalized frequency

filt_order=8; % arbitrarily chose an 8th order filter

[b,a]=butter(filt_order,Wn, 'high'); 
% butter creates the coefficients of your digital filter
% the optional parameter 'high' specifies a high-pass filter

filtered_data=filter(b,a,rawdata);

設計過濾器可能是一個非常復雜的過程,沒有人能給您答案。 過濾器設計是從經驗中學到的技能,但是在獲得經驗之前,對過濾器的基礎有扎實的了解很重要。 您應該至少熟悉FIRIIR濾波器(優點和缺點),什么是低/高/帶通濾波器以及采樣的基礎知識。

在您的情況下,我假設您已經將時間序列存儲在內存中的某個位置,因此您無需在測量時過濾數據。 在這種情況下,我將選擇一個FIR濾波器,並使用Matlab的函數filtfilt在向前和向后的方向上過濾數據,因此您過濾后的信號將沒有相位失真。 只有在已經收集了數據的后處理中,這種類型的過濾才可能進行,因為這是非因果過濾,在這種情況下,您可以知道某個數據點之前和之后的數據點的值。 而如果您在錄制時進行過濾,您將不知道將來的值。

濾波器階數截止頻率通常是通過迭代過程選擇的。 要記住的一件事是,通過增加濾波器的階數,您正在改善濾波器的性能(更陡峭的滾降斜率),這帶來了更高的計算要求。

下面是一個簡短示例,其中包含兩個頻率為3 Hz和25 Hz的正弦波。 濾波的目的是設計一個可以消除25 Hz頻率分量的低通濾波器。 我想展示兩種不同的濾波器的性能,一種具有45階,另一種具有70​​階。

% sampling frequency [Hz]
Fs = 1000;
% sampling period [s]
Ts = 1/Fs;

% time vector [s]
t = 0:Ts:3;

% Signal A frequency [Hz] and amplitude
amplitude_A = 5;
f_A = 3;
sig_A = amplitude_A.*sin(2*pi*f_A.*t);

% Signal A frequency [Hz] and amplitude
amplitude_B = 2;
f_B = 25;
sig_B = amplitude_B.*sin(2*pi*f_B.*t);

% sum of the two signals
X = sig_A + sig_B;
plot(t,X,'LineWidth',2);
hold on;
grid on;

% Low pass filter at ~15Hz
% normalized frequency wn
wn = 15/Fs;
b_1 = fir1(45,wn);
b_2 = fir1(70,wn);

% filtered signal
a = 1; % fir filter does not have poles (transfer function denominator = 1)
Y_1 = filtfilt(b_1,a,X);
plot(t,Y_1,'-r','LineWidth',2);
Y_2 = filtfilt(b_2,a,X);
plot(t,Y_2,'-k','LineWidth',2);
xlabel('Time (s)');
ylabel('Amplitude (V)');
legend('original signal','filtered order 45',...
    'filtered order 70');

這是輸出:

在此處輸入圖片說明

在圖上可以看到,較低階的濾波器並未完全濾除高頻分量,但兩個濾波器均使信號幅度衰減。 通過調整截止頻率和濾波器階數可以改善輸出。 這也是一個簡單的濾波示例,如果兩個分量的頻率更接近,則要獲得良好的結果將更具挑戰性。

對於您的情況,我假設皮膚電導(GSR)的頻率(低於1 Hz)比運動引起的假象要低得多,因此運動是一個較高的頻率成分,您想擺脫它。 我認為您應該仔細觀察原始信號圖,並嘗試確定運動引起的變化,然后對信號進行濾波並檢查運動分量是否減少了,請繼續更改濾波器參數,直到對結果滿意為止。 同樣(如果需要),您還應考慮獲取信號的頻譜(執行FFT),這可以幫助您選擇截止頻率。 如果建議的截止頻率為1-5 Hz,那么我將從該頻率開始,看看是否在該范圍內的某個頻率都可以。

在一篇文章中解釋過濾幾乎是不可能的,但是為了讓您入門,最好了解一些基本知識。 請記住,在過濾器設計中通常沒有完美的解決方案,因為每個過濾器都會以某種方式使原始數據失真。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM