Hướng dẫn bandpass filter python - bộ lọc thông dải python

Gần đây trong khi tôi đang làm việc để xử lý tín hiệu tần số rất cao là 12,5 kHz, tức là 12500 mẫu mỗi giây hoặc một mẫu cứ sau 80 micro giây. Điều thú vị hơn là tôi phải rút ra các điểm dữ liệu khác nhau vào tập dữ liệu này.

Đây là cách dữ liệu của tôi trong một chu kỳ duy nhất trông giống như

Hướng dẫn bandpass filter python - bộ lọc thông dải python

Bạn có thể thấy tiếng ồn khi tôi phóng to dữ liệu

Vì vậy, bây giờ hãy xem xét, nếu phải xác định điểm mà đường cong bắt đầu nó tăng lên.

Với rất nhiều tiếng ồn, có một xác suất rất cao để có được điểm dữ liệu dương tính giả. Cũng tưởng tượng hiệu suất của thuật toán với rất nhiều biến động trong dữ liệu.

Tôi sẽ bắt đầu với một số điều cơ bản xử lý tín hiệu, điều cần thiết để hiểu trước khi chúng tôi nhảy vào mã.

Khái niệm cơ bản: Bộ lọc Band Pass

Bốn bộ lọc phổ biến.

  1. Bộ lọc thông thấp, truyền tín hiệu có tần số thấp hơn tần số cắt nhất định và làm giảm tín hiệu có tần số cao hơn tần số cắt.
  2. Bộ lọc thông cao, truyền tín hiệu có tần số cao hơn tần số cắt nhất định và làm giảm tín hiệu với tần số thấp hơn tần số cắt.
  3. Một bộ lọc thông dải có thể được hình thành bằng cách xếp tầng bộ lọc thông cao và bộ lọc thông thấp.
  4. Một bộ lọc từ chối dải là sự kết hợp song song của các bộ lọc thông thấp và thông cao.

Bây giờ hãy xem một dữ liệu mẫu, sẽ là lý tưởng để làm việc với

Như bạn có thể thấy sự biến dạng gây ra bởi rất nhiều nhiễu đã biến dạng dữ liệu thực tế là dữ liệu sóng tội lỗi.

  • Thời gian mẫu - 5 giây (T)
  • Lấy mẫu Freq - 30 mẫu / s, tức là 30 Hz (FS)
  • Tổng số mẫu - (fs x t) = 150
  • Tín hiệu Freq = 6 Tín hiệu / 5 giây = 1,2 Hz

Điều này có nghĩa là chúng tôi cần một bộ lọc sẽ vượt qua tín hiệu với tần suất nhất là 1,2 Hz, tuy nhiên trong đời thực, tần số tín hiệu có thể dao động, do đó sẽ tốt nếu chúng tôi chọn số lượng cao hơn một chút so với tần số được tính toán lý tưởng.

Bạn cũng có thể thử sử dụng FFT (biến đổi Fourier nhanh) để tìm điều tra các tần số và biên độ của tín hiệu so với các thành phần nhiễu, có thể tìm thấy nhiều chi tiết cùng với mã ở đây

Bộ lọc Butterworth

Đáp ứng tần số của bộ lọc Butterworth là phẳng tối đa (nghĩa là không có gợn sóng) trong băng thông và lăn về phía 0 trong băng tần, do đó là một trong những bộ lọc thông thường phổ biến nhất.

Tần số Nyquist

Thuật ngữ nyquist thường được sử dụng để mô tả tốc độ lấy mẫu Nyquist hoặc tần số Nyquist.Nyquist sampling rate or the Nyquist frequency.

Tốc độ hoặc tần số Nyquist là tốc độ tối thiểu mà tín hiệu băng thông hữu hạn cần được lấy mẫu để giữ lại tất cả thông tin. Nếu một chuỗi thời gian được lấy mẫu trong các khoảng thời gian thường xuyên DT, thì tốc độ Nyquist chỉ là 1/(2 dt).Nyquist rate or frequency is the minimum rate at which a finite bandwidth signal needs to be sampled to retain all of the information. If a time series is sampled at regular time intervals dt, then the Nyquist rate is just 1/(2 dt ).

Hãy nhảy vào mã

Bước 1: Xác định các yêu cầu của bộ lọc

  • Thời gian mẫu - 5 giây (T)
  • Lấy mẫu Freq - 30 mẫu / s, tức là 30 Hz (FS)
  • Tổng số mẫu - (fs x t) = 150
  • Tín hiệu Freq = 6 Tín hiệu / 5 giây = 1,2 Hz
  • Điều này có nghĩa là chúng tôi cần một bộ lọc sẽ vượt qua tín hiệu với tần suất nhất là 1,2 Hz, tuy nhiên trong đời thực, tần số tín hiệu có thể dao động, do đó sẽ tốt nếu chúng tôi chọn số lượng cao hơn một chút so với tần số được tính toán lý tưởng.
  • Bạn cũng có thể thử sử dụng FFT (biến đổi Fourier nhanh) để tìm điều tra các tần số và biên độ của tín hiệu so với các thành phần nhiễu, có thể tìm thấy nhiều chi tiết cùng với mã ở đây
import numpy as np
from scipy.signal import butter,filtfilt
# Filter requirements.
T = 5.0 # Sample Period
fs = 30.0 # sample rate, Hz
cutoff = 2 # desired cutoff frequency of the filter, Hz , slightly higher than actual 1.2 Hz
nyq = 0.5 * fs # Nyquist Frequencyorder = 2 # sin wave can be approx represented as quadratic
n = int(T * fs) # total number of samples

Bộ lọc Butterworth

# sin wave
sig = np.sin(1.2*2*np.pi*t)
# Lets add some noise
noise = 1.5*np.cos(9*2*np.pi*t) + 0.5*np.sin(12.0*2*np.pi*t)
data = sig + noise

Đáp ứng tần số của bộ lọc Butterworth là phẳng tối đa (nghĩa là không có gợn sóng) trong băng thông và lăn về phía 0 trong băng tần, do đó là một trong những bộ lọc thông thường phổ biến nhất.

def butter_lowpass_filter(data, cutoff, fs, order):
normal_cutoff = cutoff / nyq
# Get the filter coefficients
b, a = butter(order, normal_cutoff, btype='low', analog=False)
y = filtfilt(b, a, data)
return y

Tần số Nyquist

# Filter the data, and plot both the original and filtered signals.
y = butter_lowpass_filter(data, cutoff, fs, order)
fig = go.Figure()fig.add_trace(go.Scatter(
y = data,
line = dict(shape = 'spline' ),
name = 'signal with noise'
))
fig.add_trace(go.Scatter(
y = y,
line = dict(shape = 'spline' ),
name = 'filtered signal'
))
fig.show()

Thuật ngữ nyquist thường được sử dụng để mô tả tốc độ lấy mẫu Nyquist hoặc tần số Nyquist.

Tốc độ hoặc tần số Nyquist là tốc độ tối thiểu mà tín hiệu băng thông hữu hạn cần được lấy mẫu để giữ lại tất cả thông tin. Nếu một chuỗi thời gian được lấy mẫu trong các khoảng thời gian thường xuyên DT, thì tốc độ Nyquist chỉ là 1/(2 dt).

Hãy nhảy vào mã