MATLAB, Bagaimana cara menyaring sinyal diskrit?

8

Saya memiliki 1-by-10000 matriks double `s disimpan dalam file bernama" fecg.mat ". Matriks mewakili besarnya sinyal FECG yang direkam.

Saya telah merencanakannya berdasarkan waktu (dari 0 hingga 9999):

masukkan deskripsi gambar di sini

Untuk menghapus garis dasar, saya ingin tahu apakah saya dapat menggunakan filter high-pass. Bagaimana cara mendesain filter yang tepat?

Pemrosesan sinyal PS bukan bidang studi saya. Saya tidak tahu cara memfilter sinyal waktu-domain diskrit.

hoo_man
sumber
1
Saya perhatikan bahwa untuk beberapa bentuk gelombang kompleks (seperti sinyal video) lebih efektif untuk "menjepit" ke beberapa fitur bentuk gelombang daripada mencoba "menyaring" sinyal untuk menghilangkan noise frekuensi rendah. Namun, dalam hal ini tidak ada fitur yang jelas untuk dijepit.
Daniel R Hicks
1
Jadi Anda ingin menyaring EKG janin dari EKG ibu dan EKG janin pada frekuensi tinggi. Saya akan mentransfer sinyal ke domain frekuensi (FFT) menggunakan filter jendela untuk mendapatkan frekuensi dalam kerangka waktu yang berbeda, kemudian melihat frekuensi yang dihasilkan dari jendela waktu yang berbeda untuk mengetahui frekuensi apa yang harus disaring. Jika Anda ingin mengetahui nilai numerik waktu dan frekuensi, Anda masih perlu laju sampel. Jika Anda hanya ingin melihat bahwa itu konstan, Anda mungkin tidak membutuhkannya.
Danny Varod

Jawaban:

6

Cara termudah untuk menghapus garis dasar adalah dengan menghapus rata-rata:

filtered = original - mean(original);

Sebenarnya, rata-rata adalah koefisien pertama dari transformasi Fourier, jadi sebenarnya ini adalah penyaringan yang sangat tajam: Anda menghilangkan koefisien DC.

Jika Anda ingin pemfilteran lebih klasik, maka periksa fungsi suka butterdan teman, yang akan mensintesis filter IIR, kemudian gunakan filteruntuk memfilter sinyal Anda.

Matlab juga menyertakan alat desain filter.

Juancho
sumber
3

MATLAB memiliki alat desain filter yang disebut fdatool. Jalankan fdatool di MATLAB, itu memberi Anda GUI visual, di mana Anda dapat mengubah parameter filter. Pilih filter high-pass dari sana dan pilih frekuensi cut0ff. ketika Anda puas dengan bentuk filter, ekspor ke ruang kerja MATLAB. Katakanlah nama filter Anda adalah myFilter dan nama sinyal Anda adalah mySignal. Kemudian untuk memfilter sinyal dalam tipe MATLAB: filteredSignal = conv (mySignal, myFilter).

TJ1
sumber
3

Jika Anda tahu konten frekuensi dari sinyal yang diinginkan, Anda dapat lulus tinggi agak di bawah frekuensi itu. Katakanlah Anda hanya tertarik pada sinyal di atas 2 Hz dan sample rate Anda adalah 100 Hz, maka Anda dapat melakukan ini sebagai berikut:

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

Ini adalah contoh khusus menggunakan highpass Butterworth urutan ke-3.

Hilmar
sumber
Terima kasih. Saya tidak memiliki frekuensi dan laju sampel, tetapi saya pikir saya harus memperkirakannya, karena frekuensi sinyal EKG sebagian besar berada dalam kisaran 0,1 hingga 250 Hz.
hoo_man
1
@ hoo_man Jika Anda tidak tahu laju sampel, informasinya tidak berarti. Anda harus bertanya siapa yang memberi Anda pengukuran. PS Laju sampel harus minimal 2 * frekuensi sinyal maksimum.
Danny Varod
@DannyVarod: Jadi di bawah keadaan ini satu-satunya cara adalah untuk menemukan tingkat sampel melalui coba-coba ... Saya mulai dengan 500Hz
hoo_man
Tidak harus angka bulat. Apa yang ingin Anda lakukan dengan data?
Danny Varod
@DannyVarod: Sebagian besar laju pengambilan sampel untuk merekam EKG adalah sekitar 400Hz-500Hz. Saya ingin mengekstraksi EKG janin dari EKG ibu. Pertama saya harus menghapus pengembaraan garis dasar.
hoo_man
1

Filter mana yang akan digunakan sangat tergantung pada aplikasi spesifik. - Filter yang terlalu kasar dapat menghapus informasi yang Anda cari!

Algoritma Pan-Tompkins yang banyak digunakan (untuk deteksi QRS) menetapkan filter untuk penghilangan garis dasar dalam data EKG. Tetapi sulit untuk menentukan apakah filter ini cocok untuk aplikasi Anda dari informasi terbatas yang Anda berikan. Tolong uraikan jawaban yang lebih tepat.

Mola
sumber
4
Lowpass untuk mengenali garis dasar. Untuk menghapusnya, Anda harus mengurangi hasil lowpass dari sinyal asli, sehingga menciptakan filter highpass secara efektif, bukan?
Castilho
Anda benar - bagian saya terbalik. Terima kasih telah memperbaikinya.
mola
Saya melewati sinyal melalui LPFseperti yang dikatakan Castilho . tapi baseline yang saya dapatkan tertunda. Untuk mencocokkan baseline dan sinyal asli untuk mengurangi mereka, haruskah saya menggeser salah satunya atau apakah ada cara yang lebih baik?
hoo_man
1

Saya akan menyarankan Anda untuk menggunakan filter adaptif untuk menghilangkan kebisingan baseline 50Hz. filter adaptif lms akan bekerja dengan baik:

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');
Harry
sumber