c - atan2 用于任意相移的两个正弦曲线?
问题描述
我正在尝试实现一个类似 atan2 的函数,将任意相对相移的两个输入正弦信号映射到一个从0
到线性变化的单个输出信号2π
。 atan2
通常假设两个信号相移 90 度。
给定y0(x) = sin(x)
and y1 = sin(x + phase)
,phase
固定的非零值在哪里,我该如何实现返回x
模数的方法2π
?
解决方案
atan2
返回二维向量的角度。您的代码无法正确处理此类缩放。但是不用担心,实际上很容易将您的问题减少到atan2
可以很好地处理所有事情的程度。
请注意,计算sin(x)
和 与sin(x + phase)
将点(cos(x), sin(x))
投影到轴上(0, 1)
和相同(sin(phase), cos(phase))
。这与使用这些轴获取点积,或将坐标系从标准正交基转换为倾斜坐标系相同。这提出了一个简单的解决方案:逆变换以获取正交基中的坐标,然后使用atan2
.
这是执行此操作的代码:
double super_atan2(double x0, double x1, double a0, double a1) {
double det = sin(a0 - a1);
double u = (x1*sin(a0) - x0*sin(a1))/det;
double v = (x0*cos(a1) - x1*cos(a0))/det;
return atan2(v, u);
}
double duper_atan2(double y0, double y1, double phase) {
const double tau = 6.28318530717958647692; // https://tauday.com/
return super_atan2(y0, y1, tau/4, tau/4 - phase);
}
super_atan2
获得两个投影轴的角度,duper_atan2
完全按照您的说法解决问题。
另请注意,计算det
并非绝对必要。可以用fmod
and代替它copysign
(我们仍然需要u
and的正确符号v
)。
推荐阅读
- php - 基于 HTML-PHP-PDO-PostgreSQL 的表单数据插入中整数错误的未定义索引、无效输入语法
- node.js - Google Node.js SDK v2 上的操作:以对象为参数的 conv.ask()
- aws-cli - 在 shell 控制台上监控 AWS Kinesis 流
- sql - 获取两个表之间的数据匹配 - 如果至少三个字符匹配或更多
- spring - Spring Mongo 转换器未注册
- angular - 如何在 Angular 5 应用程序中获取复选框值
- php - 尝试运行 multiqyery 时出错
- c++ - TensorFlow 和 Bazel c++
- javascript - 在 django 中使用 python 函数调用 javascript 函数
- java - 如何使用android中的动画将苹果放入篮子中?