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

标签 c++ fft precision division phase

我正在编写一个 C++ 程序,该程序对包含 double 的真实输入信号进行 FFT。值并返回 vector X包含std::complex<double>值(value)观。一旦获得结果 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/

相关文章:

floating-point - 对于接近统一的值, float 学是否更精确?

c++ - 在 C++ 中创建 "new instance of object"方法

c++ - RInside 段错误和链接问题

c++ - Catch Lib 问题 - 匿名 namespace 重新定义。怎么解决

python - FFT 未返回正确的幅度

python - signal.spectrogram 找到给定段的最大频率

c - -1.0 和 1.0 之间的 double 有多少位精度?

c++ - 如何用 Qt 插入空值?

python - 数据集的傅立叶平滑

c++ - long double 中精度不工作或 devcpp 失败