图像处理之基础---线性卷积和循环卷积的区别

 两个序列的N点循环卷积定义为 
              
10
[()()]()(())NNN
khnxnhmxnm          (0)nN 
    从定义中可以看到,循环卷积和线性卷积的不同之处在于:两个N点序列的N点循环卷积的结果仍为N点序列,而它们的线性卷积的结果的长度为2N-1;循环卷积对序列的移位采取循环移位,而线性卷积对序列采取线性移位。正是这些不同,导致了线性卷积和循环卷积有不同的结果和性质。     循环卷积和线性卷积虽然是不用的概念,但它们之间由一个有意义的公式联系在一起 
()[()()](())()
NNrynhnxnynrNGn

 
其中()()()ynhnxn。 
    也就是说,两个序列的N点循环卷积是它们线性卷积以N为周期的周期延拓。设序列还()hn的长度为1N,序列()xn的长度为2N,此时,线性卷积结果的序列
的点数为121NNN
;因此如果循环卷积的点数N小于121NN,那么上述周期性延拓的结果就会产生混叠,从而两种卷积会有不同的结果。而如果N满足NN的条件,就会有 
()()ynyn    (0)nN 
     这就意味着时域不会产生混叠。因此,我们得出结论:若通过在序列的末尾填充适当的零值,使得()xn和()hn成为121NN点序列,并作为这两个序列的121NN循环卷积,那么循环卷积与线性卷积的结果在0nN范围内相同。 
    根据DFT循环卷积性质中卷积定理 
{[()()]}[()][()]NDFThnxnDFTxnDFThn 
便可通过两种方法求两个序列的循环卷积:一直直接根据定义计算;二是根据性质先分别求两个序列的N点DFT,并相乘,然后取IDFT以得到循环卷积。第二


2014年执业医师资格考试 医学综合笔试 临床执业医师 口腔执业医师 中医执业医师


种方法看起来要经过若干个步骤,但由于求序列的DFT和IDFT都有快速算法,因此它的效率比第一种方法高得多。 
     同样,根据线性卷积和循环卷积的关系,可以通过计算循环卷积以求得线性卷积,提高计算序列线性卷积的效率。

 

http://wenku.baidu.com/view/a1f077040740be1e650e9afd.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的线性卷积的 Python 代码: ```python import numpy as np def linear_convolution(x, h): N = len(x) M = len(h) y = np.zeros(N+M-1) for n in range(N+M-1): for k in range(max(, n-M+1), min(n+1, N)): y[n] += x[k] * h[n-k] return y ``` 其中,x 和 h 分别是输入信号和卷积核,N 和 M 分别是它们的长度,y 是卷积结果。这个代码使用了两个嵌套的循环来计算卷积,时间复杂度为 O(NM)。 ### 回答2: 线性卷积是一种常见的信号处理方法,常用于图像处理、语音识别等领域。下面是使用Python编写的线性卷积代码示例。 ```python import numpy as np def linear_convolution(signal, kernel): signal_length = len(signal) kernel_length = len(kernel) output_length = signal_length + kernel_length - 1 # 将信号和卷积核补零,使得两者长度相等 padded_signal = np.pad(signal, (0, kernel_length-1), 'constant') padded_kernel = np.pad(kernel, (0, signal_length-1), 'constant') # 执行线性卷积 convolution = np.zeros(output_length) for i in range(output_length): convolution[i] = np.dot(padded_signal[i:i+kernel_length], padded_kernel[::-1]) return convolution # 测试代码 signal = np.array([1, 2, 3, 4, 5]) kernel = np.array([0.5, 1, 0.5]) convolution_result = linear_convolution(signal, kernel) print(convolution_result) ``` 以上代码实现了线性卷积的过程。在该示例中,输入的信号为[1, 2, 3, 4, 5],卷积核为[0.5, 1, 0.5]。函数`linear_convolution`根据输入信号和卷积核的长度计算出输出结果的长度,并在输入信号两端补零以保持相同长度。然后使用循环计算每个输出元素的值,通过点乘计算输入信号的一部分和卷积核的倒序的点积。最后返回卷积结果。 在测试代码中,对输入信号进行线性卷积,并打印输出结果。输出结果为线性卷积的结果。 ### 回答3: 线性卷积是一种常见的信号处理技术,可以通过Python来实现。下面是一个简单的示例代码: ```python import numpy as np def linear_convolution(x, h): # 获取输入信号和卷积核的长度 m = len(x) n = len(h) # 补零操作,将输入信号和卷积核的长度变为m+n-1 z = np.zeros(m + n - 1) x_pad = np.pad(x, (0, n-1), 'constant') h_pad = np.pad(h, (0, m-1), 'constant') # 线性卷积计算 for i in range(m + n - 1): for j in range(m): if i >= j and i - j < n: z[i] += x_pad[j] * h_pad[i - j] return z # 测试示例 x = np.array([1, 2, 3, 4, 5]) h = np.array([0.5, 0.5, 0.5]) result = linear_convolution(x, h) print(result) ``` 这段代码首先定义了一个linear_convolution函数,该函数接受两个一维数组x和h作为输入,并返回它们的线性卷积结果z。 在函数内部,首先获取输入数组的长度m和卷积核的长度n。然后进行零填充操作,将数组长度变为m+n-1,以便进行卷积计算。 接下来,通过两层循环计算卷积结果。外层循环遍历结果数组z的每个元素,内层循环遍历输入信号数组x的每个元素。通过判断当前元素的位置是否在卷积核的有效范围内,如果是,则将对应位置的元素相乘并相加,得到该位置的卷积结果。 最后,返回卷积结果z并进行打印输出。 在示例中,输入信号数组x为[1, 2, 3, 4, 5],卷积核数组h为[0.5, 0.5, 0.5],运行代码后得到的线性卷积结果为[0.5, 1.5, 3.0, 4.5, 6.5, 5.0, 2.5]。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值