<p>使用卷积定理和离散时间傅里叶变换(DTFT)可以计算出<code>x * y</code>形式的线性离散卷积。如果<code>x * y</code>是一个循环离散卷积,那么它可以用离散傅立叶变换(DFT)来计算。在</p>
<p>卷积定理状态{<cd1>}可以用Fourier变换作为</p>
<p><a href="https://i.stack.imgur.com/B1bAt.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/B1bAt.gif" alt="Convolution theorem"/></a></p>
<p>其中<a href="https://i.stack.imgur.com/1hwbX.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1hwbX.gif" alt="Fourier transform"/></a>表示傅里叶变换,<a href="https://i.stack.imgur.com/2pphA.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/2pphA.gif" alt="Inverse Fourier transform"/></a>表示傅里叶逆变换。当<code>x</code>和{<cd5>}是离散的并且它们的卷积是线性卷积时,使用DTFT作为</p>
<p><a href="https://i.stack.imgur.com/sYDUg.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/sYDUg.gif" alt="Discrete convolution theorem"/></a></p>
<p>如果<code>x</code>和{<cd5>}是离散的并且它们的卷积是循环卷积,则上面的DTFT将被DFT代替。<strong>注:</strong>线性卷积问题可以嵌入到循环卷积问题中。在</p>
<hr/>
<p>我对MATLAB比较熟悉,但是通过阅读<a href="https://www.tensorflow.org/api_docs/python/tf/fft2d" rel="nofollow noreferrer">^{<cd8>}</a>和<a href="https://www.tensorflow.org/api_docs/python/tf/ifft2d" rel="nofollow noreferrer">^{<cd9>}</a>的TensorFlow文档,下面的解决方案应该可以通过替换MATLAB函数<code>fft2</code>和<code>ifft2</code>轻松转换为TensorFlow。在</p>
<p>在MATLAB(和TensorFlow)中,<code>fft2</code>(和<code>tf.fft2d</code>)使用快速傅立叶变换算法计算DFT。如果<code>x</code>和<code>y</code>的卷积是圆形的,则可以通过</p>
<pre><code>ifft2(fft2(x).*fft2(y))
</code></pre>
<p>其中<code>.*</code>表示MATLAB中元素的逐元素乘法。但是,如果它是线性的,则必须计算DTFT。这可以通过将数据补零到长度<code>2N-1</code>来计算,其中<code>N</code>是一维的长度(问题中有1024个)。在MATLAB中,这可以用两种方法中的一种来计算。首先,通过</p>
^{pr2}$
<p>其中,MATLAB计算<code>x</code>和{<cd5>}的{<cd19>}-点2D傅立叶变换,然后计算<code>2*N-1</code>点2D傅里叶逆变换。这个方法不能用在TensorFlow中(从我对文档的理解来看),所以下一个是唯一的选择。在MATLAB和TensorFlow中,卷积可以通过先将<code>x</code>和<code>y</code>扩展到<code>2*N-1</code>x<code>2*N-1</code>的大小,然后计算<code>2*N-1</code>-点二维傅里叶变换和傅立叶逆变换</p>
<pre><code>x_extended = x;
x_extended(2*N-1, 2*N-1) = 0;
y_extended = y;
y_extended(2*N-1, 2*N-1) = 0;
h_extended = ifft2(fft2(x_extended).*fft2(y_extended));
</code></pre>
<p>在MATLAB中,<code>h</code>和{<cd29>}完全相等。<code>x</code>和{<cd5>}的卷积可以不用Fourier变换来计算</p>
<pre><code>hC = conv2(x, y);
</code></pre>
<p>在MATLAB中。在</p>
<hr/>
<p>在我的笔记本电脑上的MATLAB中,<code>conv2(x, y)</code>需要55秒,而Fourier变换方法只需要不到0.4秒。在</p>