【问题标题】:How to compute ifft from fft?如何从fft计算ifft?
【发布时间】:2009-11-03 10:48:14
【问题描述】:

我已经做了一个 fft 来实时获取基频并实现高通和低通滤波器。

现在我希望在应用过滤器后能够录制到 .wav 文件。

首先我必须反转 fft,这是我的问题。 执行此操作的步骤是什么?

我使用这个project中定义的FFT。

这是它的代码:

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

【问题讨论】:

    标签: c# filter signal-processing fft


    【解决方案1】:

    周围有很多非常好的 fft 实现,例如 FFTW,我强烈推荐使用其中一个。他们也有 ifft。实施后,您的速度将非常缓慢。

    【讨论】:

    • 目前速度不是问题。我需要用 c# 来做,而 FFTW 只有 c++。你能告诉我如何转换我发布的那个吗?
    • 正向和反向 fts 有两个区别。逆需要按 1/n 缩放,指数为负。因此,对于逆 ft(假设我了解您的实现)更改 arg 的符号并将结果中的每个点乘以 1/n。
    • 另外,您通过将所有虚数设置为零来对实际数据使用复数 fft。这在数学上是合理的,但很浪费。查看 Numerical Recipes 网页 (nr.com) 了解有关实值 ffts 的信息。
    • 我正在从 fft 传递到 ifft,因为我想录制为 .wav 格式。在传递给 ifft(与 fft 的长度相同)后,我需要把它变大吗?以及如何将这些数据放入 .wav 中?如何制作 .wav?
    猜你喜欢
    • 2011-08-06
    • 2011-08-14
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多