1.1 直接I型
1.2 算法實現
class filter:
def __init__(self,):
pass
def IIR_Filter_I(self,input_array,a_weight,b_weight,Scale_Factors):
output_array=[0,0,0]
y_0 = 0
y_1 = 0
y_2 = 0
x_0 = input_array[0]
x_1 = 0
x_2 = 0
for index_vi in range(1,len(input_array)):
y = (x_0 * b_weight[0] + x_1 *b_weight[1] + x_2*b_weight[2] + y_0 * a_weight[0] + y_1 *a_weight[1]+ y_2 *a_weight[2])*Scale_Factors
x_2=x_1
x_1=x_0
x_0=input_array[index_vi]
y_2=y_1
y_1=y_0
y_0=y
output_array.append(y*Scale_Factors)
return output_array
def IIR_Filter_II(self,vi):
pass
1.3 數據仿真
以下代碼實現一個二階高通濾波器,藍色的是原數據,紅色的是濾波後的數據:
對原數據和濾波後的數據進行FFT分析:
可見低於200Hz的信號被濾掉,紅線是原數據的頻譜圖,藍線對應濾波後的頻譜圖。
採用的是fdatool工具,生成的是截止頻率是200Hz的濾波參數。
完整代碼如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft,ifft
a_weight=[1 , -0.369527377351242, 0.195815712655833]
b_weight=[1 , -2 , 1]
Scale_Factors =0.391335772501769
class filter:
def __init__(self,):
pass
def IIR_Filter_I(self,input_array,a_weight,b_weight,Scale_Factors):
output_array=[0,0,0]
y_0 = 0
y_1 = 0
y_2 = 0
x_0 = input_array[0]
x_1 = 0
x_2 = 0
for index_vi in range(1,len(input_array)):
y = (x_0 * b_weight[0] + x_1 *b_weight[1] + x_2*b_weight[2] + y_0 * a_weight[0] + y_1 *a_weight[1]+ y_2 *a_weight[2])*Scale_Factors
x_2=x_1
x_1=x_0
x_0=input_array[index_vi]
y_2=y_1
y_1=y_0
y_0=y
output_array.append(y*Scale_Factors)
return output_array
def IIR_Filter_II(self,vi):
pass
#採樣點選擇1400個,因爲設置的信號頻率分量最高爲600Hz,根據採樣定理知採樣頻率要大於信號頻率2倍,所以這裏設置採樣頻率爲1400Hz(即一秒內有1400個採樣點)
x=np.linspace(0,1,1200)
#設置需要採樣的信號,頻率分量有180,390和600
signal=np.sin(2*np.pi*50*x) + np.sin(2*np.pi*150*x) + np.sin(2*np.pi*400*x)
signal_fft=fft(signal) #快速傅里葉變換
signal_fft_abs=abs(fft(signal)) # 取模
signal_fft_abs_norm=abs(fft(signal))/((len(signal)/2)) #歸一化處理
signal_fft_abs_norm_half= signal_fft_abs_norm[range(int(len(signal)/2))] #由於對稱性,只取一半區間
signal_fft_abs_size =np.arange(len(signal)) # 頻率
IIR_filter=filter()
#混合波的FFT(雙邊頻率範圍)
IIR_Output = IIR_filter.IIR_Filter_I(signal,a_weight,b_weight,Scale_Factors)
IIR_Output_Size = len(IIR_Output)
plt.figure(1)
plt.plot(signal[0:50],'b') #顯示原始信號的FFT模值
plt.plot(IIR_Output[0:50],'r') #顯示原始信號的FFT模值
IIR_Output = np.array(IIR_Output)
IIR_Output_fft=fft(IIR_Output) #快速傅里葉變換
IIR_Output_fft_abs=abs(fft(IIR_Output)) # 取模
IIR_Output_fft_abs_norm=abs(fft(IIR_Output))/((len(IIR_Output)/2)) #歸一化處理
IIR_Output_fft_abs_half = IIR_Output_fft_abs_norm[range(int(len(IIR_Output)/2))] #由於對稱性,只取一半區間
IIR_Output_fft_abs_size = np.arange(len(IIR_Output_fft_abs_norm)) # 頻率
plt.figure(2)
plt.plot(signal_fft_abs_size,signal_fft_abs_norm[0:1200],'r') #顯示原始信號的FFT模值
plt.plot(IIR_Output_fft_abs_size,IIR_Output_fft_abs_norm,'g') #顯示原始信號的FFT模值
plt.show()
2.1直接II型
2.2 算法實現
class filter:
def __init__(self,):
pass
def IIR_Filter_II(self,input_array,a_weight,b_weight,Scale_Factors):
output_array=[0]
x_0 = input_array[0]
w_0 = 0
w_1 = 0
w_2 = 0
for index_vi in range(0,len(input_array)):
x_0 = input_array[index_vi]
w_n = x_0 - ( a_weight[0]*w_0 + a_weight[1]*w_1 + a_weight[2]*w_2)
y = b_weight[0]*w_0 + b_weight[1]*w_1 + b_weight[1]*w_2
#w_0 = w_1
w_2 = w_1
w_1 = w_0
w_0 = w_n
output_array.append(y*Scale_Factors )
return output_array
2.3 數據仿真
略