python实现信号的抽样和内插

###matlab转python实现系列(二)

信号的抽样和内插

程序结构
定义基础函数:产生方波,时频转化
定义功能函数:show_sin
定义功能函数:show_rec
定义功能函数:show_trg
定义离散信号,作图显示原信号
正常采样,显示采样信号
欠采样,显示采样信号
还原并显示信号
前示信号时频转换,显示频谱图
自定义函数
#定义Rect wave函数 Rec_wav

#第一个参数为方波时间对应的list,第二个参数为方波的幅度。

def Rec_wave(x,A):
#定义Frequece Amplitude函数 Fre_ampl

#第一个参数为信号时间的list,第二个参数为信号对应时间的幅度的list
#返回两个参数,第一个参数为frequecy的list(所得频率序列需除以总时长),第二个参数为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.

在三个show函数里:首先进行原信号的定义,之后利用离散信号的性质设定合适的抽样频率(F>2fmax)进行抽样,频率选择较低则会欠抽样。

b.

设置合适频率的低频滤波器,f<100Hz。对抽样信号进行还原滤波。得出还原信号。

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()
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值