我试图证明,如果DFT(y)=DFT(x) * DFT(h)
,那么y=x * h
。我使用了np.fft.ifft
属性,但第二个表达式的计算结果不是True。代码如下:
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'
。你有什么想法吗?
发布于 2019-04-29 02:49:39
为什么要打印True
?正如卷积定理所说,一个域(例如,时域)中的卷积等于另一个域https://en.wikipedia.org/wiki/Convolution_theorem中的逐点乘法。因此,你需要在频域中乘法,在时域中卷积,如下所示:
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'))
在这里,我使X
和H
的长度相等,以实现逐个元素的乘法,并填充x
以使卷积循环。据我所知,sp.convolve
总是执行线性卷积,但卷积定理需要一个循环卷积定理。
您还应该考虑到浮点运算是不精确的,因此精确地比较两个结果通常没有意义。最好使用这样的东西:
print(np.abs(y - sp.convolve(np.hstack((x[1:], x)),h, 'valid')))
这将打印零,但如果您选择不同的计算方法
print(np.abs(y - sp.convolve(np.hstack((x[1:], x)),h, 'valid', 'fft')))
它将打印一些表示计算误差的值,这些值非常小,但不是零。
https://stackoverflow.com/questions/55893304
复制相似问题