2012-01-10 20 views
19

मैं सी में एक एफएफटी कार्यान्वयन की तलाश में था। हालांकि, मैं एक बड़ी पुस्तकालय (जैसे एफएफटीडब्लू) की तलाश नहीं कर रहा हूं, लेकिन एकल सी-फाइल कार्यान्वयन का उपयोग करने में आसान है। दुर्भाग्य से मैं इस तरह कुछ भी नहीं मिला है।एक सी-फाइल में एफएफटी

क्या कोई सरल कार्यान्वयन की सिफारिश कर सकता है?

+0

कोशिश [GitHub पर 'fft' की खोज करने] (https://github.com/search?langOverride=c&q=fft&repo=&start_value=1&type=Repositories)। लेकिन एफएफटीडब्ल्यू के बारे में क्या उपयोग करना आसान नहीं है? क्या आपका मतलब स्रोत को समझना आसान है? – Rup

+9

अपना खुद का लिखें। यह एक अच्छा अभ्यास होगा। इंटरनेट डीएफटी और एफएफटी की गणना करने के तरीके के बारे में स्पष्टीकरण से भरा है। उसका उपयोग करें। –

+1

एफएफटी दिनचर्या [यहां] (http://www.fit.vutbr.cz/research/prod/?id=510) कोड की सौ से कम पंक्तियां हैं। लाइब्रेरी समय में (डीआईटी) और आवृत्ति में डीकिमेशन (डीआईएफ) का उपयोग करके आगे और व्यस्त तेज़ फूरियर ट्रांसफॉर्म (एफएफटी) एल्गोरिदम लागू करता है। – DaBler

उत्तर

20

आपका सबसे अच्छा शर्त KissFFT है - जैसा कि इसके नाम यह simple है निकलता है, लेकिन यह अभी भी काफी इज्जत की तेजी है, और एक बहुत अधिक FFTW से हल्के। यह भी मुफ़्त है, अगर आप इसे एक वाणिज्यिक उत्पाद में शामिल करना चाहते हैं तो एफएफटीडब्ल्यू को एक भारी लाइसेंस शुल्क की आवश्यकता होती है।

+1

केवल तभी यदि आप इसे पुनर्वितरित कर रहे हैं, और जीपीएल के तहत स्रोत जारी नहीं कर रहे हैं ... –

+1

यही वही है जो मैं ढूंढ रहा था। आपका बहुत बहुत धन्यवाद। – mijc

5

आप this java snippet से सी में कनवर्ट करना शुरू कर सकते हैं लेखक ने कहा कि उन्होंने इसे numerical recipies पर आधारित सी से रूपांतरित कर दिया है जो आपको ऑनलाइन मिलती है! here

7

यह फ़ाइल ठीक तरह से काम करती है: बस अपने कंप्यूटर में कॉपी और पेस्ट करें। वेब पर सर्फिंग मुझे विकिपीडिया पेज here पर यह आसान कार्यान्वयन मिला है। पृष्ठ इतालवी में है, इसलिए मैंने कुछ अनुवादों के साथ कोड फिर से लिखा। Here लगभग समान जानकारी हैं लेकिन अंग्रेजी में। का आनंद लें!

#include <iostream> 
#include <complex> 
#define MAX 200 

using namespace std; 

#define M_PI 3.1415926535897932384 

int log2(int N) /*function to calculate the log2(.) of int numbers*/ 
{ 
    int k = N, i = 0; 
    while(k) { 
    k >>= 1; 
    i++; 
    } 
    return i - 1; 
} 

int check(int n) //checking if the number of element is a power of 2 
{ 
    return n > 0 && (n & (n - 1)) == 0; 
} 

int reverse(int N, int n) //calculating revers number 
{ 
    int j, p = 0; 
    for(j = 1; j <= log2(N); j++) { 
    if(n & (1 << (log2(N) - j))) 
     p |= 1 << (j - 1); 
    } 
    return p; 
} 

void ordina(complex<double>* f1, int N) //using the reverse order in the array 
{ 
    complex<double> f2[MAX]; 
    for(int i = 0; i < N; i++) 
    f2[i] = f1[reverse(N, i)]; 
    for(int j = 0; j < N; j++) 
    f1[j] = f2[j]; 
} 

void transform(complex<double>* f, int N) // 
{ 
    ordina(f, N); //first: reverse order 
    complex<double> *W; 
    W = (complex<double> *)malloc(N/2 * sizeof(complex<double>)); 
    W[1] = polar(1., -2. * M_PI/N); 
    W[0] = 1; 
    for(int i = 2; i < N/2; i++) 
    W[i] = pow(W[1], i); 
    int n = 1; 
    int a = N/2; 
    for(int j = 0; j < log2(N); j++) { 
    for(int i = 0; i < N; i++) { 
     if(!(i & n)) { 
     complex<double> temp = f[i]; 
     complex<double> Temp = W[(i * a) % (n * a)] * f[i + n]; 
     f[i] = temp + Temp; 
     f[i + n] = temp - Temp; 
     } 
    } 
    n *= 2; 
    a = a/2; 
    } 
} 

void FFT(complex<double>* f, int N, double d) 
{ 
    transform(f, N); 
    for(int i = 0; i < N; i++) 
    f[i] *= d; //multiplying by step 
} 

int main() 
{ 
    int n; 
    do { 
    cout << "specify array dimension (MUST be power of 2)" << endl; 
    cin >> n; 
    } while(!check(n)); 
    double d; 
    cout << "specify sampling step" << endl; //just write 1 in order to have the same results of matlab fft(.) 
    cin >> d; 
    complex<double> vec[MAX]; 
    cout << "specify the array" << endl; 
    for(int i = 0; i < n; i++) { 
    cout << "specify element number: " << i << endl; 
    cin >> vec[i]; 
    } 
    FFT(vec, n, d); 
    cout << "...printing the FFT of the array specified" << endl; 
    for(int j = 0; j < n; j++) 
    cout << vec[j] << endl; 
    return 0; 
} 
+2

यह वास्तव में आश्चर्यजनक रूप से संक्षेप में है। – Vortico

+0

समझने में आसान और, अधिक महत्वपूर्ण, यह ठीक से काम करता है। इसके अलावा आप इसे अपने मिशन – Leos313

+0

पर अनुकूलित करने के लिए इसे आसानी से संशोधित कर सकते हैं इस कोड के साथ उलटा एफएफटी कैसे करें? – alexandrecosta

संबंधित मुद्दे