[英]Converting Easy Language Code to C# Code Caused Some Issues
我正在尝试将用简单语言代码编写的数学函数转换为 C#,但我的代码中有一个非常简单但非常令人沮丧的错误,我运行计算时使用的值越多,值就会下降。 我附上了代码的截图和我得到的回报。 我确定这只是我的代码中的一个错字,但我找不到它。 如果您需要查看其他内容,请告诉我
这是我的代码:
public static (List<double>, List<double>) CalculateEhlersRoofingFilter(List<double> valuesList, int days)
{
List<double> highPassList = new List<double>();
List<double> roofingFilterList = new List<double>();
int lowerPeriod = days;
int upperPeriod = Utils.MinOrMax((int)Math.Ceiling(lowerPeriod / 0.2083));
double alphaArg = Utils.ToRadians((0.707 * 360) / upperPeriod);
double alphaCos = Math.Cos(alphaArg);
double alpha1;
if (alphaCos != 0)
{
alpha1 = (alphaCos + Math.Sin(alphaArg) - 1) / alphaCos;
}
else
{
alpha1 = 0;
}
double a1 = Math.Exp((-1.414 * 3.14159) / lowerPeriod);
double b1 = 2 * a1 * Math.Cos(Utils.ToRadians((1.414 * 180) / lowerPeriod));
double c2 = b1;
double c3 = (-1 * a1) * a1;
double c1 = 1 - c2 - c3;
for (int i = 0; i < valuesList.Count; i++)
{
double currentValue = valuesList.ElementAt(i);
double prevValue1, prevValue2, prevFilter1, prevFilter2, prevHp1, prevHp2;
if (i >= 1)
{
prevValue1 = valuesList.ElementAt(i - 1);
prevFilter1 = roofingFilterList.ElementAt(i - 1);
prevHp1 = highPassList.ElementAt(i - 1);
}
else
{
prevValue1 = currentValue;
prevFilter1 = currentValue;
prevHp1 = currentValue;
}
if (i >= 2)
{
prevFilter2 = roofingFilterList.ElementAt(i - 2);
prevValue2 = valuesList.ElementAt(i - 2);
prevHp2 = highPassList.ElementAt(i - 2);
}
else
{
prevFilter2 = currentValue;
prevValue2 = currentValue;
prevHp2 = currentValue;
}
double highPass = (Utils.Power((1 - alpha1) / 2, 2) * (currentValue - (2 * prevValue1) + prevValue2)) + (2 * (1 - alpha1) * prevHp1) -
(Utils.Power(1 - alpha1, 2) * prevHp2);
highPassList.Add(highPass);
double roofingFilter = (c1 * ((highPass + prevHp1) / 2)) + (c2 * prevFilter1) + (c3 * prevFilter2);
roofingFilterList.Add(roofingFilter);
}
return (highPassList, roofingFilterList);
}
如前所述,在不确切知道您要查找的内容的情况下找到问题可能具有挑战性。 但是,我建议将“lowerPeriod”和“upperPeriod”更改为双倍以保持计算的一致性(让值从右侧的 int 分配),并在每个常量后放置一个“D”以强制将它们视为double 而不是潜在的 int 或 float 等......使用“2D”是“2作为双精度”而不是“2”,后者是一个“int”,您必须担心不同数字类型的交互并希望规则按照您期望的方式进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.