コード例 #1
0
        public WWDecimalFft(int numPoints)
        {
            if (!IsPowerOfTwo(numPoints) || numPoints < 2)
            {
                throw new ArgumentException("numPoints must be power of two integer and larger than 2");
            }
            mNumPoints = numPoints;

            mWn = new WWDecimalComplex[mNumPoints];
            for (int i = 0; i < mNumPoints; ++i)
            {
                decimal angle = -2.0M * WWDecimalMath.M_PI * i / mNumPoints;
                mWn[i] = new WWDecimalComplex(WWDecimalMath.Cos(angle), WWDecimalMath.Sin(angle));
            }

            // mNumStage == log_2(mNumPoints)
            int t = mNumPoints;

            for (int i = 0; 0 < t; ++i)
            {
                t       >>= 1;
                mNumStage = i;
            }

            mBitReversalTable = new uint[mNumPoints];
            for (uint i = 0; i < mNumPoints; ++i)
            {
                mBitReversalTable[i] = BitReversal(mNumStage, i);
            }
        }
コード例 #2
0
ファイル: Test.cs プロジェクト: czg1997/bitspersampleconv2
 public static void TestCos()
 {
     for (int i = -360; i <= 720; i += 30)
     {
         Console.WriteLine("cos({0})={1}", i, WWDecimalMath.Cos(WWDecimalMath.M_2PI * i / 180));
     }
 }
コード例 #3
0
        void Run(ValueType t)
        {
            // 1024 samples of 44100Hz PCM contains 23 periods of 998.5Hz sine wave
            decimal frequency = 23 * WWDecimalMath.M_2PI;

            var signalTime = new WWDecimalComplex[LENGTH];

            for (int i = 0; i < LENGTH; ++i)
            {
                decimal r = WWDecimalMath.Cos(frequency * i / LENGTH);

                switch (t)
                {
                case ValueType.VT_Int16:
                    r = ((int)(r * 32767)) / 32767M;
                    break;

                case ValueType.VT_Int24:
                    r = (decimal)((int)(r * 8388607) / 8388607M);
                    break;

                case ValueType.VT_Int32:
                    r = (decimal)((int)(r * Int32.MaxValue) / ((decimal)(Int32.MaxValue)));
                    break;

                case ValueType.VT_Float32:
                    r = (decimal)((float)r);
                    break;

                case ValueType.VT_Float64:
                    r = (decimal)((double)r);
                    break;

                case ValueType.VT_Int64:
                    r = (decimal)(((long)(r * Int64.MaxValue)) / ((decimal)(Int64.MaxValue)));
                    break;

                case ValueType.VT_Decimal:
                    break;
                }

                signalTime[i] = new WWDecimalComplex(r, 0);
            }

            FftSpectrum(signalTime);

            Console.WriteLine("Done.");
        }