python DFT 不准确

python DFT inaccuracy

提问人:Hannes_dxy 提问时间:12/7/2022 更新时间:12/8/2022 访问量:34

问:

我正在尝试在 python 中实现 DFT

但我有时会在三角形中得到一些不准确之处。由于浮点性质而产生的函数 是否有一个简单的解决方案来解决这个问题,或者对我的代码进行简单的更改,以最大限度地减少不准确之处? 我在这里最好的选择是什么?

我的代码:

def DFT(values) :
    N = len(values)
    out = list()
    for n in range(N):
        real = 0
        imag = 0
        for i, value in enumerate(values):
            phi = (2 * math.pi * n * i) / N
            real += value * math.cos(phi)
            imag -= value * math.sin(phi)
        real = real / N
        imag = imag / N

        freq = n
        amplitude = math.sqrt(real * real + imag * imag)
        phase = math.atan2(imag, real)
        out.append((freq, amplitude, phase, real, imag))
    return out

使用 decimal 模块是否合适? 并使用此处描述的 sin 和 cos 代理:https://docs.python.org/3/library/decimal.html#decimal-recipes

python-3.x 浮点 精度

评论

0赞 Eric Postpischil 12/8/2022
显示示例输入、观察到的输出和所需的输出。明确您观察到的不准确之处。

答:

0赞 chux - Reinstate Monica 12/8/2022 #1

“三角形中的一些不准确之处”的常见来源。函数“不是由于”浮点的性质“,但那不是π,只是它附近的一个值。当远远超出主要范围
[-π/4...π/4](或 [-45°...45°]).
math.piphi

代码可以通过使用模数学减少到 [-1...1] 范围来提供帮助,因此角度在 [-π...π] 范围。因此,范围缩小是精确的,而不是通过 .2 * n * i) / Nmath.pi

我怀疑使用 Python(我没有很强的 Python 技能),它会是:

f = ((n * i) / N) % 2.0
if (f > 1.0) f -= 2.0
else if (f < -1.0) f += 2.0;
phi = math.pi * 2.0 * f