繁体   English   中英

如何使用FFT绘制wav文件的频谱?

[英]How do I plot the spectrum of a wav file using FFT?

注意:这不是重复,我有相关问题以外的具体要求。

首先,我想绘制一个音频文件(.wav)的光谱,就像大胆一样(类似: 如何从傅立叶变换中绘制频谱 )。

到目前为止,我能够读取和写入wav文件。 但我的问题是我不知道我需要传递给FFT函数的确切值。 顺便说一下,我在C#中使用Exocortex进行FFT。 FFT函数要求我传递一个具有正确大小的复数数组(512,1024,...我假设),长度的可选整数参数和傅里叶方向(前向/后向)。

具体问题:

  1. Exocortex库中的Complex(类)有两个值,即Real和Imaginary。 我有一系列样本,所以应该是真实的,哪些应该是虚构的?
  2. 我有wav文件,所以长度应该假定为变量。 如何将其传递给FFT函数? 我应该选择一个大小(512/1024 /等),将整个样本分成大小,然后将所有样本传递给FFT吗?
  3. 我怎么知道应该在x轴上列出哪些频率?
  4. 如何绘制FFT数据? (我希望x轴是频率,y轴是分贝)

如果你不理解我的意思,那么尝试使用Audacity,导入音频文件,然后单击Analyze> Plot Spectrum。 那些是想要重新创造的东西。 请详细回答我的问题,因为我真的想学习这个。 我只有一点背景知识。 我只是数字信号处理的新手。 另外请尽量不要将我引导到其他FFT网站,因为他们没有具体回答我的问题。


编辑:

我已经完成了一些阅读,并且发现了如何对音频数据进行FFT,但只有2的幂。那么我如何在长度不是2的音频文件中做同样的事情呢? 根据一些我需要使用“窗口”。 我也做了一些搜索,发现它只需要稍后处理一部分波形。 请记住,我想让音频文件的FFT不是它的一部分。 那我现在该怎么办? 请帮忙 :(

签名是

public static void  FFT( float[] data, int length, FourierDirection direction )
  1. 传递一组复数,表示为对。 由于您只有实数(样本),您应该将样本放在数组中的偶数位置 - data [0],data [2],data [4]等。 奇数位置应为0,数据[1] =数据[3] = 0 ...
  2. 长度是您想要计算FFT的样本量,它应该是数据阵列长度的一半。 您可以对整个WAV或部分WAV进行FFT - 取决于您希望看到的内容。 Audacity将绘制文件所选部分的功率谱,如果您希望这样做,则传递整个WAV或所选部分。
  3. FFT只会显示高达采样率一半的频率。 所以你应该有0到一半的采样率。 值的大小取决于您拥有的样本量(样本量将影响计算的精度)
  4. Audacity绘制了功率谱。 您应该在您收到的数组中获取每个复数对并计算其ABS。 ABS定义为sqrt(r ^ 2 + i ^ 2)。 每个ABS值将对应于单个频率。

这是一个工作代码的示例:

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

请注意,这里第二个参数等于数组的长度,因为每个数组成员都是一个复数。 我得到了和以前一样的结果。

我想我之前错过了复杂的超载。 除非您的数据已经成对出现,否则我似乎不易出错且使用起来更自然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM