gpt4 book ai didi

c++ - 如何有效地计算(基本上)等于零的复数的相位角?

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:59 25 4
gpt4 key购买 nike

我正在编写一个 C++ 程序,该程序采用包含 double 的真实输入信号的 FFT。值并返回一个 vector X包含 std::complex<double>值。获得结果 vector 后,我会尝试计算结果的幅度和相位。

当其中一个输出为“零”时,我在计算相位角时遇到了问题。零在引号中是因为当结果为 0 的计算返回 double 值时,返回值将非常接近于零,但不完全为零。

例如,在索引 3 处,我的输出数组具有计算出的“零”值:

X[3] = 3.0531133177191805e-16 - i*5.5511151231257827e-17

我正在尝试使用标准库 std::arg应该返回复数的相位角的函数。 std::arg(X[3])

同时 X[3]本质上是 0,它不完全是 0,并且计算相位的方式会导致问题,因为计算使用的是虚部除以实部之比,而实部与 0 相去甚远!

实际计算结果远非理想。

enter image description here

enter image description here

我怎样才能让 C++ 意识到结果真的是 0,这样我才能得到正确的相位角?

我正在寻找比使用任意硬编码的“epsilon”值来比较 double 更优雅的解决方案,但到目前为止在网上搜索我还没有找到更好的解决方案。

最佳答案

如果您正在计算输入信号的浮点 FFT,则该信号将包含噪声,因此具有信噪比,包括传感器噪声、热噪声、量化噪声、定时抖动噪声等

因此,将 FFT 结果丢弃为低于本底噪声的阈值很可能不是计算数学问题,而是物理或电子数据采集分析的一部分。您必须插入该数字,并将相位设置为 0.0 或 NaN 或任何您的默认标记值是无用的(处于或低于本底噪声)FFT 结果。

关于c++ - 如何有效地计算(基本上)等于零的复数的相位角?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57422032/

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