濾波器在數(shù)字信號(hào)處理中扮演著非常重要的角色,能夠有效地去除噪聲并提高信號(hào)品質(zhì)。在Python中,設(shè)計(jì)濾波器非常容易,可以使用signal模塊提供的濾波器設(shè)計(jì)函數(shù)。下面我們就使用Python來示例說明如何進(jìn)行濾波器設(shè)計(jì)。
# 導(dǎo)入必要的庫 import numpy as np import matplotlib.pyplot as plt from scipy import signal # 設(shè)計(jì)濾波器 fs = 1000 # 采樣頻率 f1 = 50 # 截止頻率1 f2 = 100 # 截止頻率2 b, a = signal.butter(4, [2*f1/fs, 2*f2/fs], 'bandpass') # 生成Butterworth帶通濾波器系數(shù) # 繪制濾波器特性 w, h = signal.freqz(b, a) # 計(jì)算濾波器頻率響應(yīng) fig, ax = plt.subplots() ax.plot(fs*w/np.pi/2, np.abs(h)) ax.set(title='Filter Frequency Response', xlabel='Frequency (Hz)', ylabel='Amplitude') ax.grid() plt.show()
以上代碼中,我們使用了butter()函數(shù)來生成一個(gè)Butterworth帶通濾波器。參數(shù)'4'表示濾波器的階數(shù),[2*f1/fs, 2*f2/fs]表示濾波器的通帶邊界,'bandpass'表示濾波器類型為帶通濾波器。
# 加載信號(hào) t = np.linspace(0, 1, fs, endpoint=False) noise = np.random.randn(fs) # 加入高斯白噪聲 signal = np.sin(2*np.pi*50*t) + np.sin(2*np.pi*100*t) # 兩個(gè)正弦信號(hào)疊加 noisy_signal = signal + 0.5*noise # 觀測信號(hào)加上噪聲 # 過濾信號(hào) filtered_signal = signal.filtfilt(b, a, noisy_signal) # 繪制信號(hào) fig, ax = plt.subplots() ax.plot(t, noisy_signal, label='Noisy Signal') ax.plot(t, filtered_signal, label='Filtered Signal') ax.set(title='Signal Filtering', xlabel='Time (s)', ylabel='Amplitude') ax.legend(loc='upper right') ax.grid() plt.show()
由上述代碼可知,我們使用filtfilt()函數(shù)將濾波器作用于觀測信號(hào)noisy_signal上,得到濾波后的信號(hào)filtered_signal。將觀測信號(hào)和濾波后的信號(hào)放在同一張圖上進(jìn)行比較,可以明顯看出濾波后信號(hào)的噪聲得到了有效地抑制。
以上是Python中設(shè)計(jì)濾波器的基本方法,在實(shí)際應(yīng)用中可以根據(jù)具體問題來調(diào)整濾波器的階數(shù)、類型和通帶邊界等參數(shù)。