首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Python测试卷积定理?

如何使用Python测试卷积定理?
EN

Stack Overflow用户
提问于 2019-04-29 02:26:34
回答 1查看 1.1K关注 0票数 1

我试图证明,如果DFT(y)=DFT(x) * DFT(h),那么y=x * h。我使用了np.fft.ifft属性,但第二个表达式的计算结果不是True。代码如下:

代码语言:javascript
运行
复制
import numpy as np
import scipy.signal as sp
import matplotlib.pyplot as plt
import math
import cmath


X=[1.+1.j, 2.+3.j,1.+2.j]
H=[2.+3.j,1.+1.j,3.+3.j,4.+5.j]

Y=sp.convolve(X,H)
y=np.fft.ifft(Y)
x=np.fft.ifft(X)
h=np.fft.ifft(H)
print(y==sp.convolve(x,h))

它打印'false',但它应该打印'true'。你有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-29 02:49:39

为什么要打印True?正如卷积定理所说,一个域(例如,时域)中的卷积等于另一个域https://en.wikipedia.org/wiki/Convolution_theorem中的逐点乘法。因此,你需要在频域中乘法,在时域中卷积,如下所示:

代码语言:javascript
运行
复制
X=[1.+1.j, 2.+3.j, 1.+2.j, 3.+2.j]
H=[2.+3.j, 1.+1.j, 3.+3.j, 4.+5.j]

Y=np.array(X)*np.array(H)
y=np.fft.ifft(Y)
x=np.fft.ifft(X)
h=np.fft.ifft(H)

print(y == sp.convolve(np.hstack((x[1:], x)),h, 'valid'))

在这里,我使XH的长度相等,以实现逐个元素的乘法,并填充x以使卷积循环。据我所知,sp.convolve总是执行线性卷积,但卷积定理需要一个循环卷积定理。

您还应该考虑到浮点运算是不精确的,因此精确地比较两个结果通常没有意义。最好使用这样的东西:

代码语言:javascript
运行
复制
print(np.abs(y - sp.convolve(np.hstack((x[1:], x)),h, 'valid')))

这将打印零,但如果您选择不同的计算方法

代码语言:javascript
运行
复制
print(np.abs(y - sp.convolve(np.hstack((x[1:], x)),h, 'valid', 'fft')))

它将打印一些表示计算误差的值,这些值非常小,但不是零。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55893304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档