提问人:Hannes_dxy 提问时间:12/7/2022 更新时间:12/8/2022 访问量:34
python DFT 不准确
python DFT inaccuracy
问:
我正在尝试在 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
答:
0赞
chux - Reinstate Monica
12/8/2022
#1
“三角形中的一些不准确之处”的常见来源。函数“不是由于”浮点的性质“,但那不是π,只是它附近的一个值。当远远超出主要范围
[-π/4...π/4](或 [-45°...45°]).math.pi
phi
代码可以通过使用模数学减少到 [-1...1] 范围来提供帮助,因此角度在 [-π...π] 范围。因此,范围缩小是精确的,而不是通过 .2 * n * i) / N
math.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
评论