2013-10-19 149 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滤波器的脉冲响应。有没有必要,如果你有在时域测量(这两种方法是等效的,但一个更容易出错,那么其他)