python实现 线性卷积用Toeplitz 矩阵运算

python实现 线性卷积用Toeplitz 矩阵运算

前言

在看论文的时候,发现Toeplitz 矩阵和线性卷积有关系,于是翻了程佩青老师的数字信号处理课本,发现是有讲过这点的。

Toeplitz 矩阵:从左上到右下的斜对角线都相同,如下
在这里插入图片描述

引子

以这道题为例子编程

在这里插入图片描述

python代码

一维情况

import numpy as np
from scipy.linalg import toeplitz

a=[3,7,5,-1,2]
b=[4,-1,2,3]
c_len=len(a)+len(b)-1

#把向量b变成Toeplitz 矩阵
col=[b[0] if i==0 else 0 for i in range(len(a))]
row=b+[0]*(c_len-len(b))
t = toeplitz(col,row)

c=np.dot(np.array(a),t)
print(c)

二维情况

import numpy as np

def convolution_to_matmul_2d(a,b,mode='same'):
    ''' 
    a: 1*n 
    b: m*k
    Toeplitz is (n+m-1)*m ,which is transforms from a.
    so a convolved with b becomes Toeplitz multiplied by b
    
    比如在地震反演中,反射系数与子波相卷积,子波是一维的雷克子波a,反射系数是二维的矩阵b
    exp:
    a = np.array([4,-1, 2, 3])
    b = np.array([[3,7,5,-1,2],
                [3,7,5,-1,2],
                [3,7,5,-1,2]]).T
    toeplitz_matrix.T: array([[ 4., -1.,  2.,  3.,  0.,  0.,  0.,  0.]
,
                              [ 0.,  4., -1.,  2.,  3.,  0.,  0.,  0.],
                              [ 0.,  0.,  4., -1.,  2.,  3.,  0.,  0.],
                              [ 0.,  0.,  0.,  4., -1.,  2.,  3.,  0.],
                              [ 0.,  0.,  0.,  0.,  4., -1.,  2.,  3.]])
    convolution_result: array([[12., 12., 12.],
                               [25., 25., 25.],
                               [19., 19., 19.],
                               [14., 14., 14.],
                               [40., 40., 40.],
                               [11., 11., 11.],
                               [ 1.,  1.,  1.],
                               [ 6.,  6.,  6.]])
    '''
    n=a.shape[0]
    m=b.shape[0]
    k=b.shape[1]

    ic(n,m)

    # 创建 Toeplitz 矩阵
    toeplitz_matrix=np.zeros((n+m-1,m))
    for i in range(len(b)):
        toeplitz_matrix[i:i+len(a), i] = a

    convolution_result=np.matmul(toeplitz_matrix,b)
    if mode =="same":
        convolution_result=convolution_result[n//2:n//2+m,:]
        # convolution_result=convolution_result[n//2:n//2+m,:]
    
    ic(convolution_result.shape)

    return convolution_result

record=convolution_to_matmul_2d(ricker_wavelet,reflection)
plt.imshow(record,cmap=plt.cm.seismic)
plt.title("record")

原理解释

书上P18把这个线性卷积如何变成矩阵推导的很详细,就不赘述了。最后可见H矩阵是依次循环右移一位后下移一行,使得形成各对角线相同的矩阵,即Toeplitz矩阵。

依次循环右移一位后下移一行,使得形成各对角线相同的矩阵,即Toeplitz矩阵。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Mally呀!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值