13,868,681 members

#### Stats

84.1K views
2.4K downloads
92 bookmarked
Posted 19 Sep 2012
Licenced CPOL

# Yet Another Math Parser (YAMP)

, 30 Sep 2012
Constructing a fast math parser using Reflection to do numerics like Matlab.
 ```﻿using System; using YAMP; namespace YAMP.Numerics { public class FFT { private FFT() { } public static MatrixValue fft(MatrixValue x) { var length = x.Length; if (length == 1) return x.Clone(); // Cooley-Tukey FFT if (length % 2 != 0) throw new MatrixFormatException("length != 2^n"); // even fft var even = new MatrixValue(length / 2, 1); for (int k = 1; k <= even.Length; k++) even[k] = x[2 * k]; var q = fft(even); // odd fft; var odd = even; for (int k = 1; k <= odd.Length; k++) odd[k] = x[2 * k - 1]; var r = fft(odd); // combine var y = new MatrixValue(length, 1); for (int k = 1; k <= odd.Length; k++) { var value = -2 * (k - 1) * Math.PI / length; var wk = new ScalarValue(Math.Cos(value), Math.Sin(value)); y[k] = q[k] + (wk * r[k]); y[k + odd.Length] = q[k] - (wk * r[k]); } return y; } public static MatrixValue ifft(MatrixValue x) { var length = x.Length; // Cooley-Tukey FFT if (length % 2 != 0) throw new MatrixFormatException("length != 2^n"); var y = new MatrixValue(length, 1); //conjugate for (int i = 1; i <= length; i++) y[i] = x[i].Conjugate(); // compute forward FFT y = fft(y); // take conjugate again and divide by N for (int i = 1; i <= length; i++) y[i] = y[i].Conjugate() / (double)length; return y; } public static MatrixValue fft2d(MatrixValue input) { var output = input.Clone(); // Rows first: var x = new MatrixValue(output.DimensionY, 1); for (int h = 1; h <= output.DimensionX; h++) { for (int i = 1; i <= output.DimensionY; i++) x[i] = output[i, h]; x = fft(x); for (int i = 1; i <= output.DimensionY; i++) output[i, h] = x[i]; } //Columns last var y = new MatrixValue(output.DimensionX, 1); for (int h = 0; h < output.DimensionY; h++) { for (int i = 1; i <= output.DimensionX; i++) y[i] = output[h, i]; y = fft(y); for (int i = 1; i <= output.DimensionX; i++) output[h, i] = y[i]; } return output; } public static MatrixValue ifft2d(MatrixValue input) { var output = input.Clone(); // Rows first: var x = new MatrixValue(output.DimensionY, 1); for (int h = 1; h <= output.DimensionX; h++) { for (int i = 1; i <= output.DimensionY; i++) x[i] = output[i, h]; x = ifft(x); for (int i = 1; i <= output.DimensionY; i++) output[i, h] = x[i]; } //Columns last var y = new MatrixValue(output.DimensionX, 1); for (int h = 1; h <= output.DimensionY; h++) { for (int i = 1; i <= output.DimensionX; i++) y[i] = output[h, i]; y = ifft(y); for (int i = 1; i <= output.DimensionX; i++) output[h, i] = y[i]; } return output; } } } ```

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

## License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

## About the Author

 Architect Germany
Florian lives in Munich, Germany. He started his programming career with Perl. After programming C/C++ for some years he discovered his favorite programming language C#. He did work at Siemens as a programmer until he decided to study Physics.

During his studies he worked as an IT consultant for various companies. After graduating with a PhD in theoretical particle Physics he is working as a senior technical consultant in the field of home automation and IoT.

Florian has been giving lectures in C#, HTML5 with CSS3 and JavaScript, software design, and other topics. He is regularly giving talks at user groups, conferences, and companies. He is actively contributing to open-source projects. Florian is the maintainer of AngleSharp, a completely managed browser engine.

## You may also be interested in...

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web01 | 2.8.190214.1 | Last Updated 30 Sep 2012
Article Copyright 2012 by Florian Rappl
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid