テンプレートがあります。テンプレートのフーリエ変換の共役を逆フーリエ変換して、整合フィルターのインパルス応答を計算します。また、Matlab の「filter」コマンドを使用して、利用可能な EEG チャネルの 1 つで一致したフィルタリング操作を実行したいと考えています。フィルタ コマンドを使用すると、係数 'b' は私のインパルス応答ですか? さらに、Matlab コードを実装して、整合フィルターの出力をしきい値処理し、ピークを検出したいと考えています。どうすれば達成できますか?
2 に答える
ここからが始まりです。
% 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
ます)。作業を進めていくと、解決すべき多くのニュアンスがあることがわかります。このコードは、私が最初から最後まで制御できるのでうまく機能しますが、実際のデータを操作し始めると、事態はさらに複雑になります。たとえば、適切なしきい値を選択するには、使用するデータについてある程度の知識が必要です。
実際、信号の性質などによっては、ピーク検出は非常に重要な作業になる可能性があります。また、予想される振幅を正確に把握していました。これらの仮定はすべて、私が概念を説明するために使用した問題を過度に単純化したものです。
実際には、これを行います
y = filter( h, 1, x )
h はインパルス応答、x および y の入力信号と出力信号です。整合フィルタは、特定の信号パターンと相関する相関器に他なりません。
探している信号パターンのちょうど逆の時間であるインパルス応答があります。
ところで、測定された信号パターンがある場合は、それを逆にして、これを FIR フィルターのインパルス応答として設定します。時間ドメインで測定する場合は、周波数ドメインでこれを行う必要はありません (両方のアプローチは同等ですが、一方は他方よりもエラーが発生しやすくなります)。