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

标签 c# audio signal-processing 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?

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

如果您不考虑开窗,您会自动应用一个矩形窗口:您的信号在 FFT 开始时“突然”开始,在 FFT 结束时“突然”结束。这样就形成了一个矩形窗口。

现在,FFT 结果恰好是输入信号(单个峰值)的傅立叶变换和该矩形窗口的傅立叶变换的卷积(sinc == sin( x)/x 函数).

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

关于c# - 没有从 Exocortex FFT 获得预期的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29432534/

相关文章:

android - 当我的 Android 应用正在播放音乐时,如何关闭所有其他音乐?

python - 音频可视化

python - 如何使用可变宽度高斯在 python 中执行卷积?

matlab - 以给定速率生成 100 个样本

c# - 序列化包含 XDocument 的属性

c# - DinkToPdf Net Core 无法加载 DLL 文件

c# - 如何根据对象的类型创建 WinForms 组件

c# - DotNet.Highcharts : Cost not plotted against the correct date

c++ - 正在生成缓慢的 vpermpd 指令;为什么?

android - android系统中各种音源有什么区别?