2

我有一个模板。我通过对我的模板的傅里叶变换的共轭进行傅里叶逆变换来计算匹配滤波器的脉冲响应。我想使用 Matlab 中的“过滤器”命令在我的一个可用脑电图通道上执行匹配过滤操作。使用过滤器命令系数'b'是我的脉冲响应吗?此外,我想实现 Matlab 代码来阈值匹配滤波器的输出以检测峰值。我该如何实现呢?

4

2 回答 2

6

这是你的开始,

% 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);

正如安德烈亚斯在他的回答中提到的那样,不需要傅立叶变换。如果你有一个时域模板,那么它的匹配过滤器就是它自身的一个时间反转版本(我用 实现flipud)。随着您的进行,您会发现有许多细微差别需要解决。这段代码很好用,因为我从头到尾都在掌控之中,但是一旦你开始使用真实数据,事情就会变得更加复杂。例如,选择一个合适的阈值将需要一些关于您将使用的数据的知识。

事实上,峰值检测可能是一项非常重要的任务,具体取决于信号的性质等。在我的情况下,峰值检测很容易,因为我的信号与模板完全不相关,除了中间的点,并且我也确切地知道我期望看到的幅度。所有这些假设都是对我用来演示概念的问题的过度简化。

于 2013-10-19T20:50:32.720 回答
4

实际上,你这样做

 y = filter( h, 1, x )

其中 h 是脉冲响应以及 x 和 y 输入和输出信号。匹配滤波器只不过是与给定信号模式相关的相关器。

它有一个脉冲响应,它只是您尝试寻找的信号模式的时间反转。

顺便说一句:如果您有测量的信号模式,请将其反转并将其设置为 FIR 滤波器的脉冲响应。如果您在时域中进行测量,则无需在频域中执行此操作(两种方法是等效的,但一种比另一种更容易出错)

于 2013-10-19T17:40:22.743 回答