Python bộ lọc thông cao là gì?

Hơn một thập kỷ trước, tôi đã đăng mã minh họa cách lọc dữ liệu trong Python, nhưng đã có nhiều cải tiến kể từ đó. Các bài đăng gốc của tôi (1, 2, 3, 4) yêu cầu tạo các chức năng lọc riêng biệt, nhưng các phương pháp hiện đại có thể tận dụng Numpy và Scipy để thực hiện việc này dễ dàng và hiệu quả hơn. Trong bài viết này, chúng ta sẽ sử dụng

# plot the original data next to the filtered data

plt.figure(figsize=(10, 4))

plt.subplot(121)
plt.plot(times, data)
plt.title("ECG Signal with Noise")
plt.margins(0, .05)

plt.subplot(122)
plt.plot(times, filtered)
plt.title("Filtered ECG Signal")
plt.margins(0, .05)

plt.tight_layout()
plt.show()
1 để áp dụng các bộ lọc thông thấp, thông cao và thông dải nhằm giảm nhiễu trong tín hiệu điện tâm đồ (được lưu trữ trong ecg. wav (được tạo như một phần của dự án Sound Card ECG của tôi)

Python bộ lọc thông cao là gì?

Các phương pháp lọc cửa sổ chuyển động thường dẫn đến tín hiệu được lọc trễ hơn so với dữ liệu gốc (sự lệch pha). Bằng cách lọc tín hiệu hai lần theo hướng ngược lại,

# plot the original data next to the filtered data

plt.figure(figsize=(10, 4))

plt.subplot(121)
plt.plot(times, data)
plt.title("ECG Signal with Noise")
plt.margins(0, .05)

plt.subplot(122)
plt.plot(times, filtered)
plt.title("Filtered ECG Signal")
plt.margins(0, .05)

plt.tight_layout()
plt.show()
2 sẽ loại bỏ sự lệch pha này để tạo ra tín hiệu được lọc phù hợp với dữ liệu đầu vào

import scipy.io.wavfile
import scipy.signal
import numpy as np
import matplotlib.pyplot as plt

# read ECG data from the WAV file
sampleRate, data = scipy.io.wavfile.read('ecg.wav')
times = np.arange(len(data))/sampleRate

# apply a 3-pole lowpass filter at 0.1x Nyquist frequency
b, a = scipy.signal.butter(3, 0.1)
filtered = scipy.signal.filtfilt(b, a, data)

Python bộ lọc thông cao là gì?

# plot the original data next to the filtered data

plt.figure(figsize=(10, 4))

plt.subplot(121)
plt.plot(times, data)
plt.title("ECG Signal with Noise")
plt.margins(0, .05)

plt.subplot(122)
plt.plot(times, filtered)
plt.title("Filtered ECG Signal")
plt.margins(0, .05)

plt.tight_layout()
plt.show()

Tần số cắt

Đối số thứ hai được truyền vào phương thức

# plot the original data next to the filtered data

plt.figure(figsize=(10, 4))

plt.subplot(121)
plt.plot(times, data)
plt.title("ECG Signal with Noise")
plt.margins(0, .05)

plt.subplot(122)
plt.plot(times, filtered)
plt.title("Filtered ECG Signal")
plt.margins(0, .05)

plt.tight_layout()
plt.show()
0 tùy chỉnh tần số giới hạn của bộ lọc Butterworth. Giá trị này (Wn) là một số từ 0 đến 1 biểu thị phần tần số Nyquist sẽ sử dụng cho bộ lọc. Lưu ý rằng tần số Nyquist bằng một nửa tốc độ lấy mẫu. Khi phần này tăng, tần số cắt tăng. Bạn có thể ưa thích và biểu thị giá trị này dưới dạng 2 * Hz/tốc độ mẫu

plt.plot(data, '.-', alpha=.5, label="data")

for cutoff in [.03, .05, .1]:
    b, a = scipy.signal.butter(3, cutoff)
    filtered = scipy.signal.filtfilt(b, a, data)
    label = f"{int(cutoff*100):d}%"
    plt.plot(filtered, label=label)

plt.legend()
plt.axis([350, 500, None, None])
plt.title("Effect of Different Cutoff Values")
plt.show()

Python bộ lọc thông cao là gì?


Cải thiện các cạnh bằng phương pháp của Gustafsson

Một cái gì đó kỳ lạ xảy ra ở các cạnh. Không có đủ dữ liệu "ngoài trang" để biết cách làm mịn những điểm đó, vậy nên làm gì?

Đệm là hành vi mặc định, trong đó các cạnh được đệm bằng các bản sao của các điểm dữ liệu cạnh và làm mịn dấu vết như thể các điểm dữ liệu đó tồn tại. Hạn chế của điều này là một điểm dữ liệu đi lạc ở cạnh sẽ ảnh hưởng lớn đến hình dạng của dữ liệu được làm mịn của bạn

Phương pháp của Gustafsson có thể vượt trội hơn so với đệm. Ưu điểm của phương pháp này là các điểm lạc ở các cạnh không ảnh hưởng nhiều đến đường cong được làm nhẵn ở các cạnh. Kỹ thuật này được mô tả trong một bài báo năm 1994 của Fredrik Gustafsson. "Các điều kiện ban đầu được chọn cho các lượt tiến và lùi để bộ lọc tiến-lùi cho kết quả giống như bộ lọc tiến-lùi. " Điều thú vị là bài báo này trình bày phương pháp bằng cách lọc tiếng ồn ra khỏi bản ghi EKG

# A small portion of data will be inspected for demonstration
segment = data[350:400]

filtered = scipy.signal.filtfilt(b, a, segment)
filteredGust = scipy.signal.filtfilt(b, a, segment, method="gust")

plt.plot(segment, '.-', alpha=.5, label="data")
plt.plot(filtered, 'k--', label="padded")
plt.plot(filteredGust, 'k', label="Gustafsson")
plt.legend()
plt.title("Padded Data vs. Gustafsson’s Method")
plt.show()

Python bộ lọc thông cao là gì?


Bộ lọc thông dải

Bộ lọc thông thấp và thông cao có thể được chọn đơn giản bằng cách tùy chỉnh đối số thứ ba được chuyển vào bộ lọc. Đối số thứ hai biểu thị tần số (dưới dạng một phần của tần số Nyquist, một nửa tốc độ lấy mẫu). Truyền danh sách hai giá trị cho đối số thứ hai cho phép lọc tín hiệu thông dải

b, a = scipy.signal.butter(3, 0.05, 'lowpass')
filteredLowPass = scipy.signal.filtfilt(b, a, data)

b, a = scipy.signal.butter(3, 0.05, 'highpass')
filteredHighPass = scipy.signal.filtfilt(b, a, data)

b, a = scipy.signal.butter(3, [.01, .05], 'band')
filteredBandPass = scipy.signal.lfilter(b, a, data)

Python bộ lọc thông cao là gì?


Lọc sử dụng Convolution

Một cách khác để truyền tín hiệu thấp là sử dụng tích chập. Trong phương pháp này, bạn tạo một cửa sổ (thường là đường cong hình chuông) và xoay cửa sổ bằng tín hiệu. Cửa sổ càng rộng thì tín hiệu đầu ra càng mịn. Ngoài ra, cửa sổ phải được chuẩn hóa sao cho tổng của nó bằng 1 để bảo toàn biên độ của tín hiệu đầu vào

Có nhiều cách khác nhau để xử lý những gì xảy ra với các điểm dữ liệu ở các cạnh (xem

# plot the original data next to the filtered data

plt.figure(figsize=(10, 4))

plt.subplot(121)
plt.plot(times, data)
plt.title("ECG Signal with Noise")
plt.margins(0, .05)

plt.subplot(122)
plt.plot(times, filtered)
plt.title("Filtered ECG Signal")
plt.margins(0, .05)

plt.tight_layout()
plt.show()
1 để biết chi tiết), nhưng việc đặt
# plot the original data next to the filtered data

plt.figure(figsize=(10, 4))

plt.subplot(121)
plt.plot(times, data)
plt.title("ECG Signal with Noise")
plt.margins(0, .05)

plt.subplot(122)
plt.plot(times, filtered)
plt.title("Filtered ECG Signal")
plt.margins(0, .05)

plt.tight_layout()
plt.show()
2 thành
# plot the original data next to the filtered data

plt.figure(figsize=(10, 4))

plt.subplot(121)
plt.plot(times, data)
plt.title("ECG Signal with Noise")
plt.margins(0, .05)

plt.subplot(122)
plt.plot(times, filtered)
plt.title("Filtered ECG Signal")
plt.margins(0, .05)

plt.tight_layout()
plt.show()
3 sẽ xóa các điểm này để tạo ra tín hiệu đầu ra nhỏ hơn một chút so với tín hiệu đầu vào

# create a normalized Hanning window
windowSize = 40
window = np.hanning(windowSize)
window = window / window.sum()

# filter the data using convolution
filtered = np.convolve(window, data, mode='valid')

Python bộ lọc thông cao là gì?

# plot the original data next to the filtered data

plt.figure(figsize=(10, 4))

plt.subplot(121)
plt.plot(times, data)
plt.title("ECG Signal with Noise")
plt.margins(0, .05)

plt.subplot(122)
plt.plot(times, filtered)
plt.title("Filtered ECG Signal")
plt.margins(0, .05)

plt.tight_layout()
plt.show()
0

Các chức năng cửa sổ khác nhau lọc tín hiệu theo những cách khác nhau. Cửa sổ Hanning thường được ưa thích hơn vì chúng có hình dạng chủ yếu là Gaussian nhưng chạm vào số 0 ở các cạnh. Để thảo luận về ưu và nhược điểm của các chức năng cửa sổ khác nhau để phân tích quang phổ bằng FFT, hãy xem ghi chú của tôi trên FftSharp


Tài nguyên

  • Dữ liệu mẫu. điện tâm đồ. làn sóng

  • Card âm thanh ECG

  • Máy tính xách tay Jupyter cho trang này. lọc tín hiệu. ipynb

  • SciPy sách dạy nấu ăn. Filterfilt, Bộ lọc thông dải Buterworth

  • Tài liệu SciPy. scipy. dấu hiệu. lọc, scipy. dấu hiệu. bơ

  • Tài liệu NumPy. cục mịch. cây dây leo

  • Savitzky Golay Filtering - Bộ lọc Savitzky Golay là một loại bộ lọc thông thấp đặc biệt, được điều chỉnh tốt để làm mịn dữ liệu

    Bộ lọc thông cao nghĩa là gì?

    Bộ lọc thông cao là bộ lọc được thiết kế để vượt qua tất cả các tần số trên tần số giới hạn của nó . Bộ lọc thông cao được sử dụng trong hệ thống âm thanh để cho phép tần số cao đi qua trong khi lọc hoặc cắt tần số thấp.

    cao và thấp là gì

    Bộ lọc thông cao (HPF) làm suy giảm nội dung dưới tần số cắt, cho phép các tần số cao hơn đi qua bộ lọc. Bộ lọc thông thấp (LPF) làm suy giảm nội dung trên tần số cắt, cho phép các tần số thấp hơn đi qua bộ lọc

    thấp là gì

    Bộ lọc thông thấp được dùng để loại bỏ các tần số cao hơn trong tín hiệu dữ liệu . fc là tần số cắt dưới dạng một phần của tốc độ lấy mẫu và b là dải chuyển tiếp cũng là một hàm của tốc độ lấy mẫu.

    Tại sao bộ lọc thông cao hoạt động?

    Bộ lọc thông cao (HPF) “vượt qua” các tần số cao trên tần số cắt của chúng trong khi giảm dần các tần số dưới tần số cắt. In other words, high-pass filters remove low-frequency content from an audio signal below a defined cut-off point.