對于一個信號來說通常匯入工頻噪聲往往是因為交流電產生的電泳,影響了我們信號采集導致信號上存在工頻干擾。
那么matlab去除工頻干擾可以通過陷波濾波器實現。
在python中通常使用scipy.signal實現信號的處理。
Scipy的信號處理模塊(scipy.signal)來創(chuàng)建自定義的陷波濾波器。陷波濾波器通常用于去除特定頻率上的噪聲或干擾,比如電源線干擾。
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 生成示例數據,包括噪聲和帶有干擾的信號
fs = 1000 # 采樣頻率
t = np.arange(0, 1, 1/fs)
noise = 0.5 * np.sin(2 * np.pi * 50 * t) # 50 Hz噪聲
signal_with_noise = np.sin(2 * np.pi * 5 * t) + noise # 5 Hz信號 + 50 Hz噪聲
# 設計陷波濾波器來去除50 Hz干擾
f0 = 50.0 # 噪聲的中心頻率
Q = 30.0 # 帶寬
b, a = signal.iirnotch(f0, Q, fs)
# 使用濾波器來去除噪聲
filtered_signal = signal.lfilter(b, a, signal_with_noise)
# 繪制原始信號和去噪后的信號
plt.figure()
plt.subplot(2, 1, 1)
plt.plot(t, signal_with_noise, 'b', label='帶噪聲的信號')
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(t, filtered_signal, 'g', label='去噪后的信號')
plt.legend()
plt.tight_layout()
plt.show()
上述示例中,signal.iirnotch函數用于設計陷波濾波器的系數,然后使用signal.lfilter來應用該濾波器。這可以幫助去除信號中指定頻率的噪聲或干擾。
上圖中藍色的線條是,5Hz正弦波,和50Hz干擾正弦波的求和。
綠色的線,是我們規(guī)定去irrnotch函數中心頻率為50Hz,帶寬Q為30進行處理。
實際上說,原始信號有一個正弦信號5Hz。
但是為什么濾波之后原始信號不是光滑的呢?
需要考慮陷波濾波器中心頻率的帶寬。
在陷波濾波器中,帶寬Q(Quality Factor)表示濾波器的調制深度或選擇性。它是一個無單位的參數,通常用于定義陷波濾波器的性能。
帶寬Q的值越大,濾波器的選擇性越高,也就是濾除特定頻率附近的信號時,對該頻率的抑制會更強。帶寬Q的值越小,濾波器的選擇性越低,也就是濾除特定頻率附近的信號時,對該頻率的抑制會較弱。
具體來說,對于陷波濾波器,Q的計算公式通常如下:
Q = f0 / Δf
Q是帶寬Q。
f0是你希望去除的頻率的中心點。
Δf是帶寬,表示你希望保留的頻率范圍。
Q的值越大,帶寬越小,濾波器越窄,抑制特定頻率的效果越強。Q的值越小,帶寬越大,濾波器越寬,抑制效果越弱。選擇Q值的大小通常取決于你的應用和數據中噪聲或干擾的性質。常見的Q值范圍通常在10到100之間。
在陷波濾波器設計中,選擇適當的Q值對于有效地去除特定頻率的干擾非常重要。你需要根據具體的應用和數據特點來調整Q值,以獲得最佳的濾波效果。
通過對比四個不同的帶寬q=1,10,50,100。我們可以觀察波形得到結果。
當q=1的時候最接近原始期望得到的5Hz正弦波。但是產生了導數超調,在開始的位置有一個小翹起,那說明就是并不是理想的濾波器?;蛘哒f很難得到理想的濾波效果。信號的起始端和結束端都會產生該結果。
在信號處理中,濾波操作可能會引入一些邊界效應,特別是在信號的開始和結束段,這種現象通常被稱為"邊界效應"或"邊界偽像"。這是由于濾波器的有限長度以及信號的截斷所引起的。
那為什么濾波結束開始端會產生波動,但是信號的結尾段不會產生波動?
邊界效應的主要原因包括以下幾點:
信號截斷:通常,你對一個連續(xù)的信號進行離散采樣,然后在有限長度的窗口內進行濾波。這會導致信號在開始和結束時被截斷,因此,信號在這些邊界處可能不連續(xù)。
**濾波器的有限長度:**濾波器通常是有限長度的,而不是無限長度。這意味著濾波器本身在時間或頻率上也存在截斷。當你將有限長度的濾波器應用于信號時,它會影響信號的邊界處,引入額外的波動。
**初始條件和階躍響應:**在濾波器的應用過程中,初始條件和濾波器的階躍響應可能會導致邊界效應。這些效應在濾波器開始和結束時可能會更為顯著。
通常情況下,信號處理中的邊界效應是不可避免的,并且可能因濾波器類型、信號特性和截斷方式而異。為了減輕這些效應,你可以考慮以下方法:
使用合適的邊界處理:一種方法是在信號的開始和結束時應用邊界處理技術**,如零填充**、周期延拓或反射延拓,以減少邊界效應的影響。
使用長濾波器:使用更長的濾波器可以減少濾波器的有限長度效應,但也會增加計算成本。
謹慎選擇濾波器類型:不同類型的濾波器在邊界效應方面有不同的性質,因此根據具體應用的需要選擇適當的濾波器類型。
考慮后處理:在濾波后,對信號的邊界段進行后處理,以減小邊界效應的影響。
綜上所述,邊界效應是信號處理中的常見問題,可以通過適當的處理方法和濾波器選擇來減輕其影響。
為了最終得到完美的濾波器,我們可以考慮零相位濾波器,簡單來說就是這種濾波器進行雙向濾波一定程度上減少了邊界效應。
直接上代碼和結果文章來源:http://www.zghlxwxcb.cn/news/detail-716556.html
# 開發(fā)時間:2023/10/25 22:22
# 開發(fā)內容:
# 運行環(huán)境:
# 備注內容:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 生成示例數據,包括噪聲和帶有干擾的信號
fs = 1000 # 采樣頻率
t = np.arange(0, 1, 1/fs)
fs =1000
t =np.arange(0,1,1/fs)
noise = 0.5 * np.sin(2 * np.pi * 50 * t) # 50 Hz噪聲
signal_with_noise = np.sin(2 * np.pi * 5 * t) + noise # 5 Hz信號 + 50 Hz噪聲
# 設計陷波濾波器來去除50 Hz干擾
f0 = 50.0 # 噪聲的中心頻率
Q = 0.2# 帶寬-------------------------------------------修改之處
b, a = signal.iirnotch(f0, Q, fs)
# 使用濾波器來去除噪聲--------------------------------------修改之處
filtered_signal = signal.filtfilt(b, a, signal_with_noise)
# 繪制原始信號和去噪后的信號
plt.figure(1)
plt.subplot(2, 1, 1)
plt.plot(t, signal_with_noise, 'b', label='帶噪聲的信號')
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(t, filtered_signal, 'g', label='q=100')
plt.legend()
plt.tight_layout()
plt.show()
fs=1000
t =np.arange(0,1,1/fs)
signalwave =np.sin(2*np.pi*5*t)
plt.figure(2)
plt.plot(signalwave,label="5Hz-sin")
plt.legend()
plt.show()
效果已經很好那么我們要是使用截斷法,可以截斷尾部的信號。而且我們這個濾波之后的信號不存在相位移動。。文章來源地址http://www.zghlxwxcb.cn/news/detail-716556.html
到了這里,關于【Python 算法】信號處理通過陷波濾波器準確去除工頻干擾的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!