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!
Hallo digi333,
du meinst keine identische Funktion bzw. Methode. Vermutlich gibt es im .NET Framework auch keine.
herbivore
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.
Hallo digi333,
Funktion FFTSHIFT aus Matlab
Fouriertransformationen kannst du z.B. mit ILNumerics.Net - numeric computing for .NET durchführen.
Gruß,
dN!3L
@digi333:
Entweder Du benutzt was Dir vorgeschlagen wurde, oder:
(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.
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
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;
}
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. 😉