DSP | 循环卷积python实现(含详细注释)

该代码示例展示了如何使用numpy库在Python中实现6点的循环卷积。通过零填充、周期延拓、序列翻折、循环移位和相乘相加等步骤,计算两个序列的循环卷积结果。此过程适用于理解和学习数字信号处理中的循环卷积概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

圆周(循环)卷积

介绍略

圆周(循环)卷积过程

以两个序列做6点循环卷积为例子

  1. 补零(当两序列长度不等于N时)
  2. 周期延拓(有限长序列变周期序列)
  3. 反褶,取主值序列(周期序列的反褶)
  4. 圆周(循环)移位
  5. 在主值区间内进行相乘相加

代码实现

import numpy as np

# 填充零
def zero_padding(a, b, max_len):
    max_len = 6
    padded_a = np.pad(a, (0, max_len - len(a)), 'constant')
    padded_b = np.pad(b, (0, max_len - len(b)), 'constant')
    return padded_a, padded_b

def circular_convolution(a, b, N):
    # 零填充序列
    padded_a, padded_b = zero_padding(a, b, N)
    print("填充的序列\n{}\n{}".format(padded_a,padded_b))
    
    # 周期延拓若干次
    periodic_a = np.tile(padded_a, 3)
    periodic_b = np.tile(padded_b, 3)
    print("周期延拓\n{}\n{}".format(periodic_a,periodic_b))
    
    # 以原点为轴进行反褶
    flipped_b = np.zeros_like(periodic_b) 
    for i in range(len(flipped_b)):
        flipped_b[i] = periodic_b[-i+6] 
    print("翻折b序列\n{}\n".format(flipped_b))

    # 取主值区间进行相乘相加
    result = np.zeros(N)
    for i in range(N):
        # 向右循环移位
        shifted_b = np.roll(flipped_b, i)[:N]
        # print("b循环移位\n{}\n".format(shifted_b))
        # 相乘相加
        result[i] = np.sum(periodic_a[:N] * shifted_b)
    print("循环卷积结果\n{}\n".format(result))
    return result

# 做以下两个序列的6点循环卷积
a = np.array([1, 1, 1, 1, 1])
b = np.array([1, 2, 3])

# 以6点做循环 卷积
circular_conv_result = circular_convolution(a, b, 6)

这段代码首先对输入序列a和b进行零填充,使它们的长度达到6。然后对填充后的序列进行周期延拓,重复3次。接下来,对序列b进行翻折操作。之后,分别对翻折后的序列b进行循环移位,并与序列a进行相乘相加,最终得到循环卷积结果。

注意 本文参考华东理工大学《数字信号处理课程》关于循环卷积的内容用代码实现了一遍,有助于理解循环卷积的基本原理和操作,不代表真正的工程实现。

Reference

  • 视频链接
    https://www.bilibili.com/video/BV13P411P7Pv?p=42&vd_source=79bd183b688aadc954b121436a928d31
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值