繁体   English   中英

将 Easy Language 代码转换为 C# 代码导致了一些问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM