Advertisement

【python数字信号处理】——循环卷积(也叫圆圈卷积)

阅读量:

目录

一、公式

二、代码

方法一:遍历

方法二:利用卷积定理


一、公式

循环卷积_百度百科循环卷积(circular convolution) 不同于线性卷积的一种卷积运算,是周期卷积的一种。https://baike.baidu.com/item/%E5%BE%AA%E7%8E%AF%E5%8D%B7%E7%A7%AF/16600419?fr=aladdin


特点:假设序列1长度N,序列2长度N,则循环卷积结果长度依旧为N

二、代码

方法一:遍历

复制代码
 # 循环卷积

    
 def cc(x1,x2):
    
  
    
 	# 计算两个列表的对应元素乘积之和
    
 	def sum_(x1,x2):
    
 		sumV = 0
    
 		for i in range(len(x1)):
    
 			sumV += x1[i]*x2[i]
    
 		return sumV
    
  
    
 	N = len(x1) # 共4步
    
 	x0 = [0 for _ in range(N)]
    
 	X = []
    
 	for i in range(N):
    
 		sumV = sum_(x1,x2)
    
 		x0[i] = sumV
    
 		X.append(x0[:])
    
 		x1 = [x1[-1]] + x1[:-1]
    
 	return X
    
  
    
 if __name__ == '__main__':
    
 	x = [1,1,1,1]
    
 	y = [4,3,2,1]
    
 	print(cc(x,y))
    
    
    
    

[[10,0,0,0],[10,10,0,0].[10,10,10,0],[10,10,10,10]]

方法二:利用卷积定理

1、先求两个序列的DFT变换序列;

2、求DFT变换后的序列之积;

3、对序列之积拟傅里叶变换IDFT

复制代码
 def synthesis_matrix(N):

    
 	ts = np.arange(N) / N
    
 	freqs = np.arange(N)
    
 	args = np.outer(ts, freqs)
    
 	M = np.exp(1j * PI2 * args)
    
 	return M
    
  
    
  
    
 def dft(ys):
    
 	N = len(ys)
    
 	M = synthesis_matrix(N)
    
 	amps = M.conj().transpose().dot(ys)
    
 	return amps
    
  
    
  
    
 def idft(amps):
    
 	N = len(amps)
    
 	M = synthesis_matrix(N)
    
 	ys = M.dot(amps) / N
    
 	return ys
    
    
    
    

原序列

DFT变换

DFT变换后序列乘积

逆傅里叶变换IDFT

全部评论 (0)

还没有任何评论哟~