pythonは信号のサンプリングと補間を実現する

90055 ワード

###matlab回転python実装シリーズ(二)
信号のサンプリングと補間
プログラムこうぞう
基底関数の定義きそかんすう:正方波の生成、時周波数変換ほうこうはのせいせい、じしゅうはすうへんかん
機能関数の定義:show_sin
機能関数の定義:show_rec
機能関数の定義:show_trg
離散信号を定義し、元の信号を表示します.
通常のサンプリング、サンプリング信号の表示
アンダーサンプリング、サンプリング信号の表示
信号を復元して表示
前示信号時周波数変換、スペクトル表示
カスタム関数
#Rect wave関数の定義Rec_wav
#1番目のパラメータは方波時間に対応するlistであり、2番目のパラメータは方波の振幅である.
def Rec_wave(x,A):

#定義Frequece Amplitude関数Fre_ampl
#1番目のパラメータは信号時間のlist、2番目のパラメータは信号対応時間の振幅のlist#は2つのパラメータを返します.1番目のパラメータはfrequecyのlist(得られた周波数シーケンスは総時間で除算する必要があります)、2番目のパラメータはamplitudeのlistです.
def Fre_ampl(x,y):

#Show sin関数の定義Show_sin
#正弦波信号の元信号時間領域図、正常サンプリング時間領域図、欠サンプリング時間領域図、還元信号時間領域図を表示する.元信号周波数領域図、正常サンプリング周波数領域図、欠サンプリング周波数領域図、還元信号周波数領域図.
def Show_sin():

#Show rec関数の定義Show_rec
#正方波信号の元信号時間領域図、正常サンプリング時間領域図、欠サンプリング時間領域図、還元信号時間領域図を表示する.元信号周波数領域図、正常サンプリング周波数領域図、欠サンプリング周波数領域図、還元信号周波数領域図.
def Show_rec():

#Show Trg関数の定義Show_trg
#三角波信号の元信号時間領域図、正常サンプリング時間領域図、欠サンプリング時間領域図、還元信号時間領域図を表示する.元信号周波数領域図、正常サンプリング周波数領域図、欠サンプリング周波数領域図、還元信号周波数領域図.
def Show_trg():

主なプロセス
a.
3つのshow関数では,まず原信号の定義を行い,その後離散信号の性質で適切なサンプリング周波数(F>2 fmax)を設定してサンプリングを行い,周波数選択が低いとサンプリングを欠く.
b.
適切な周波数の低周波フィルタ、f<100 Hzを設定します.サンプリング信号を還元フィルタリングする.還元信号が出る.
c.
上記信号を周波数領域で変換(フーリエ変化,片側処理,正規化処理)し,表示する.
全体コードを添付
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
import math
import scipy.integrate as si


##  Rect wave   Rec_wav
#             list,           。
def Rec_wave(x,A):
	y=np.zeros(len(x))
	for i in range(1,101,2):
		y+=4*A/np.pi*np.sin(2*np.pi*i*x)/i
	return y
		
#  Frequece Amplitude   Fre_ampl
#           list,                list
#      ,      frequecy list(            ),      amplitude list
def Fre_ampl(x,y):
	y_f=np.fft.fft(y)
	f=np.arange(len(x))
	abs_y=np.abs(y_f)
	normalization_y=abs_y/(len(x)) 
	half_x=f[range(int(len(x)/2))]
	normalization_y=normalization_y[range(int(len(x)/2))]
	return half_x,normalization_y

#  Show sin   Show_sin
def Show_sin():
	#      
	t=np.arange(0,1,0.001)
	#     
	y_sin=3*np.sin(12*np.pi*t)
	plt.figure(num=1,figsize=(8,6))
	plt.subplot(2,2,1)
	plt.axis([0,1.05,-3.2,3.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.plot(t,y_sin,'b')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	#    
	y_sin1=y_sin.copy()
	i=0
	N=15
	while i<N:
		y_sin1[i::N+1]=0
		i=i+1
	plt.subplot(2,2,2)
	plt.axis([0,1.05,-3.2,3.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.vlines(t,0,y_sin1,'r')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	#   
	y_sin2=y_sin.copy()
	i=0
	N=47
	while i<N:
		y_sin2[i::N+1]=0
		i=i+1		
	plt.subplot(2,2,3)
	plt.axis([0,1.05,-3.2,3.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.vlines(t,0,y_sin2,'c')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	#    
	b,a=signal.iirdesign(0.08, 0.1, 1, 40) #       
	y_sinh1=signal.filtfilt(b, a, y_sin1)
	y_sinh2=signal.filtfilt(b, a, y_sin2)
	plt.subplot(2,2,4)
	plt.axis([0,1.05,-0.5,0.5])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.plot(t,y_sinh1,color='r',label='enough')
	plt.plot(t,y_sinh2,color='c',label='low')
	plt.legend(loc='upper right')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	"""      """
	plt.figure(num=2,figsize=(8,6))
	f_sin,am_sin=Fre_ampl(t,y_sin)
	f_sin1,am_sin1=Fre_ampl(t,y_sin1)
	f_sin2,am_sin2=Fre_ampl(t,y_sin2)
	f_sinh1,am_sinh1=Fre_ampl(t,y_sinh1)
	f_sinh2,am_sinh2=Fre_ampl(t,y_sinh2)
	plt.subplot(5,1,1)
	plt.axis([0,10,0,3])
	plt.vlines(f_sin,0,am_sin,'b')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
	
	plt.subplot(5,1,2)
	plt.vlines(f_sin1,0,am_sin1,'r')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
	
	plt.subplot(5,1,3)
	plt.vlines(f_sin2,0,am_sin2,'c')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
	
	plt.subplot(5,1,4)
	plt.axis([0,10,0,0.1])
	plt.vlines(f_sinh1,0,am_sinh1,'r')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
	
	plt.subplot(5,1,5)
	#plt.axis([0,10,0,3])
	plt.vlines(f_sinh2,0,am_sinh2,'c')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
	
#  Show rectwave   Show_rec
def Show_rec():
	#      
	t=np.arange(0,1,0.001)
	#      
	y_rec=Rec_wave(t,3)
	plt.figure(num=1,figsize=(8,6))
	plt.subplot(2,2,1)
	plt.axis([0,1.05,-3.2,3.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.plot(t,y_rec,'b')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	#    
	y_rec1=y_rec.copy()
	i=0
	N=15
	while i<N:
		y_rec1[i::N+1]=0
		i=i+1
	plt.subplot(2,2,2)
	plt.axis([0,1.05,-3.2,3.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.vlines(t,0,y_rec1,'r')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	#   
	y_rec2=y_rec.copy()
	i=0
	N=95
	while i<N:
		y_rec2[i::N+1]=0
		i=i+1
	plt.subplot(2,2,3)
	plt.axis([0,1.05,-3.2,3.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.vlines(t,0,y_rec2,'c')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	#    
	b,a=signal.iirdesign(0.08, 0.1, 1, 40) #       
	y_rech1=signal.filtfilt(b, a, y_rec1)
	y_rech2=signal.filtfilt(b, a, y_rec2)
	plt.subplot(2,2,4)
	plt.axis([0,1.05,-0.3,0.3])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.plot(t,y_rech1,color='r',label='enough')
	plt.plot(t,y_rech2,color='c',label='low')
	plt.legend(loc='upper right')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	plt.figure(num=2,figsize=(8,6))
	f_rec,am_rec=Fre_ampl(t,y_rec)
	f_rec1,am_rec1=Fre_ampl(t,y_rec1)
	f_rec2,am_rec2=Fre_ampl(t,y_rec2)
	f_rech1,am_rech1=Fre_ampl(t,y_rech1)
	f_rech2,am_rech2=Fre_ampl(t,y_rech2)
	plt.subplot(5,1,1)
	plt.axis([0,10,0,3])
	plt.vlines(f_rec,0,am_rec,'b')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
	
	plt.subplot(5,1,2)
	plt.vlines(f_rec1,0,am_rec1,'r')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
	
	plt.subplot(5,1,3)
	plt.vlines(f_rec2,0,am_rec2,'c')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
	
	plt.subplot(5,1,4)
	plt.axis([0,10,0,0.1])
	plt.vlines(f_rech1,0,am_rech1,'r')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
	
	plt.subplot(5,1,5)
	#plt.axis([0,10,0,3])
	plt.vlines(f_rech2,0,am_rech2,'c')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
#  Show Trgwave   Show_trg
def Show_trg():	
	#      
	t=np.arange(0,1,0.001)
	#       
	n=1000
	y_trg = np.zeros(n)
	for i in range(1, n+1):
		y_trg += 12 / ((2 * i - 1) * np.pi*(2 * i - 1) * np.pi) * np.sin((2 * i - 1)*np.pi/2)* np.sin((2 * i - 1)*np.pi*100 * t)
	plt.figure(num=1,figsize=(8,6))
	plt.subplot(2,2,1)
	plt.axis([0,1.05,-3.2,3.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.plot(t,y_trg,'b')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	#    
	y_trg1=y_trg.copy()
	i=0
	N=15
	while i<N:
		y_trg1[i::N+1]=0
		i=i+1
	plt.subplot(2,2,2)
	plt.axis([0,1.05,-3.2,3.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.vlines(t,0,y_trg1,'r')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	#   
	y_trg2=y_trg.copy()
	i=0
	N=95
	while i<N:
		y_trg2[i::N+1]=0
		i=i+1
	plt.subplot(2,2,3)
	plt.axis([0,1.05,-3.2,3.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.vlines(t,0,y_trg2,'c')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	#    
	b,a=signal.iirdesign(0.08, 0.1, 1, 40) #       
	y_trgh1=signal.filtfilt(b, a, y_trg1)
	y_trgh2=signal.filtfilt(b, a, y_trg2)
	plt.subplot(2,2,4)
	plt.axis([0,1.05,-0.2,0.2])
	ax = plt.gca()
	ax.spines['right'].set_color('none')
	ax.spines['top'].set_color('none')
	ax.xaxis.set_ticks_position('bottom')
	ax.yaxis.set_ticks_position('left')
	ax.spines['bottom'].set_position(('data', 0))
	plt.plot(t,y_trgh1,color='r',label='enough')
	plt.plot(t,y_trgh2,color='c',label='low')
	plt.legend(loc='upper right')
	plt.xlabel('time/(s)')
	plt.ylabel('Amplitude/(V)')
	"""      """
	plt.figure(num=2,figsize=(8,6))
	f_trg,am_trg=Fre_ampl(t,y_trg)
	f_trg1,am_trg1=Fre_ampl(t,y_trg1)
	f_trg2,am_trg2=Fre_ampl(t,y_trg2)
	f_trgh1,am_trgh1=Fre_ampl(t,y_trgh1)
	f_trgh2,am_trgh2=Fre_ampl(t,y_trgh2)
	plt.subplot(5,1,1)
	plt.axis([0,500,0,0.7])
	plt.vlines(f_trg,0,am_trg,'b')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')

	plt.subplot(5,1,2)
	plt.vlines(f_trg1,0,am_trg1,'r')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')

	plt.subplot(5,1,3)
	plt.vlines(f_trg2,0,am_trg2,'c')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')

	plt.subplot(5,1,4)
	plt.axis([0,100,0,0.025])
	plt.vlines(f_trgh1,0,am_trgh1,'r')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')

	plt.subplot(5,1,5)
	#plt.axis([0,10,0,3])
	plt.vlines(f_trgh2,0,am_trgh2,'c')
	plt.xlabel('frequence/(Hz)')
	plt.ylabel('amplitude/(V)')
    
    
#Show_sin()
#Show_rec()
Show_trg()
plt.show()