Bộ lọc chuỗi thời gian [TS] thường được sử dụng trong xử lý tín hiệu số cho cảm biến âm thanh phân tán [DAS]. Mục tiêu là loại bỏ một tập hợp con tần số khỏi tín hiệu TS được số hóa. Để lọc tín hiệu, bạn phải chạm vào tất cả dữ liệu và thực hiện tích chập. Đây là một quá trình chậm khi bạn có một lượng lớn dữ liệu. Mục đích của bài đăng này là điều tra bộ lọc nào nhanh nhất trong Python
Tiến trình song song
Dữ liệu phải được truyền qua bộ lọc vì bộ lọc chứa trạng thái. Bước lọc tiếp theo phụ thuộc vào kết quả trước đó và trạng thái hiện tại của bộ lọc. Đó là một quá trình Markov
Điều này gây khó khăn cho việc song song hóa. Nếu bạn có TS một chiều, bạn không thể chia nó để chạy trên hai luồng, do thuộc tính Markov. Trong các tín hiệu TS hai chiều, chẳng hạn như âm thanh nổi, bạn có thể chia các kênh và chạy các bộ lọc trên các luồng riêng biệt. Lưu ý rằng cũng có những gói cung cấp cài đặt
order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
0 và order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
1 đa luồng như bản phân phối Python của IntelTuýt lọc
Có hai loại bộ lọc TS kỹ thuật số. đáp ứng xung hữu hạn [FIR] và đáp ứng xung vô hạn [IIR]. Nếu bạn lọc tín hiệu có xung đột biến [xung] trong đó, bộ lọc IIR sẽ dao động vô hạn, trong khi FIR sẽ đổ chuông trong một khoảng thời gian ngắn. Bộ lọc IIR là đệ quy
Bộ lọc FIR và IIR được xác định bởi số lượng quan sát mà chúng kết hợp lại, thường được gọi là thứ tự hoặc số lần nhấn. Vì bộ lọc IIR có tính đệ quy nên chúng có thể hoạt động tốt như bộ lọc FIR với số lần nhấn ít hơn nhiều. Điều này có nghĩa là các bộ lọc IIR nhanh hơn với cùng yêu cầu lọc. Nhược điểm là chúng có thể không ổn định [do vòng phản hồi] và chúng thay đổi pha của tín hiệu theo cách phi tuyến tính [e. g. tần số cao và tần số thấp có thể được phân tách kịp thời khi chúng đi qua bộ lọc]
khoa học viễn tưởng
order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
1 có nhiều phương pháp giúp thiết kế các tham số bộ lọc và thực hiện quá trình lọc. Nó sử dụng order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
0 cơ bản, vì vậy các kết cấu cơ bản phải hoạt động hiệu quả. Hãy để chúng tôi bắt đầu bằng cách xác định một số tham số phổ biếnimport numpy as np
import scipy as sp
import scipy.signal as signal
import matplotlib.pyplot as plt
import timeit
sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
Thiết kế bộ lọc IIR
Bây giờ chúng ta cần thiết kế bộ lọc.
order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
1 có một số phương pháp trợ giúp cho phép chúng tôi lấy thông số kỹ thuật của mình và đề xuất thứ tự của bộ lọc. Trong đoạn mã dưới đây, chúng tôi thiết kế bộ lọc Butterworth IIR thông dải. Kết quả là một bộ lọc có thứ tự 3order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
Thiết kế bộ lọc FIR
Bây giờ chúng ta hãy sử dụng các tham số tương tự để thiết kế bộ lọc FIR. Đây là bộ lọc thông dải Kaiser FIR. 5Hz là ngưỡng thấp đối với tín hiệu có tốc độ lấy mẫu là 10 kHz. Thiết kế bộ lọc kết quả có thứ tự khoảng 2200
Điều này có ý nghĩa vì bộ lọc không đệ quy. Nó phải quan sát trực tiếp tín hiệu 5Hz để lọc chúng ra. Nói cách khác, chúng ta cần ít nhất 10000/5 = 2000 quan sát để thấy tín hiệu 5 Hz
Hiệu suất suy giảm bộ lọc cũng kém, khi so sánh với Butterworth. Nhưng ít nhất sẽ không có bất kỳ thay đổi pha phi tuyến tính nào
________số 8_______
order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
5 Hiệu suất
order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
Giờ mình sẽ test khả năng hoạt động của hàm
order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
5 trên 2 filter này. Tôi hy vọng FIR sẽ chậm, vì nó phải thực hiện nhiều phép tính hơn. Tôi. e. đối với mỗi kênh sẽ có _______ 7 phép nhân, trong khi đối với IIR sẽ chỉ có _______ 8. order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
0 có thể tối ưu hóa phép tính, nhưng tôi vẫn mong đợi khoảng hai bậc độ chênh lệchprint["IIR time = {}".format[timeit.timeit[lambda: signal.lfilter[iir_b, iir_a, x, axis=1], number=1]]]
print["FIR time = {}".format[timeit.timeit[lambda: signal.lfilter[fir_b, fir_a, x, axis=1], number=1]]]
IIR time = 0.8159449380000297
FIR time = 57.0915518339998
Những kết quả này cho thấy những gì tôi mong đợi. Khi bạn cần lọc tần số thấp, IIR hiệu quả hơn đáng kể
Cải thiện hiệu suất bộ lọc IIR
Hàm
order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
1 nyq_cutoff = [passband_frequencies[0] - stopband_frequencies[0]] / nyq
N, beta = signal.kaiserord[min_loss_stopband, nyq_cutoff]
fir_b = signal.firwin[N, passband_frequencies, window=['kaiser', beta], fs=sampling_frequency, pass_zero=False, scale=False]
fir_a = 1.0
w, h = signal.freqz[fir_b, fir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Kaiser FIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
1 sử dụng rất nhiều C đã biên dịch. Không chắc là tôi có thể cải thiện hiệu suất của mã bên dưới nyq_cutoff = [passband_frequencies[0] - stopband_frequencies[0]] / nyq
N, beta = signal.kaiserord[min_loss_stopband, nyq_cutoff]
fir_b = signal.firwin[N, passband_frequencies, window=['kaiser', beta], fs=sampling_frequency, pass_zero=False, scale=False]
fir_a = 1.0
w, h = signal.freqz[fir_b, fir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Kaiser FIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
1. Nhưng nếu chúng ta thử sử dụng hai bộ lọc nhỏ hơn thì sao?Trước tiên, hãy để tôi chạy lại đường cơ sở để có được mức trung bình tốt hơn
print["Average baseline IIR time = {}".format[timeit.timeit[lambda: signal.lfilter[iir_b, iir_a, x, axis=1], number=10] / 10]]
Average baseline IIR time = 0.6693926614000703
Bây giờ hãy để tôi thiết kế hai bộ lọc thứ tự 1 mới
b_hp, a_hp = signal.butter[1, normal_cutoff[0], btype="highpass", fs=sampling_frequency]
w, h = signal.freqz[b_hp, a_hp, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
b_lp, a_lp = signal.butter[1, normal_cutoff[1], btype="lowpass", fs=sampling_frequency]
w, h = signal.freqz[b_lp, a_lp, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
0sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
1Doh. Đó là một chút chậm hơn. Chúng ta có thể kết hợp các bộ lọc đó với một convolve. Hãy thử điều đó
Kết hợp các bộ lọc riêng biệt
Hãy nhớ rằng lọc là một hoạt động tích chập. Và tích chập là kết hợp. Tôi. e. hãy tưởng tượng hai bộ lọc, a và b, một tín hiệu x và một tích chập C. Lọc tín hiệu x bằng bộ lọc a là C[x, a]. Sử dụng hai bộ lọc. C[ C[x, a], b]. Cái nào giống như. C[x, C[a, b]]. Do đó, trước tiên hãy kết hợp các bộ lọc lại với nhau và bạn sẽ có một bộ lọc duy nhất
sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
2sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
3Tuyệt, nhanh hơn. Nhưng tôi nghi ngờ nó giống như chỉ sử dụng thứ tự 2 trong thiết kế bộ lọc
sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
4sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
5sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
6Chuẩn rồi. chúng ta đi thôi. Thiết kế bộ lọc thông cao/thông thấp riêng lẻ có hiệu suất giống như thông dải cùng thứ tự [1 + 1 trong ví dụ này]. Thiết kế riêng lẻ có thể hữu ích nếu bạn có các yêu cầu khác nhau
Kết hợp bộ lọc IIR và FIR
Còn việc sử dụng bộ lọc IIR cho HP, sau đó là FIR cho LP thì sao?
sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
7sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
8sampling_frequency = 10000.0 # Sampling frequency in Hz
nyq = sampling_frequency * 0.5 # Nyquist frequency
passband_frequencies = [5.0, 150.0] # Filter cutoff in Hz
stopband_frequencies = [1.0, 1000.0]
max_loss_passband = 3 # The maximum loss allowed in the passband
min_loss_stopband = 30 # The minimum loss allowed in the stopband
x = np.random.random[size=[5000, 12500]] # Random data to be filtered
9Không, vẫn còn rất nghèo
kết luận
order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
1 và order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
0 đã được tối ưu hóa đến mức bạn khó có thể cải thiện hiệu suất bằng cách viết các phương pháp lọc của riêng mình. Điều này có nghĩa là hiệu suất của bộ lọc hoàn toàn được xác định bởi định nghĩa bộ lọc của bạn và thứ tự của bộ lọc. Bậc cao hơn có nghĩa là nhiều phép nhân hơnVì vậy, nếu bạn chủ yếu quan tâm đến hiệu suất, hãy sử dụng bộ lọc IIR và giữ thứ tự càng thấp càng tốt. Nếu bạn có các yêu cầu khác nhau đối với tần số cắt cao hoặc thấp thì hãy thiết kế chúng một cách độc lập và kết hợp
Về mặt tăng tốc hiệu suất của
order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
1, sau đó sử dụng nhiều luồng để lọc các kênh riêng biệt hoặc sử dụng triển khai Python hoặc order, normal_cutoff = signal.buttord[passband_frequencies, stopband_frequencies, max_loss_passband, min_loss_stopband, fs=sampling_frequency]
iir_b, iir_a = signal.butter[order, normal_cutoff, btype="bandpass", fs=sampling_frequency]
w, h = signal.freqz[iir_b, iir_a, worN=np.logspace[0, 3, 100], fs=sampling_frequency]
plt.semilogx[w, 20 * np.log10[abs[h]]]
plt.title['Butterworth IIR bandpass filter fit to constraints']
plt.xlabel['Frequency [Hz]']
plt.ylabel['Amplitude [dB]']
plt.grid[which='both', axis='both']
plt.show[]
1 khác để tận dụng hỗ trợ đa đầu