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); } }
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)); } }
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."); }