没有从 Exocortex FFT 获得预期的输出

Not getting expected output from Exocortex FFT

我正在使用 C# 的 Exocortex.DSP 库,但它没有给我预期的输出。我不太确定为什么。我在此示例中使用的音频文件是 16 位无符号 .wav 文件中的纯 800Hz 音调。在 Audacity 中,我可以看到它只是一个正弦波。我将文件(使用 NAudio)作为字节 [] 接收,然后使用 BitConverter.Single 转换它。在阵列上的 运行 Fourier.FFT 之后,我希望在样本 [800] 处看到重要数据,在其他任何地方都为零,但这与我得到的数据完全不同。这是代码...

public static void Main(string[] args)
    {
        var waveChannel = new WaveChannel32(new WaveFileReader("../../Files/800Hz.wav"));
        var buffer = new byte[4096 * 4];
        waveChannel.Read(buffer, 0, 4096 * 4);
        var samples = new ComplexF[4096];

        for (int i = 0; i < 4096; i++)
        {
            samples[i].Re = BitConverter.ToSingle(buffer, i * 4);
        }
        Fourier.FFT(samples, FourierDirection.Forward);
        for (int i = 790; i < 810; i++)
            Console.WriteLine(i + ": " + samples[i]);
    }

...这给了我以下输出...

790: ( -0.4223004, -0.5940632i )
791: ( -0.4242424, -0.6004524i )
792: ( -0.4241259, -0.591617i )
793: ( -0.4438736, -0.5921871i )
794: ( -0.4386246, -0.5902517i )
795: ( -0.4222358, -0.6125283i )
796: ( -0.424219, -0.586903i )
797: ( -0.4283331, -0.6008587i )
798: ( -0.4152279, -0.5989774i )
799: ( -0.4329002, -0.5994851i )
800: ( -0.4230377, -0.5904933i )
801: ( -0.4128067, -0.5878658i )
802: ( -0.4171145, -0.5898319i )
803: ( -0.4254847, -0.572481i )
804: ( -0.4199851, -0.5827408i )
805: ( -0.4186496, -0.5890546i )
806: ( -0.4181305, -0.6026474i )
807: ( -0.4402256, -0.5738652i )
808: ( -0.4149643, -0.589726i )
809: ( -0.4256677, -0.599369i )

我也尝试计算每个复数的大小,看看是否能给我一些更重要的东西,但仍然得到类似的结果。我不太确定我是否遗漏了代码中的某些内容,或者只是不理解结果。请帮忙?

signal[800]

处找不到 800 Hz 分量

FFT结果的N个复样本具有频率范围

 0 Hz .. Ns/2, with Ns = sampling frequency of your time signal

采样频率为 44.1 kHz,第一个 FFT 样本为 0 Hz(直流),最后一个 FFT 样本为 22.05 KHz(奈奎斯特频率)。

如果这是 1024 点 FFT,您将获得 512 个复样本。所以两个 FFT 样本之间的距离是 22050/512 == 43 Hz,所以你的 800Hz 线大约是第 18 个样本。


编辑

为什么这些其他分量不等于 0.0?

傅里叶变换假定循环输入。如果您的输入不是循环的,则必须应用 window 以使您的输入有限(并适合单个循环。)

如果您不考虑 windowing,您会自动应用一个矩形 window:您的信号在 FFT 开始时开始 "suddenly" 并结束 "suddenly"在 FFT 结束时。这使得一个矩形 window.

现在,FFT 结果恰好是输入信号(单峰)的傅里叶变换的卷积 和这个矩形的傅里叶变换window(sinc == sin(x)/x 函数)。

因此,您看到的单个正弦分量的 FFT 结果实际上是矩形 window 的傅里叶变换,一个 sinc 函数,仅在少数几个点处为零。