- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图针对 numpy fft 测试 fft 的输出以进行单元测试,我很快就意识到它失败了,这并不是因为我做错了什么,而是 skcuda 实际上并没有产生相同的答案。我知道它们会略有不同,但至少其中一个数字比 numpy 生成的数字低几个数量级,并且 allclose
和 almost_equal
都返回大量错误(rtol=1e-6
为 33% 和 25%,atol=1e-6
为 16%)。我在这里做错了什么?我可以解决这个问题吗?
测试文件:
import pycuda.autoinit
from skcuda import fft
from pycuda import gpuarray
import numpy as np
def test_skcuda():
array_0 = np.array([[1, 2, 3, 4, 5, 4, 3, 2, 1, 0]], dtype=np.float32)
array_1 = array_0 * 10
time_domain_signal = np.array([array_0[0], array_1[0]], dtype=np.float32)
fft_point_count = 10
fft_plan = fft.Plan(fft_point_count, np.float32, np.complex64,
batch=2)
fft_reserved = gpuarray.empty((2, fft_point_count // 2 + 1), dtype=np.complex64)
fft.fft(gpuarray.to_gpu(time_domain_signal), fft_reserved, fft_plan)
np.testing.assert_array_almost_equal(
np.fft.rfft(time_domain_signal, fft_point_count), fft_reserved.get())
test_skcuda()
断言失败:
AssertionError:
Arrays are not almost equal to 6 decimals
(mismatch 25.0%)
x: array([[ 2.500000e+01+0.000000e+00j, -8.472136e+00-6.155367e+00j,
-1.193490e-15+2.331468e-15j, 4.721360e-01-1.453085e+00j,
2.664535e-15+0.000000e+00j, 1.000000e+00+0.000000e+00j],...
y: array([[ 2.500000e+01+0.000000e+00j, -8.472136e+00-6.155367e+00j,
8.940697e-08+5.960464e-08j, 4.721359e-01-1.453085e+00j,
0.000000e+00+0.000000e+00j, 1.000000e+00+0.000000e+00j],...
打印输出:
#numpy
[[ 2.50000000e+01+0.00000000e+00j -8.47213595e+00-6.15536707e+00j
-1.19348975e-15+2.33146835e-15j 4.72135955e-01-1.45308506e+00j
2.66453526e-15+0.00000000e+00j 1.00000000e+00+0.00000000e+00j]
[ 2.50000000e+02+0.00000000e+00j -8.47213595e+01-6.15536707e+01j
-1.11022302e-14+2.39808173e-14j 4.72135955e+00-1.45308506e+01j
3.55271368e-14+7.10542736e-15j 1.00000000e+01+0.00000000e+00j]]
#skcuda
[[ 2.5000000e+01+0.0000000e+00j -8.4721355e+00-6.1553669e+00j
8.9406967e-08+5.9604645e-08j 4.7213593e-01-1.4530852e+00j
0.0000000e+00+0.0000000e+00j 1.0000000e+00+0.0000000e+00j]
[ 2.5000000e+02+0.0000000e+00j -8.4721359e+01-6.1553673e+01j
1.4305115e-06-4.7683716e-07j 4.7213597e+00-1.4530851e+01j
0.0000000e+00+1.9073486e-06j 1.0000000e+01+0.0000000e+00j]]
最佳答案
FFT 的输出存在与输入值的幅度相关的误差。每个输出元素都是通过组合所有输入元素来计算的,因此它们的大小决定了结果的精度。
您正在同一数组中计算两个一维 FFT。它们各自具有不同的幅度输入,因此应具有不同的幅度容差。
以下快速代码演示了如何实现这一点。我不知道如何调整 numpy.testing 中的任何函数来做到这一点。
import numpy as np
array_0 = np.array([[1, 2, 3, 4, 5, 4, 3, 2, 1, 0]], dtype=np.float32)
array_1 = array_0 * 10
time_domain_signal = np.array([array_0[0], array_1[0]], dtype=np.float32)
# numpy result
a=np.array([[ 2.50000000e+01+0.00000000e+00j, -8.47213595e+00-6.15536707e+00j,
-1.19348975e-15+2.33146835e-15j, 4.72135955e-01-1.45308506e+00j,
2.66453526e-15+0.00000000e+00j, 1.00000000e+00+0.00000000e+00j],
[ 2.50000000e+02+0.00000000e+00j, -8.47213595e+01-6.15536707e+01j,
-1.11022302e-14+2.39808173e-14j, 4.72135955e+00-1.45308506e+01j,
3.55271368e-14+7.10542736e-15j, 1.00000000e+01+0.00000000e+00j]])
# skcuda result
b=np.array([[ 2.5000000e+01+0.0000000e+00j, -8.4721355e+00-6.1553669e+00j,
8.9406967e-08+5.9604645e-08j, 4.7213593e-01-1.4530852e+00j,
0.0000000e+00+0.0000000e+00j, 1.0000000e+00+0.0000000e+00j],
[ 2.5000000e+02+0.0000000e+00j, -8.4721359e+01-6.1553673e+01j,
1.4305115e-06-4.7683716e-07j, 4.7213597e+00-1.4530851e+01j,
0.0000000e+00+1.9073486e-06j, 1.0000000e+01+0.0000000e+00j]])
# Tolerance for result array row relative to the mean absolute input values
# 1e-6 because we're using single-precision floats
tol = np.mean(np.abs(time_domain_signal), axis=1) * 1e-6
# Compute absolute difference and compare that to our tolearances
diff = np.abs(a-b)
if np.any(diff > tol[:,None]):
print('ERROR!!!')
关于python - skcuda.fft 与 numpy.fft.rfft 不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56811521/
FFT 库(例如 FFTW 或 numpy.fft)通常提供两个函数 fft() 和 ifft()(及其用于实值输入的特殊版本)。这些功能似乎被定义为 ifft(fft(X)) == X 和 fft(
如果我有一个特定大小 M(2 的幂)的 FFT 实现,我如何计算一组大小 P=k*M 的 FFT,其中 k 也是 2 的幂? #define M 256 #define P 1024 comple
下午好! 我正在尝试基于我已有的简单递归 FFT 实现来开发 NTT 算法。 考虑以下代码(coefficients'的长度,让它为m,是2的精确幂): /// /// Calculates the
我正在分析时间序列数据,并希望提取 5 个主要频率分量并将其用作训练机器学习模型的特征。我的数据集是 921 x 10080 。每行是一个时间序列,总共有 921 个。 在探索可能的方法时,我遇到了各
我找不到任何官方文档来证明 scipy.fft 实际上是 numpy.fft.fftpack.fft 的链接。这是显示链接的 iPython session : In [1]: import scip
文档说 np.fft.fft 这样做: Compute the one-dimensional discrete Fourier Transform. 和 np.fft.rfft 这样做: Compu
近一个月来,我一直在与一个非常奇怪的错误作斗争。问你们是我最后的希望。我用 C 编写了一个程序,它集成了 2d Cahn–Hilliard equation在傅里叶(或倒数)空间中使用隐式欧拉 (IE
我一直在制作一个例程,使用 NumPy/Scipy 测量两个光谱之间的相位差。 我已经有了Matlab写的例程,所以我基本上是用NumPy重新实现了函数和相应的单元测试。但是,我发现单元测试失败了,因
我正在研究使用 Renderscript 对大型复杂输入数组执行 FFT。 FFT 是相当标准的,因为它涉及三个循环,但内部循环执行 FFT 中的蝶形运算。因为每个蝴蝶使用数组的不同部分,所以没有明显
我需要通过修改 FFT 结果来均衡音乐样本。 我知道如何获得每个输出虚数的频率,问题是修改这个值以获得“均衡器效果”。 我需要知道如何缩放这个值。 条目大小为 4096 个样本,采样率为 44100
我将在 kiss-fft 之前制定几个计划同时(平行),我可以这样做吗,或者换句话说,kiss-fft 线程安全吗? 谢谢 最佳答案 自述文件: No static data is used. Th
要在频域中插入信号,可以在时域中填充零并执行 FFT。 假设给定向量 X 中的元素数为 N 并且 Y 与 X 相同但在一侧用 N 零填充。然后下面给出相同的结果。 $$\hat{x}(k)=\sum_
我通过相关了解了 DFT 的工作原理,并将其用作理解 FFT 结果的基础。如果我有一个以 44.1kHz 采样的离散信号,那么这意味着如果我要获取 1 秒的数据,我将有 44,100 个样本。为了对其
有人知道 Mayer FFT 的实现吗(我不必花很多时间研究代码)? 我正在尝试执行卷积,ifft 似乎产生了我称之为“镜像”的输出。换句话说,我的内核+信号长度被限制为 N/2 并且占据 n=0..
有人知道 Mayer FFT 的实现吗(我不必花很多时间研究代码)? 我正在尝试执行卷积,ifft 似乎产生了我称之为“镜像”的输出。换句话说,我的内核+信号长度被限制为 N/2 并且占据 n=0..
我有以下代码...请注意#生成正弦曲线下的两行。一个使用比另一个更高的 2pi 精度值,但它们仍然应该给出几乎相同的结果。 import numpy as np import matplotlib.p
我正在努力确保 FFTW 做我认为它应该做的事情,但我遇到了问题。我正在使用 OpenCV 的 cv::Mat。我制作了一个测试程序,给定一个 Mat f,计算 ifft(fft(f)) 并将结果与
我是从事电信项目的计算机程序员。 在我们的项目中,我必须将一系列复数更改为它们的傅立叶变换。因此我需要一个高效的 FFT 代码来满足 C89 标准。 我正在使用以下代码,它运行良好: shor
我目前正在尝试了解 numpy 的 fft 函数。为此,我测试了以下假设: 我有两个函数,f(x) = x^2 和 g(x) = f'(x) = 2*x。根据傅立叶变换定律和 wolfram alph
我一直在使用 FFT,目前正在尝试使用 FFT 从文件中获取声音波形(最终对其进行修改),然后将修改后的波形输出回文件。我得到了声波的 FFT,然后对其使用了反 FFT 函数,但输出文件听起来一点也不
我是一名优秀的程序员,十分优秀!