gpt4 book ai didi

python - 当原始矩阵具有奇数第二个索引时,为什么 NumPy 的 rfft2 的 irfft2 会导致矩阵少一列?

转载 作者:行者123 更新时间:2023-12-03 20:38:41 24 4
gpt4 key购买 nike

我对 rfft2 的以下行为感到困惑和 irfft2在 NumPy 中。如果我从一个 m x n 的实矩阵开始,其中 n 是奇数,那么如果我取 rfft2其次是 irfft2 ,我最终得到一个 m x (n-1) 矩阵。自 irfft2rfft2 的倒数,我本来希望得到一个大小为 m x n 的矩阵。此外,矩阵中的值不是我开始使用的值——请参见下面的输出。

>>> import numpy as np
>>> x = np.ones((4, 3))
>>> ix = np.fft.rfft2(x)
>>> rx = np.fft.irfft2(ix)
>>> rx.shape
(4, 2)
>>> rx
array([[1.5, 1.5],
[1.5, 1.5],
[1.5, 1.5],
[1.5, 1.5]])
我很感激任何关于我是否以某种方式误解结果的反馈,或者这甚至可能是一个错误?我注意到如果第一个索引是奇数,则不会发生同样的问题,而且 rfft 也没有等效的问题。和 irfft .
请注意,我在运行 macOS Mojave 的 iMac Pro(2017)上使用 Python 3.8.8 和 Anaconda 发行版。

最佳答案

为了确保irfft2实际上是 rfft2 的倒数,在反转转换时,您需要让它知道输入数据的确切形状。
像这样:

import numpy as np
x = np.ones((4, 3))
ix = np.fft.rfft2(x)
rx = np.fft.irfft2(ix, x.shape)
这正是您在问题中突出显示的原因所必需的:为实值输入数据( ix )表示转换数据(“谱”,在您的示例中为 x )的方式取决于样本在任何维度上都是奇数或偶数。 (i)rfft*函数系列都是针对输入数据是一系列实数(即不是复数)的常见用例量身定制的。这种输入的离散傅立叶变换通常是复数值,但具有特殊的对称性:负频率分量是相应正频率分量的复共轭。也就是说,频谱包含两次本质上相同的数字,一半的频谱已经包含重建输入数据所需的信息。这是有道理的:频谱是一系列复数,每个复数可以表示为两个实数,但输入数据没有那种“复杂性”,因为它是实数值。
再说一次,当数据的长度(以及整个频谱的长度)可能是奇数或偶数时,“频谱的一半”并不是一个明确的术语。从数学上讲,这两种情况必须略有不同。这就是为什么在重建输入信号时需要数据长度的原因。
作为 NumPy documentation of rfft 一维情况的注意事项:

If n 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 n 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.


documentation of irfft 进一步解释:

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, irfft 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 must be given.


所以偶数长度信号是默认的。这就是为什么您只会在数组维度的奇数长度上遇到这个问题。 documentation of irfftn 特别注意它是 rfftn 的倒数仅当调用类似 irfftn(rfftn(x), x.shape) .

关于python - 当原始矩阵具有奇数第二个索引时,为什么 NumPy 的 rfft2 的 irfft2 会导致矩阵少一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67876671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com