注意:这不是重复,我有相关问题以外的具体要求。
首先,我想绘制一个音频文件(.wav)的频谱,就像大胆一样(类似:How to draw a frequency spectrum from a Fourier transform)。
到目前为止,我能够读取和编写wav文件。但我的问题是我不知道我需要传递给FFT函数的确切值。顺便说一下,我在C#中使用Exocortex进行FFT。 FFT函数要求我传递一个具有正确大小的复数数组(512,1024,...我假设),长度的可选整数参数和傅立叶方向(向前/向后)。
具体问题:
如果你不理解我的意思,那么尝试使用Audacity,导入音频文件,然后点击Analyze>情节谱。那些是想要重新创造的东西。请详细回答我的问题,因为我真的想学习这个。我只有一点背景知识。我只是数字信号处理的新手。另外,请尽量不要将我引导到其他FFT站点,因为他们没有具体回答我的问题。
编辑:
我已经做了一些阅读,并且发现了如何对音频数据进行FFT,但只有2的幂。那么我如何在长度不是2的音频文件中做同样的事情呢?根据一些我需要使用“窗口”。我也做了一些搜索,发现它只需要稍后处理一部分波形。请记住,我想让音频文件的FFT不是它的一部分。那我现在该怎么办?请帮忙:(
答案 0 :(得分:6)
签名是
public static void FFT( float[] data, int length, FourierDirection direction )
以下是工作代码的示例:
float[] data = new float[8];
data[0] = 1; data[2] = 1; data[4] = 1; data[6] = 1;
Fourier.FFT(data, data.Length/2, FourierDirection.Forward);
我给它4个样本,都是一样的。所以我希望只能在频率为0时获得一些东西。事实上,在运行之后,我得到了
data [0] == 1,data [2] == 1,data [4] == 1,data [6] == 1
其他人都是0。
如果我想使用复杂数组重载
Complex[] data2 = new Complex[4];
data2[0] = new Complex(1,0);
data2[1] = new Complex(1, 0);
data2[2] = new Complex(1, 0);
data2[3] = new Complex(1, 0);
Fourier.FFT(data2,data2.Length,FourierDirection.Forward);
请注意,这里第二个参数等于数组的长度,因为每个数组成员都是一个复数。我得到了和以前一样的结果。
我想我以前错过了复杂的超载。除非您的数据已成对出现,否则我似乎不易出错且使用起来更自然。