MATLAB, Làm thế nào để lọc tín hiệu rời rạc?


8

Tôi có một ma trận gấp đôi 10000 lần được lưu trữ trong một tệp có tên "fecg.mat". Ma trận đại diện cho cường độ của tín hiệu FECG được ghi lại.

Tôi đã vẽ nó theo thời gian (từ 0 đến 9999):

nhập mô tả hình ảnh ở đây

Để xóa đường cơ sở, tôi tự hỏi liệu tôi có thể sử dụng bộ lọc thông cao không. Làm cách nào để thiết kế bộ lọc phù hợp?

PS Xử lý tín hiệu không phải là lĩnh vực nghiên cứu của tôi. Tôi không biết làm thế nào để lọc tín hiệu miền thời gian rời rạc.


1
Tôi lưu ý rằng đối với một số dạng sóng phức tạp (như tín hiệu video), việc "kẹp" một số tính năng của dạng sóng sẽ hiệu quả hơn là cố gắng "lọc" tín hiệu để loại bỏ nhiễu tần số thấp. Tuy nhiên, trong trường hợp này không có tính năng rõ ràng để kẹp.
Daniel R Hicks

1
Vì vậy, bạn muốn lọc ECG của thai nhi từ ECG của mẹ và ECG của thai nhi ở tần số cao. Tôi sẽ chuyển tín hiệu sang miền tần số (FFT) bằng bộ lọc cửa sổ để lấy tần số ở các khung thời gian khác nhau, sau đó xem tần số kết quả qua các cửa sổ thời gian khác nhau để biết tần số cần lọc. Nếu bạn muốn biết các giá trị số của thời gian và tần số, bạn vẫn sẽ cần tốc độ mẫu. Nếu bạn chỉ muốn thấy rằng nó là hằng số, bạn có thể không cần nó.
Daniel Varod

Câu trả lời:


6

Cách dễ nhất để loại bỏ đường cơ sở là loại bỏ mức trung bình:

filtered = original - mean(original);

Trên thực tế, trung bình là hệ số đầu tiên của biến đổi Fourier, vì vậy nó thực sự là một bộ lọc rất sắc nét: bạn đang loại bỏ hệ số DC.

Nếu bạn muốn lọc cổ điển hơn, sau đó kiểm tra các chức năng như buttervà bạn bè, sẽ tổng hợp bộ lọc IIR, sau đó sử dụng filterđể lọc tín hiệu của bạn.

Matlab cũng bao gồm một công cụ thiết kế bộ lọc.


3

MATLAB có một công cụ thiết kế bộ lọc được gọi là fdatool. Chạy fdatool trong MATLAB, nó cung cấp cho bạn một GUI trực quan, trong đó bạn có thể thay đổi các tham số bộ lọc. Chọn bộ lọc thông cao từ đó và chọn tần số cut0ff. khi bạn hài lòng với hình dạng bộ lọc, hãy xuất nó sang không gian làm việc MATLAB. Giả sử tên bộ lọc của bạn là myFilter và tên tín hiệu của bạn là mySignal. Sau đó, để lọc tín hiệu theo kiểu MATLAB: filteredSignal = conv (mySignal, myFilter).


3

Nếu bạn biết nội dung tần số của tín hiệu mong muốn, bạn có thể vượt qua phần nào dưới tần số đó. Giả sử bạn chỉ quan tâm đến tín hiệu trên 2 Hz và tốc độ mẫu của bạn là 100 Hz, sau đó bạn có thể thực hiện việc này như sau:

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

Đây là ví dụ cụ thể sử dụng đường cao tốc butterworth bậc 3.


Cảm ơn bạn. Tôi không có tần số và tốc độ mẫu, nhưng tôi nghĩ rằng tôi nên ước tính chúng, bởi vì tần số của tín hiệu ECG chủ yếu nằm trong khoảng 0,1 đến 250 Hz.
hoo_man

1
@hoo_man Nếu bạn không biết tỷ lệ mẫu, thông tin là vô nghĩa. Bạn sẽ phải hỏi bất cứ ai đưa ra số đo cho bạn. PS Tốc độ mẫu phải đạt ít nhất 2 * tần số tín hiệu tối đa.
Daniel Varod

@DannyVarod: Vì vậy, trong trường hợp này, cách duy nhất là tìm tốc độ mẫu thông qua thử và lỗi ... Tôi bắt đầu với 500Hz
hoo_man

Nó không phải là số tròn. Bạn muốn làm gì với dữ liệu?
Daniel Varod

@DannyVarod: Chủ yếu là tốc độ lấy mẫu để ghi ECG là khoảng 400Hz-500Hz. Tôi muốn trích xuất ECG của thai nhi từ ECG của mẹ. Đầu tiên tôi phải loại bỏ đường cơ sở đi lang thang.
hoo_man

1

Bộ lọc nào để sử dụng thực sự phụ thuộc vào ứng dụng cụ thể. - Bộ lọc quá thô có thể loại bỏ thông tin bạn đang tìm kiếm!

Thuật toán Pan-Tompkins được sử dụng rộng rãi (để phát hiện QRS) chỉ định bộ lọc để loại bỏ đường cơ sở trong dữ liệu ECG. Nhưng thật khó để xác định xem bộ lọc này có phù hợp với ứng dụng của bạn từ thông tin hạn chế bạn cung cấp hay không. Xin hãy giải thích cho một câu trả lời chính xác hơn.


4
Lowpass để nhận ra đường cơ sở. Để loại bỏ nó, bạn nên trừ kết quả của đường thông thấp khỏi tín hiệu ban đầu, do đó tạo ra bộ lọc đường cao một cách hiệu quả, phải không?
Castilho

Bạn nói đúng - Tôi đã làm cho phần đó bị đảo lộn. Cảm ơn đã sửa nó.
mola

Tôi truyền tín hiệu qua một LPFnhư Castilho nói. nhưng đường cơ sở tôi thu được đã bị trì hoãn. Để phù hợp với đường cơ sở và tín hiệu gốc để trừ chúng, tôi nên chuyển một trong số chúng hay có cách nào tốt hơn không?
hoo_man

1

Tôi sẽ đề nghị bạn sử dụng bộ lọc thích ứng để loại bỏ nhiễu cơ sở 50Hz. một bộ lọc thích ứng lms sẽ làm tốt:

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');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.