Ich habe immer die Funktion "fft (x)" in Matlab verwendet, wo "x" ein Vektor komplexer Zahlen ist. Ich suche nach einer einfach zu benutzenden Funktion in C++, die komplexe Zahlen zurückgeben würde. http://paulbourke.net/miscellaneous/dft/Ist diese C++ - FFT-Funktion äquivalent zur "fft" -Matlab-Funktion?
Wenn es gleichwertig ist, wie kann ich es verwenden:
ich diesen Code haben herausgefunden? Vielen Dank für Ihre Zeit !
/*
This computes an in-place complex-to-complex FFT
x and y are the real and imaginary arrays of 2^m points.
dir = 1 gives forward transform
dir = -1 gives reverse transform
*/
short FFT(short int dir,long m,double *x,double *y)
{
long n,i,i1,j,k,i2,l,l1,l2;
double c1,c2,tx,ty,t1,t2,u1,u2,z;
/* Calculate the number of points */
n = 1;
for (i=0;i<m;i++)
n *= 2;
/* Do the bit reversal */
i2 = n >> 1;
j = 0;
for (i=0;i<n-1;i++) {
if (i < j) {
tx = x[i];
ty = y[i];
x[i] = x[j];
y[i] = y[j];
x[j] = tx;
y[j] = ty;
}
k = i2;
while (k <= j) {
j -= k;
k >>= 1;
}
j += k;
}
/* Compute the FFT */
c1 = -1.0;
c2 = 0.0;
l2 = 1;
for (l=0;l<m;l++) {
l1 = l2;
l2 <<= 1;
u1 = 1.0;
u2 = 0.0;
for (j=0;j<l1;j++) {
for (i=j;i<n;i+=l2) {
i1 = i + l1;
t1 = u1 * x[i1] - u2 * y[i1];
t2 = u1 * y[i1] + u2 * x[i1];
x[i1] = x[i] - t1;
y[i1] = y[i] - t2;
x[i] += t1;
y[i] += t2;
}
z = u1 * c1 - u2 * c2;
u2 = u1 * c2 + u2 * c1;
u1 = z;
}
c2 = sqrt((1.0 - c1)/2.0);
if (dir == 1)
c2 = -c2;
c1 = sqrt((1.0 + c1)/2.0);
}
/* Scaling for forward transform */
if (dir == 1) {
for (i=0;i<n;i++) {
x[i] /= n;
y[i] /= n;
}
}
return(TRUE);
}
Hallo und willkommen in SO. Zwei mögliche Ansätze: Versuchen Sie, den Code zu verstehen und zu sehen, ob er ähnliche Berechnungsschritte durchführt. Zweiter Ansatz: Versuchen Sie numerische äquivalente Tests. I.e. Testdaten einspeisen und die Ausgänge vergleichen. –
Wenn Sie wissen, wie man C++ Funktionen aufruft, wissen Sie bereits, wie man es benutzt. Die Kommentare an der Spitze sagen Ihnen, welche Eingaben erwartet werden. Auch für Ihre Frage nach "Äquivalent" wären sie zahlenmäßig äquivalent, aber der Prozess der Berechnung der FFT ist nicht derselbe. 'fft' verwendet FFTW, das die Radix-Dekomposition verwendet, um schnellere Laufzeiten zu erzielen. – rayryeng
Ein Standard wäre die [fftw library] (http://www.fftw.org). Bei Ihren Suchen hilft es, getestete, dokumentierte und weit verbreitete Bibliotheken zu favorisieren. –