1

Ich habe Daten über die Rötung des Fingers des Benutzers, die derzeit ziemlich laut ist, also möchte ich es durch eine FFT ausführen, um das Rauschen zu reduzieren. Die Daten auf der linken Seite von this image sind ähnlich wie meine Daten derzeit. Ich habe mich mit der Apple-Dokumentation bezüglich vDSP vertraut gemacht, aber es scheint keine klare oder prägnante Anleitung zu geben, wie man eine Fast Fourier Transformation mit Apples vDSP und dem Accelerate-Framework implementiert. Wie kann ich das machen?Implementieren einer FFT mit vDSP

Ich habe bereits auf this question verwiesen, die zu einem ähnlichen Thema ist, aber ist deutlich veraltet und beinhaltet nicht vDSP.

Antwort

3

Die Verwendung von vDSP für FFT-Berechnungen ist ziemlich einfach. Ich nehme an, Sie haben echte Werte bei der Eingabe. Das einzige, was Sie beachten sollten, ist, dass Sie Ihr reelles Array in ein komplexes Array konvertieren müssen, das FFT algo von vDSP intern verwendet.

Sie können einen guten Überblick in der Dokumentation:

https://developer.apple.com/library/content/documentation/Performance/Conceptual/vDSP_Programming_Guide/UsingFourierTransforms/UsingFourierTransforms.html

Hier ist das kleinste Beispiel für reelle FFT Berechnung:

const int n = 1024; 
const int log2n = 10; // 2^10 = 1024 

DSPSplitComplex a; 
a.realp = new float[n/2]; 
a.imagp = new float[n/2]; 

// prepare the fft algo (you want to reuse the setup across fft calculations) 
FFTSetup setup = vDSP_create_fftsetup(log2n, kFFTRadix2); 

// copy the input to the packed complex array that the fft algo uses 
vDSP_ctoz((DSPComplex *) input, 2, &a, 1, n/2); 

// calculate the fft 
vDSP_fft_zrip(setup, &a, 1, log2n, FFT_FORWARD); 

// do something with the complex spectrum 
for (size_t i = 0; i < n/2; ++i) { 
    a.realp[i]; 
    a.imagp[i]; 
} 

Ein Trick ist, dass a.realp[0] der DC-Offset ist und a.imagp[0] ist die reellwertige Größe bei der Nyquist-Frequenz.