2013-10-19 239 views
0

我有一個模板。我通過對模板進行傅里葉變換的共軛傅里葉逆變換來計算匹配濾波器的脈衝響應。我想使用Matlab中的'filter'命令對我的一個可用EEG通道執行匹配濾波操作。使用濾波器命令,係數'b'是我的脈衝響應?此外,我想實現Matlab代碼來對匹配濾波器的輸出進行閾值檢測以檢測峯值。我可以如何實現?如何實現匹配的過濾器

+0

請爲您的問題添加一些細節。你有什麼嘗試?使用'filter'函數時遇到什麼問題?你用行話說話,這表明你理解了這個問題,但是你的問題表明你不明白你在做什麼。幫助我們找出你*需要幫助的部分。 – nispio

+0

@nispio我有一個模板。我通過對模板進行傅里葉變換的共軛傅里葉逆變換來計算匹配濾波器的脈衝響應。我想使用Matlab中的'filter'命令對我的一個可用EEG通道執行匹配濾波操作。使用濾波器命令,係數'b'是我的脈衝響應?此外,我想實現Matlab代碼來對匹配濾波器的輸出進行閾值檢測以檢測峯值。我可以如何實現? – Mikonio

+0

太棒了!現在我們正在接近一個可回答的問題。 (也許你應該考慮編輯你的問題,而不是在評論中添加細節。)現在,你到目前爲止嘗試了什麼,以及遇到了什麼問題? – nispio

回答

3

這裏是你開始做這在頻域,

% A template is given 
temp = randn(100,1); 

% Create a matched filter based on the template 
b = flipud(temp(:)); 

% For testing the matched filter, create a random signal which 
% contains a match for the template at some time index 
x = [randn(200,1); temp(:); randn(300,1)]; 
n = 1:length(x); 

% Process the signal with the matched filter 
y = filter(b,1,x); 

% Set a detection threshold (exmaple used is 90% of template) 
thresh = 0.9 

% Compute normalizing factor 
u = temp.'*temp; 

% Find matches 
matches = n(y>thresh*u); 

% Plot the results 
plot(n,y,'b', n(matches), y(matches), 'ro'); 

% Print the results to the console 
display(matches); 

正如Andreas在他的回答中提到的那樣,沒有必要進行傅立葉變換。如果你有一個時域模板,那麼它的匹配濾波器就是它本身的時間反轉版本(我通過flipud獲得)。隨着你的進步,你會發現有很多細微差別待解決。這段代碼工作的很好,因爲我從頭到尾都在控制着它,但是一旦開始使用真實數據,事情就會變得更加複雜。例如,選擇一個合適的閾值將需要一些關於您將使用的數據的知識。

事實上,根據信號的性質等,峯值檢測可能是非常不平凡的任務。在我的情況下,峯值檢測很容易,因爲我的信號與模板完全不相關,除了在中間,我也確切地知道我期待看到的幅度。所有這些假設都過分簡化了我用來演示概念的問題。

2

實際上,這樣做

y = filter(h, 1, x) 

與小時impuse響應,x和y的輸入和輸出信號。 匹配濾波器無非是一個與給定信號模式相關的相關器。

它有一個脈衝響應,它只是您嘗試查找的信號模式的時間反轉。所以順便說一下:如果你有一個測量的信號模式,將其反轉,並將其設置爲FIR濾波器的脈衝響應。有沒有必要,如果你有在時域測量(這兩種方法是等效的,但一個更容易出錯,那麼其他)