<p>为了确保<code>irfft2</code>实际上是<code>rfft2</code>的倒数,在反转转换时,需要让它知道输入数据的确切形状</p>
<p>像这样:</p>
<pre><code>import numpy as np
x = np.ones((4, 3))
ix = np.fft.rfft2(x)
rx = np.fft.irfft2(ix, x.shape)
</code></pre>
<p>这正是您在问题中强调的原因:实值输入数据(<code>x</code>)的转换数据(示例中的“光谱”)表示方式取决于样本数在任何维度中是奇数还是偶数</p>
<p>函数的<code>(i)rfft*</code>系列都是针对输入数据是一系列实数(即<em>而不是</em>复数)的常见用例定制的。这种输入的离散傅里叶变换通常是复数,但具有特殊的对称性:负频率分量是对应正频率分量的复共轭。也就是说,频谱包含两次基本相同的数字,并且一半的频谱已经包含重构输入数据所需的信息。这是有意义的:频谱是一系列复数,每个复数可以表示为两个实数,但输入数据没有“复杂性”,因为它是实数</p>
<p>然后,当数据长度(以及整个光谱的长度)可能是奇数或偶数时,“光谱的一半”并不是一个明确的术语。从数学上讲,这两种情况的处理方式必须略有不同。这就是重建输入信号时需要数据长度的原因</p>
<p>正如一维情形的NumPy<a href="https://numpy.org/doc/stable/reference/generated/numpy.fft.rfft.html" rel="nofollow noreferrer">documentation of ^{<cd6>}</a>注释所示:</p>
<blockquote>
<p>If <em>n</em> is even, [the last array element of the spectrum] contains the term representing both positive and negative Nyquist frequency (+fs/2 and -fs/2), and must also be purely real. If <em>n</em> is odd, there is no term at fs/2; [the last array element of the spectrum] contains the largest positive frequency (fs/2*(n-1)/n), and is complex in the general case.</p>
</blockquote>
<p>而<a href="https://numpy.org/doc/stable/reference/generated/numpy.fft.irfft.html" rel="nofollow noreferrer">documentation of ^{<cd7>}</a>进一步解释:</p>
<blockquote>
<p>The correct interpretation of the hermitian input depends on the length of the original data, as given by n. This is because each input shape could correspond to either an odd or even length signal. By default, <code>irfft</code> assumes an even output length which puts the last entry at the Nyquist frequency; aliasing with its symmetric counterpart. By Hermitian symmetry, the value is thus treated as purely real. To avoid losing information, the correct length of the real input <strong>must</strong> be given.</p>
</blockquote>
<p>因此,偶数长度信号是默认值。这就是为什么您只会在数组维度的奇数长度上遇到这个问题。<a href="https://numpy.org/doc/stable/reference/generated/numpy.fft.irfftn.html" rel="nofollow noreferrer">documentation of ^{<cd8>}</a>特别指出,只有在像<code>irfftn(rfftn(x), x.shape)</code>一样调用时,它才是<code>rfftn</code>的逆</p>