2009-11-03 4 views
0

저는 기본 주파수를 실시간으로 얻고 고역 통과 필터를 구현하기 위해 fft를했습니다.fft에서 ifft를 계산하는 방법은 무엇입니까?

이제 필터를 적용한 후 .wav 파일로 녹음 할 수있게하려고합니다.

먼저 fft를 반전시켜야하며 이것이 내 질문입니다. 이 작업을 수행하기위한 단계는 무엇입니까?

project에 정의 된 FFT를 사용합니다. 정확한 FFT 및 IFFT 정의에 따라 차이는 상수이다

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace SoundLog 
{ 
    public class FourierTransform 
    { 
     static private int n, nu; 

     static private int BitReverse(int j) 
     { 
      int j2; 
      int j1 = j; 
      int k = 0; 
      for (int i = 1; i <= nu; i++) 
      { 
       j2 = j1/2; 
       k = 2 * k + j1 - 2 * j2; 
       j1 = j2; 
      } 
      return k; 
     } 

     static public double[] FFT(ref double[] x) 
     { 
      // Assume n is a power of 2 
      n = x.Length; 
      nu = (int)(Math.Log(n)/Math.Log(2)); 
      int n2 = n/2; 
      int nu1 = nu - 1; 
      double[] xre = new double[n]; 
      double[] xim = new double[n]; 
      double[] magnitude = new double[n2]; 
      double[] decibel = new double[n2]; 
      double tr, ti, p, arg, c, s; 
      for (int i = 0; i < n; i++) 
      { 
       xre[i] = x[i]; 
       xim[i] = 0.0f; 
      } 
      int k = 0; 
      for (int l = 1; l <= nu; l++) 
      { 
       while (k < n) 
       { 
        for (int i = 1; i <= n2; i++) 
        { 
         p = BitReverse(k >> nu1); 
         arg = 2 * (double)Math.PI * p/n; 
         c = (double)Math.Cos(arg); 
         s = (double)Math.Sin(arg); 
         tr = xre[k + n2] * c + xim[k + n2] * s; 
         ti = xim[k + n2] * c - xre[k + n2] * s; 
         xre[k + n2] = xre[k] - tr; 
         xim[k + n2] = xim[k] - ti; 
         xre[k] += tr; 
         xim[k] += ti; 
         k++; 
        } 
        k += n2; 
       } 
       k = 0; 
       nu1--; 
       n2 = n2/2; 
      } 
      k = 0; 
      int r; 
      while (k < n) 
      { 
       r = BitReverse(k); 
       if (r > k) 
       { 
        tr = xre[k]; 
        ti = xim[k]; 
        xre[k] = xre[r]; 
        xim[k] = xim[r]; 
        xre[r] = tr; 
        xim[r] = ti; 
       } 
       k++; 
      } 
      for (int i = 0; i < n/2; i++) 
       //magnitude[i] = (float)(Math.Sqrt((xre[i] * xre[i]) + (xim[i] * xim[i]))); 
       decibel[i] = 10.0 * Math.Log10((float)(Math.Sqrt((xre[i] * xre[i]) + (xim[i] * xim[i])))); 
      //return magnitude; 
      return decibel; 
     } 
    } 
} 

답변

2

FFTW과 같이 주위에 정말 좋은 fft 구현이 많이 있는데이 중 하나를 사용하는 것이 좋습니다. 그들은 또한 ifft와 함께 온다. 구현 된대로 당신은 엄청나게 천천히 움직일 것입니다.

+0

속도는 문제가되지 않습니다. C#에서이를 수행해야하며 FFTW에는 C++ 만 있습니다. plz를 게시 한 파일을 어떻게 변환 할 수 있습니까? –

+0

순방향 및 역방향 fts에는 두 가지 차이점이 있습니다. 역함수는 1/n으로 조정해야하며 지수는 음수이어야합니다. 그래서 inverse ft에 대해서 (당신의 구현을 이해한다고 가정 할 때) arg의 부호를 바꾸고 결과의 각 점에 1/n을 곱하십시오. –

+0

또한 모든 imaginaries를 0으로 설정하여 실제 데이터에 복잡한 fft를 사용하고 있습니다. 이것은 수학적으로 건전하지만 낭비입니다. 실제 가치있는 fft에 대한 정보는 Numerical Recipes 웹 페이지 (nr.com)를보십시오. –

-4

: 여기

는 코드입니다. 귀하의 경우 상수를 결정하는 가장 쉬운 방법은 아마도 시험입니다 & 오류입니다.

+0

이 프로젝트에 정의 된 FFT를 사용합니다. http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx 도와 주시겠습니까? –

+0

시행 착오? 위의 내 의견을 확인하십시오. "Trial & error"는 –

+0

-1입니다! – AAT

관련 문제