2010-12-12 43 views
5

मैं एफएफटी के साथ कुछ फ़िल्टरिंग करने की कोशिश कर रहा हूं। मैं r2r_1d योजना का उपयोग कर रहा हूं और मुझे नहीं पता कि उलटा परिवर्तन कैसे करें ...एफएफटीडब्लू लाइब्रेरी में वास्तविक एफएफटी के विपरीत वास्तविक कैसे करें

void PerformFiltering(double* data, int n) 
    { 
        /* FFT */ 
     double* spectrum = new double[n]; 

     fftw_plan plan; 

     plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT00, FFTW_ESTIMATE); 

     fftw_execute(plan); // signal to spectrum 
     fftw_destroy_plan(plan); 


        /* some filtering here */ 


        /* Inverse FFT */ 
     plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT00, FFTW_ESTIMATE); 
     fftw_execute(plan); // spectrum to signal (inverse FFT) 
     fftw_destroy_plan(plan); 

} 

क्या मैं सभी चीजों को सही कर रहा हूं? FFTW जटिल एफ टी के दशक में आप एक इस तरह झंडा द्वारा दिशा बदलने सेट कर सकते हैं, क्योंकि मैं उलझन में हूँ:
पी = fftw_plan_dft_1d (एन, में, बाहर, FFTW_FORWARD, FFTW_ESTIMATE);
या
पी = fftw_plan_dft_1d (एन, इन, आउट, FFTW_BACKWARD, FFTW_ESTIMATE);

उत्तर

4

http://www.fftw.org/fftw3_doc/Real_002dto_002dReal-Transform-Kinds.html

http://www.fftw.org/fftw3_doc/1d-Real_002deven-DFTs-_0028DCTs_0029.html

"प्रकार" दिशा निर्दिष्ट करता है।

(भी ध्यान रखें कि आप शायद n से विभाजित करके अपने संकेत renormalize चाहता हूँ। N द्वारा FFTW पलता को सामान्य सम्मेलन एक को बदलने और उसके व्युत्क्रम के बाद।)

1

आप इसे सही ढंग से किया है। FFTW_REDFT00 का अर्थ है कोसाइन ट्रांसफॉर्म, जो कि इसके विपरीत है। तो "आगे" और "पिछड़ा" अंतर करने की कोई आवश्यकता नहीं है। हालांकि, सरणी आकार के बारे में सावधान रहें। यदि आप 10 की आवृत्ति का पता लगाना चाहते हैं, और आपके डेटा में 100 अर्थपूर्ण बिंदु हैं, तो सरणी data को डेटा पॉइंट्स रखना चाहिए, और 100 के बजाय n = 101 सेट करना चाहिए। सामान्यीकरण 2*(n-1) होना चाहिए। उदाहरण नीचे देखें, gcc a.c -lfftw3 साथ संकलन।

#include <stdio.h> 
#include <math.h> 
#include <fftw3.h> 
#define n 101 /* note the 1 */ 
int main(void) { 
    double in[n], in2[n], out[n]; 
    fftw_plan p, q; 
    int i; 
    p = fftw_plan_r2r_1d(n, in, out, FFTW_REDFT00, FFTW_ESTIMATE); 
    for (i = 0; i < n; i++) in[i] = cos(2*M_PI*10*i/(n - 1)); /* n - 1 instead of n */ 
    fftw_execute(p); 
    q = fftw_plan_r2r_1d(n, out, in2, FFTW_REDFT00, FFTW_ESTIMATE); 
    fftw_execute(q); 
    for (i = 0; i < n; i++) 
    printf("%3d %9.5f %9.5f\n", i, in[i], in2[i]/(2*(n - 1))); /* n - 1 instead of n */ 
    fftw_destroy_plan(p); fftw_destroy_plan(q); fftw_cleanup(); 
    return 0; 
}