MATLAB、離散信号をフィルタリングする方法は?


8

「fecg.mat」という名前のファイルに格納されたdoubleの1行10000列の行列があります。マトリックスは、記録されたFECG信号の大きさを表します。

時間に対してプロットしました(0から9999):

ここに画像の説明を入力してください

ベースラインを削除するには、ハイパスフィルターを使用できるかどうか疑問に思います。適切なフィルターを設計するにはどうすればよいですか?

PS信号処理は私の専門分野ではありません。離散時間領域信号をフィルタリングする方法がわかりません。


1
一部の複雑な波形(ビデオ信号など)では、信号を「フィルター」して低周波ノイズを除去するよりも、波形の一部の機能を「クランプ」する方が効果的です。ただし、この場合、クランプする明確な機能はありません。
ダニエルRヒックス

1
したがって、母親のECGから胎児のECGをフィルター処理する必要があり、胎児のECGは高頻度です。ウィンドウフィルターを使用して信号を周波数領域(FFT)に転送し、さまざまな時間枠で周波数を取得します。次に、さまざまな時間ウィンドウで結果として得られる周波数を調べて、フィルター処理する周波数を特定します。時間と周波数の数値を知りたい場合でも、サンプルレートが必要です。一定であることを確認したいだけなら、必要ないかもしれません。
ダニーVarod

回答:


6

ベースラインを削除する最も簡単な方法は、平均を削除することです。

filtered = original - mean(original);

実際、平均はフーリエ変換の最初の係数なので、実際には非常に鋭いフィルタリングです。DC係数を除去しています。

もっとクラシックなフィルタリングが必要な場合はbutter、IIRフィルターを合成するなどの関数をチェックfilterしてから、信号をフィルターで除外します。

Matlabには、フィルター設計ツールも含まれています。


3

MATLABには、fdatoolと呼ばれるフィルター設計ツールがあります。MATLABでfdatoolを実行すると、視覚的なGUIが表示され、フィルターパラメーターを変更できます。そこからハイパスフィルターを選択し、cut0ff周波数を選択します。フィルター形状に満足したら、MATLABワークスペースにエクスポートします。フィルター名がmyFilterで、信号名がmySignalであるとします。次に、MATLABタイプで信号をフィルター処理します。filteredSignal= conv(mySignal、myFilter)。


3

目的の信号の周波数成分がわかっている場合は、その周波数よりいくらか低くハイパスできます。2 Hzを超える信号にのみ関心があり、サンプルレートが100 Hzであるとすると、次のように実行できます。

[b,a] = butter(3,2/(100/2),'high');
outputData = filter(b,a,inputData);

これは、3次バターワースハイパスを使用する特定の例です。


ありがとうございます。周波数とサンプルレートはわかりませんが、ECG信号の周波数は主に0.1〜250 Hzの範囲であるため、推定する必要があると思います。
hoo_man、2007

1
@hoo_manサンプルレートがわからない場合、情報は意味がありません。あなたはあなたに測定値を与えた人に尋ねる必要があります。PSサンプルレートは少なくとも2 *最大信号周波数でなければなりません。
Danny Varod

@DannyVarod:したがって、この状況下での唯一の方法は、試行錯誤を通じてサンプルレートを見つけることです...私は500Hzから始めます
hoo_man

ラウンド数である必要はありません。データをどのように処理しますか?
ダニーヴァロッド

@DannyVarod:ECGを記録するためのサンプリングレートは、主に約400Hz〜500Hzです。母体心電図から胎児心電図を抽出したい。まず、ベースラインのふらつきを取り除く必要があります。
hoo_man 2012

1

使用するフィルターは、実際には特定のアプリケーションによって異なります。-フィルタが粗すぎると、探している情報が削除される可能性があります。

広く使用されているPan-Tompkinsアルゴリズム(QRS検出用)は、ECGデータのベースライン除去用のフィルターを指定します。ただし、このフィルターがアプリケーションに適しているかどうかを、提供された限られた情報から判断するのは困難です。より正確な回答について詳しく説明してください。


4
ベースラインを認識するローパス。それを削除するには、元の信号からローパスの結果を差し引いて、ハイパスフィルターを効果的に作成する必要がありますよね。
Castilho

あなたは正しい-私はその部分をひっくり返した。修正していただきありがとうございます。
モラ2012

カスティーリョが言ったLPFように私は信号を通過させた。しかし、私が得たベースラインは遅れました。ベースラインと元の信号を一致させるためにそれらを減算するには、それらの1つをシフトする必要がありますか、それともより良い方法がありますか?
hoo_man 2012

1

50Hzのベースラインノイズを除去するために、適応フィルターを使用することをお勧めします。lms適応フィルターはうまくいくでしょう:

xk = sin(2*pi*50*t1);
dk = ecg1; 
bk = [0 0 0];                       %Gewichteter Vektor (FIR Koefizienten mit Anfangswert 0)
                                    %Die Werte ändern sich ständig bis sich
                                    %das System adaptiert hat

mu = .1;                            %Konvergenzgeschwindigkeit des Algorithmes.
                                    %( 0 < mu < 1/(20*(L+1)*Potenz_xk); L Filterorder)                                
Pot_x=mean(xk.*xk);
%mu=1/(100*(L+1)*Pot_x);            % Konvergenzgeschwindigkeit des Algorithmus.
                                    % Bei den Prädiktiven Adaptiven filter
                                    % gilt die Potenz nicht




yk=zeros(size(xk));                 % Ausgangssignal zum Zeitpunkt t=0 von der FIR.
ek=zeros(size(xk));                 % Fehlersignal zum ZEitpunkt t=0.

%Algorithmus für FIR Adaptiven Filter:
for n = 3:(punkte - 1)                          %Arranca en 3 porque tiene que almacenar las dos muestras anteriores y la actual (FIR de 2 coeficientes)
    xkn = [xk( n ) xk( n - 1 ) xk( n - 2 )];    %Vector niésimo (2 posiciones porque son dos coeficientes).
    yk(n) = xkn * bk';                          %Resultado parcial de la salida por el vector bk traspuesto.
    ek(n) = dk(n) - yk(n);                      %Señal de error parcial.
    bk = bk + 2*mu*ek(n)*xkn;                   %Actualización instante a instante del vector de pesos.  
end                                             %Ende des adaptiven Algorithmes.

Eje1 = figure(1);
set(Eje1,'name','Übung 1: FIR Adaptive Filter','position',[10 10 900 650]);
subplot( 2, 1, 1 );
plot( t1, xk, 'r');
xlabel('n');
ylabel('EKG mit Rauschen');
title('Eingangssignal: Bewegungsartifakt zu filtern');
subplot( 2, 1, 2 );
plot( t1, ek, '-k');
xlabel('n');
ylabel('d[k] - y[k]');
title('Ausgangssignal: EKG ohne Rauschen');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.