0

我刚刚写了dft的实现。这是我的代码:

        int T = 2205;

        float[] sign = new float[T]; 
        for (int i = 0, j = 0; i < T; i++, j++)
            sign[i] = (float)Math.Sin(2.0f * Math.PI * 120.0f * i/ 44100.0f);

        float[] re = new float[T];
        float[] im = new float[T];
        float[] dft = new float[T];

        for (int k = 0; k < T; k++)
        {
            for (int n = 0; n < T; n++)
            {
                re[k] += sign[n] * (float)Math.Cos(2.0f* Math.PI * k * n / T);
                im[k] += sign[n] * (float)Math.Sin(2.0f* Math.PI * k * n / T);;
            }
            dft[k] = (float)Math.Sqrt(re[k] * re[k] + im[k] * im[k]);
        }

所以采样频率是 44100 Hz,我有一个 120Hz 正弦波的 50ms 段。根据结果​​,我在 pont 7 和 2200 处有一个 dft 函数的峰值。我做错了什么,如果没有,我应该如何解释结果?


我尝试了AFORGE的FFT方法。这是我的代码。

      int T = 2048;

        float[] sign = new float[T];
        AForge.Math.Complex[] input = new AForge.Math.Complex[T];
        for (int i = 0; i < T; i++)
        {
            sign[i] = (float)Math.Sin(2.0f * Math.PI * 125.0f * i / 44100.0f);
            input[i].Re = sign[i];
            input[i].Im = 0.0;
        }

        AForge.Math.FourierTransform.FFT(input, AForge.Math.FourierTransform.Direction.Forward);
        AForge.Math.FourierTransform.FFT(input, AForge.Math.FourierTransform.Direction.Backward);

我曾期望得到原始符号,但我得到了一些不同的东西(一个只有正值的函数)。这正常吗?提前致谢!

4

1 回答 1

1

您的代码看起来正确,但它可能更有效,DFT 通常由 FFT 算法解决(快速傅立叶变换,它不是一种新的变换,它只是一种以更有效的方式解决 DFT 的算法)。

即使您不想实现 FFT(这有点难以理解,并且更难使其适用于非 形式的数据2^n)或使用一些开源代码,您也可以使您的实现速度更快例如,通过看到它是内部循环外部的常数,因此您可以为每个 k 计算一次(将其移到内部循环外部),然后在函数中将2.0f * Math.PI * K / T其乘以。ncos/sin

至于位置和解释,你已经改变了你的域,现在你的 X 轴,它是表中数据的索引,对应的不是时间而是频率。您有采样44100Hz并且您已经捕获了2205样本,这意味着每 1 个样本代表频率等于 的输入信号的幅度44100Hz / 2205 = 20Hz。您的幅度峰值位于第 7 点(索引 6),因为您的信号为 120Hz,所以6 * 20Hz = 120Hz这是您所期望的。

秒峰值似乎代表了一些高频,但这只是一个杂散信号,因为您的采样率是44100Hz您无法测量高于44100Hz / 2(奈奎斯特定律)的频率,如果您设置截止点,那么在该频率之后 DFT 数据无效。这就是为什么,你的桌子的后半部分是无效的,它基本上是你的前半部分,但是被镜像了,你可以忽略它。

编辑//从您的问题中我可以看出您对音频处理感兴趣,您可能想要谷歌 NForge.Net 库,这是一个很棒的音频和视觉处理开源库,它的作者在codeproject.com上有很多关于它的许多功能。

于 2013-03-01T20:07:44.503 回答