如何实现匹配的过滤器

时间:2013-10-19 17:11:41

标签: matlab filter

我有一个模板。我通过对模板的傅里叶变换的共轭进行逆傅立叶变换来计算匹配滤波器的脉冲响应。我想在Matlab中使用'filter'命令在我的一个可用EEG通道上执行匹配滤波操作。使用滤波器命令系数'b'是我的脉冲响应?此外,我想实现Matlab代码来阈值匹配滤波器的输出以检测峰值。我怎样才能实现它?

2 个答案:

答案 0 :(得分:4)

这是一个开始,

% 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实现)。随着你的进展,你会发现有很多的细微差别需要解决。这段代码很有效,因为我从头到尾都在控制,但是一旦你开始使用真实数据,事情会变得复杂得多。例如,选择适当的阈值需要了解您将要使用的数据。

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

答案 1 :(得分:3)

实际上,你这样做

 y = filter( h, 1, x )

带有h的反应和x和y输入和输出信号。 匹配滤波器只不过是与给定信号模式相关的相关器。

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

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