尊重原创,http://blog.csdn.net/y1196645376/article/details/53319142
转载请申明出处,谢谢!
FFT
- extends FourierTransform
FFT代表了快速傅里叶变换, 它是一种高效的计算复数离散傅里叶变换的有效方法.对于这个类没有什么其他好说的了,因为当你想要分析音频缓冲区的频谱的时候,你几乎总是使用这个类。这个类有个限制是如果你想要分析的声音缓冲区的长度必须是2的幂. 如果你想通过一个timeSize不是2的幂的声音构建FFT, 那么将会抛出IllegalArgumentException 。 傅里叶变换是在时域中变换信号的算法, 就例如样本缓冲器, 转换成频域中的信号,通常称为频谱. 频谱不代表个体的频率, 但是实际上代表了以特定频率为中心的频带. 每个频带的中心频率通常表示为时域信号的采样速率,并且等于频带的索引除以频带的总数。频带的数量通常等于时域信号的长度, 但只提供访问频率波段指数小于长度的一半,因为他们符合低于Nyquist频率的频率。换句话说,给定一个长度为N的信号,在频谱中会有N / 2个频带。 作为一个例子,我们将通过一个时间大小为1024以及采样率为44100Hz来构造一个FFT, 然后频谱将包括频率低于22010HZ的值, 这就是Nyquist频率(一半的采样率).如果你想要询问五号带的值, 它将对应一个以5/1024 * 44100 = 0.0048828125 * 44100 = 215 Hz为中心的频带. 频带的宽度等于2/1024, 表示为频谱的总带宽的一小部分. 频谱的总带宽等于Nyquist频率, 在本例中为22050, 所以带宽约为50Hz. 你没有必要记住所有这些关系,可是意识到它们是有意义的。 函数 getFreq() 允许你查询频谱的频率(HZ),以及函数 getBandWidth() 将会返回频谱中每个频带的带宽(HZ)。 使用: FFT的典型用途是分析信号,使得频谱可以以某种方式表示, 通常使用竖直线。 你可以在Processing中使用如下代码, audio 是一个AudioSource,fftis是一个FFT。 |
fft.forward(audio.left);
for (int i = 0; i < fft.specSize(); i++)
{
line(i, height, i, height - fft.getBand(i) * 4);
}
构造概述: |
FFT(int timeSize, float sampleRate) |
通过一个timeSize大小并且采样速率为sampleRate的缓冲区构造FFT |
方法概述: |
public void scaleBand(int i,float s) |
用s缩放第i个频带的幅度。 在使用inverse()之前,可以使用此函数对频谱进行整形。 Specified by: scaleBand in class FourierTransform Parameters: i - int: 要修改的频带 s - float: 缩放因子 |
public void setBand(int i,float a) |
将第i个频带的幅度设置为a。在使用inverse()之前,可以使用此函数对频谱进行整形。 Specified by: setBand in class FourierTransform Parameters: i - int: 要修改的频带 a - float: 新值 |
public void forward(float[] buffer) |
对缓冲区的执行向前变换。 Specified by: forward in class FourierTransform Parameters: buffer - float[]: 要分析的缓冲区大小必须等于timeSize()。 |
public void forward(float[] buffer,int startAt) |
对缓冲区的执行向前变换。 Specified by: forward in class FourierTransform Parameters: buffer - float[]: 要分析的缓冲区大小必须等于timeSize()。 startAt - int: 缓冲区开始的序号,如果发生错误将不会执行,数据会还原回去。 |
public void inverse(float[] buffer) |
进行频率谱的反变换,并将结果放在缓冲区中 Specified by: inverse in class FourierTransform Parameters: buffer - float[]: 对缓冲区指向前向信息进行逆变换。 |