OSDN Git Service

Merge branch 'master' of git.sourceforge.jp:/gitroot/karinto/karinto
[karinto/karinto.git] / Karinto / WindowFunction.cs
index 6a28de1..fb05d81 100755 (executable)
@@ -38,9 +38,11 @@ namespace Karinto
 \r
         #region private or protected fields\r
 \r
-        private Function function;\r
         private static Function[] library;\r
+        private Function function;\r
         private double parameter;\r
+        private double powerCorrectionFactor;\r
+        private double amplitudeCorrectionFactor;\r
 \r
         #endregion\r
 \r
@@ -63,7 +65,6 @@ namespace Karinto
                 Rectangular,\r
                 Triangular,\r
             };\r
-\r
         }\r
 \r
         public WindowFunction(FunctionType type)\r
@@ -72,25 +73,20 @@ namespace Karinto
         }\r
 \r
         public WindowFunction(FunctionType type, Range range)\r
+            : this(type, 0.0, range)\r
         {\r
-            Type = type;\r
-            Range = range;\r
             switch (type)\r
             {\r
                 case FunctionType.Gaussian:\r
-                    function = Gaussian;\r
                     parameter = 0.4;\r
                     break;\r
                 case FunctionType.Kaiser:\r
-                    function = Kaiser;\r
                     parameter = 2.0;\r
                     break;\r
                 case FunctionType.Lanczos:\r
-                    function = Lanczos;\r
                     parameter = 1.0;\r
                     break;\r
                 default:\r
-                    function = library[(int)type];\r
                     break;\r
             }\r
         }\r
@@ -107,17 +103,20 @@ namespace Karinto
             this.parameter = parameter;\r
             switch (type)\r
             {\r
+                case FunctionType.UserDefined:\r
+                    Window = null;\r
+                    break;\r
                 case FunctionType.Gaussian:\r
-                    function = Gaussian;\r
+                    Window = Gaussian;\r
                     break;\r
                 case FunctionType.Kaiser:\r
-                    function = Kaiser;\r
+                    Window = Kaiser;\r
                     break;\r
                 case FunctionType.Lanczos:\r
-                    function = Lanczos;\r
+                    Window = Lanczos;\r
                     break;\r
                 default:\r
-                    function = library[(int)type];\r
+                    Window = library[(int)type];\r
                     break;\r
             }\r
         }\r
@@ -128,10 +127,9 @@ namespace Karinto
         }\r
 \r
         public WindowFunction(Function function, Range range)\r
+            : this(FunctionType.UserDefined, range)\r
         {\r
-            Range = range;\r
-            Type = FunctionType.UserDefined;\r
-            this.function = function;\r
+            Window = function;\r
         }\r
 \r
         #endregion\r
@@ -150,6 +148,47 @@ namespace Karinto
             set;\r
         }\r
 \r
+        public Function Window\r
+        {\r
+            get\r
+            {\r
+                return function;\r
+            }\r
+            private set\r
+            {\r
+                function = value;\r
+                if (function != null)\r
+                {\r
+                    powerCorrectionFactor = CalculatePowerCorrectionFactor();\r
+                    amplitudeCorrectionFactor = CalculateAmplitudeCorrectionFactor();\r
+                }\r
+            }\r
+        }\r
+\r
+        public double PowerCorrectionFactor\r
+        {\r
+            get\r
+            {\r
+                if (powerCorrectionFactor > 0.0)\r
+                {\r
+                    return powerCorrectionFactor;\r
+                }\r
+                return CalculatePowerCorrectionFactor();\r
+            }\r
+        }\r
+\r
+        public double AmplitudeCorrectionFactor\r
+        {\r
+            get\r
+            {\r
+                if (amplitudeCorrectionFactor > 0.0)\r
+                {\r
+                    return amplitudeCorrectionFactor;\r
+                }\r
+                return CalculateAmplitudeCorrectionFactor();\r
+            }\r
+        }\r
+\r
         #endregion\r
 \r
         #region public methods\r
@@ -170,10 +209,46 @@ namespace Karinto
             }\r
             return series;\r
         }\r
+\r
         #endregion\r
 \r
         #region private methods\r
 \r
+        private double CalculatePowerCorrectionFactor()\r
+        {\r
+            if (Range == null) return 0.0;\r
+            if (!(Range.First is int)) throw new Exception();\r
+\r
+            int n = (int)Range.Last - (int)Range.First;\r
+            int width = n + (Range.ExcludesEnd ? 0 : 1);\r
+\r
+            double scale = 1.0 / n;\r
+            double pcf = 0.0;\r
+            for (int i = 0; i < width; ++i)\r
+            {\r
+                double f = function(scale * i);\r
+                pcf += f * f;\r
+            }\r
+            return pcf / width;\r
+        }\r
+\r
+        private double CalculateAmplitudeCorrectionFactor()\r
+        {\r
+            if (Range == null) return 0.0;\r
+            if (!(Range.First is int)) throw new Exception();\r
+\r
+            int n = (int)Range.Last - (int)Range.First;\r
+            int width = n + (Range.ExcludesEnd ? 0 : 1);\r
+\r
+            double scale = 1.0 / n;\r
+            double acf = 0.0;\r
+            for (int i = 0; i < width; ++i)\r
+            {\r
+                acf += function(scale * i);\r
+            }\r
+            return acf / width;\r
+        }\r
+\r
         private static double BartlettHann(double x)\r
         {\r
             throw new NotImplementedException();\r