相关疑难解决方法(0)

如何将两个 2D RFFT 数组 (FFTPACK) 相乘以与 NumPy 的 FFT 兼容?

我正在尝试将用fftpack_rfft2d()(SciPy 的 FFTPACK RFFT)转换的两个二维数组相乘,结果与我从scipy_rfft2d()(SciPy 的 FFT RFFT)得到的结果不兼容。

下图共享了脚本的输出,其中显示:

  • 两个输入数组的初始化值;
  • 使用 SciPy 对 RFFT 的 FFT 实现进行变换后的两个数组scipy_rfft2d(),然后是乘法的输出,然后使用向后变换scipy_irfft2d()
  • 使用 SciPy 的 FFTPACK 实现 RFFT 与fftpack_rfft2d()和相同的事情fftpack_irfft2d()
  • 使用该测试np.allclose()的结果检查两个乘法的结果在使用其各自的 IRFFT 实现转换回来后是否相同。

为了清楚起见,红色矩形显示逆变换 IRFFT 后的乘法结果:左侧的矩形使用 SciPy 的 FFT IRFFT;右边的矩形,SciPy 的 FFTPACK IRFFT。当与 FFTPACK 版本的乘法固定时,它们应该显示相同的数据。

我认为与 FFTPACK 版本的乘法结果不正确,因为scipy.fftpack返回结果 RFFT 数组中的实部和虚部与来自scipy.fft的 RFFT 不同:

  • 我相信来自scipy.fftpack 的 RFFT返回一个数组,其中一个元素包含实部,下一个元素包含其虚部;
  • 在 scipy.fft 的RFFT 中,每个元素都是一个复数,因此能够同时保存实部和虚部;

如果我错了,请纠正我!我还想指出,由于scipy.fftpack不提供用于转换 2D 数组的函数,例如rfft2() …

python fft scipy fftpack numpy-ndarray

10
推荐指数
1
解决办法
722
查看次数

如何实现基于一维 RFFT 的二维 RFFT 算法?

我正在尝试通过在每一行上执行 1D RFFT,然后在前一个结果的每一列上再次执行 1D RFFT来实现 NumPy's rfft2(),即支持二维数组的RFFT函数。

这种方法能很好地实现2D FFT功能,如前面所讨论的这个帖子上,但它似乎没有工作没有2D RFFT

这是一个实现自定义 2D FFT 函数的脚本,它遵循这个想法,使用 NumPy 的 FFT 的 1D 版本作为基础,然后将其结果与 NumPy 的实际 2D 版本进行比较:

import cmath
import numpy as np
import math

def my_fft2d(matrix):
    fft_rows = [np.fft.fft(row) for row in matrix]
    return np.transpose([np.fft.fft(row) for row in np.transpose(fft_rows)])


# initialize test data
img = np.array([[0,0,0,0], [0,1,0,0], [0,0,0,0], [0,0,0,0]])
print('img shape=', img.shape)

# perform custom FFT2D and print result
custom_result = my_fft2d(img)
print('\ncustom_result …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy fft image-processing

1
推荐指数
1
解决办法
155
查看次数

标签 统计

fft ×2

python ×2

arrays ×1

fftpack ×1

image-processing ×1

numpy ×1

numpy-ndarray ×1

scipy ×1