Laden...

FFTSHIFT [MatLab] Bibliothek für C#

Erstellt von digi333 vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.379 Views
D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 14 Jahren
FFTSHIFT [MatLab] Bibliothek für C#

Ich will einen Algorithmus aus Matlab in C# überführen, jedoch finde ich keine identische Bibliothek für die Funktion FFTSHIFT aus Matlab. Kennt jemand Eine?

frohes Fest!

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo digi333,

du meinst keine identische Funktion bzw. Methode. Vermutlich gibt es im .NET Framework auch keine.

herbivore

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 14 Jahren

du meinst keine identische Funktion bzw. Methode. Vermutlich gibt es im .NET Framework auch keine.

Ich hab mich etwas falsch ausgedrückt. Ich suche eine 2D-FFT die für alle Matrizzen funktioniert. Das kann Matlab (oder FFTW3 für C) aber für C# finde ich nur Algorithmen die für Matrizzen funktionieren die ein vielfaches von N² sind.

Eine 2x2, 4x4, 8x8, 16x16 etc Matrix funktioniert, aber keine 9x9 Matrix.

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo digi333,

Funktion FFTSHIFT aus Matlab

Fouriertransformationen kannst du z.B. mit ILNumerics.Net - numeric computing for .NET durchführen.

Gruß,
dN!3L

2.921 Beiträge seit 2005
vor 14 Jahren

@digi333:

Entweder Du benutzt was Dir vorgeschlagen wurde, oder:

Integrating MATLAB with c#

(dazu brauchst Du natürlich MATLAB)

oder Du benutzt die Fourier Funktionen aus der EDIT: LowLevelGraphicsLibrary.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 14 Jahren

Danke für eure sehr hilfreichen Tipps.

1.361 Beiträge seit 2007
vor 14 Jahren

Hi,

du kannst natürlich auch einfach FFTW per P/Invoke nutzen.
Gibt aber glaub ich auch FFTW-Wrapper für C#/.Net einfach mal googlen.

beste Grüße
zommi

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 14 Jahren

Falls jemand eine eindimensionale oder zweidimensionale FFTSHIFT (identisch zu Matlab) benötigt, darf er gerne meine selbstgeschriebene nutzen. Hat mich schließlich auch etwas Gehirnschmalz gekostet.


       private int[] fftshift1D(int[] x)
        {
            int n = (int)Math.Ceiling(x.Length/2.0);
            List<int> ar_x = new List<int>();
            for (int i = n; i < x.Length; i++)
            {
                ar_x.Add(x[i]);
            }
            for (int i = 0; i < n; i++)
            {
                ar_x.Add(x[i]);
            }
            return ar_x.ToArray();
        }

        private int[,] fftshift2D(int[,] x)
        {
            int n = (int) Math.Ceiling(x.GetLength(0)/2.0);
            List<int[]> ar_x = new List<int[]>();
            for (int i = n; i < x.GetLength(0); i++)
            {
                List<int> vector = new List<int>();
                for (int j = 0; j < x.GetLength(1); j++)
                    vector.Add(x[i, j]);
                ar_x.Add(vector.ToArray());
            }
            for (int i = 0; i < n; i++)
            {
                List<int> vector = new List<int>();
                for (int j = 0; j < x.GetLength(1); j++)
                    vector.Add(x[i, j]);
                ar_x.Add(vector.ToArray());
            }
            for (int i = 0; i < ar_x[0].Count(); i++)
                for (int j = 0; j < ar_x.Count; j++)    
                    x[i,j] = ar_x[i][j]; 
                
            n = (int)Math.Ceiling(x.GetLength(1) / 2.0);
            ar_x = new List<int[]>();
            for (int i = n; i < x.GetLength(1); i++)
            {
                List<int> vector = new List<int>();
                for (int j = 0; j < x.GetLength(0); j++)
                {
                    vector.Add(x[j, i]);
                }
                ar_x.Add(vector.ToArray());
            }

            for (int i = 0; i < n; i++)
            {
                List<int> vector = new List<int>();
                for (int j = 0; j < x.GetLength(0); j++)
                {
                    vector.Add(x[j, i]);
                }
                ar_x.Add(vector.ToArray());
            }

            for (int i = 0; i < ar_x[0].Count(); i++)
            {
                for (int j = 0; j < ar_x.Count; j++)
                {
                    x[i, j] = ar_x[j][i];
                }

            }            
            return x;
        }

2.891 Beiträge seit 2004
vor 14 Jahren

Falls jemand eine eindimensionale oder zweidimensionale FFTSHIFT (identisch zu Matlab) benötigt, darf er gerne meine selbstgeschriebene nutzen.

Am besten noch nach .NET-Komponenten und C#-Snippets kopieren/verschieben. 😉