2010-12-12 31 views
5

Tôi đang cố gắng thực hiện một số tính năng lọc với FFT. Tôi đang sử dụng kế hoạch r2r_1d và tôi không biết cách làm biến đổi nghịch đảo ...Cách thực hiện nghịch đảo thực với FFT thực trong thư viện FFTW

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); 

} 

Tôi có làm mọi thứ đúng không? Tôi đang bối rối vì trong FFTW phức tạp DFT của bạn có thể thiết lập một hướng chuyển đổi bằng cờ như thế này:
p = fftw_plan_dft_1d (N, trong, ra, FFTW_FORWARD, FFTW_ESTIMATE);
hoặc
p = fftw_plan_dft_1d (N, trong, ngoài, FFTW_BACKWARD, FFTW_ESTIMATE);

Trả lời

1

Bạn đã làm điều đó một cách chính xác. FFTW_REDFT00 có nghĩa là biến đổi cosin, là nghịch đảo riêng của nó. Vì vậy, không cần phân biệt "chuyển tiếp" và "lạc hậu". Tuy nhiên, hãy cẩn thận về kích thước mảng. Nếu bạn muốn phát hiện tần suất 10 và dữ liệu của bạn chứa 100 điểm có ý nghĩa thì mảng data phải giữ điểm dữ liệu và đặt n = 101 thay vì 100. Bình thường hóa phải là 2*(n-1). Xem ví dụ bên dưới, biên dịch với 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; 
} 
Các vấn đề liên quan