决定FFT的长度

时间:2011-11-15 06:14:17

标签: audio size fft wav waveform

我正在开发一种工具来比较两个波形文件的波形相似性。例如,我有一个持续时间为1分钟的波形文件,我使用第一个波形文件制作了另一个波形文件,但是每隔5秒就产生5秒数据到0。 现在我的软件将告知在5秒到10秒,15秒到20秒,25秒到30秒的时间间隔内存在波形差异等等......

截至目前,随着最初的发展,这是正常的。 以下是3个测试集:

  1. 我有两个波形文件,采样率为960Hz,单声道,没有数据样本为138551(arnd 1min 12sec文件)。我使用128点FFT(128个样本块中的分割文件),结果很好。

  2. 当我对采样率为48KHz的波形文件使用相同的算法时,每个通道的2通道没有数据样本6927361(arnd 2min 24 sec file),过程变得太慢。当我使用4096点FFT时,过程更好。

  3. 但是,对于22050Hz文件的4096点FFT,每个通道的数据样本数为55776的2通道(arnd 0.6sec文件)会产生非常差的结果。在这种情况下,128点FFT可以得到很好的结果。

  4. 所以,我对如何确定FFT的长度感到困惑,因此在每种情况下我的结果都很好。

    我想长度应该取决于样本数和采样率。 请提供您的意见。

    由于

2 个答案:

答案 0 :(得分:5)

FFT的长度N将决定频域中的分辨率:

resolution (Hz) = sample_rate (Hz) / N

例如,在案例(1)中,您有resolution = 960 / 128 = 7.5 Hz。因此,得到的FFT中的每个 bin (或者可能是由此得出的功率谱)将是7.5 Hz宽,并且您将能够区分至少相距甚远的频率分量。

由于您没有说明这些波形是什么类型,或者您的应用目的是什么,因此很难知道您需要什么样的分辨率。

一个重要的进一步观点 - 许多人第一次使用FFT时并不知道通常需要在FFT之前应用window function以避免spectral leakage

答案 1 :(得分:1)

我不得不说我发现你的问题非常神秘。我认为你应该研究短时傅立叶变换。我说这个的原因是因为如果你使用2个通道2分钟的采样频率为44.1KhZ,你会看到相当多的样本。确实,整个数量的一个fft将花费相当长的时间,更不用说估计将随着信号的平均值而有偏差,并且方差将在整个持续时间内急剧变化。为了避免这种情况,您需要首先对时域信号进行帧化,这些帧可以小到20ms-40ms(通常用于语音)并且经常重叠(Welch method of Spectral Estimation)。然后应用一个窗口函数,如汉明或汉宁窗口,以减少光谱泄漏,并计算每帧的N点fft。其中N是该帧中样本数量的下一个2的幂。 例如:

  1. Fs = 8Khz,单通道;
  2. 时间= 120秒;
  3. no_samples =时间* Fs = 960000;
  4. 帧长T_length = 20ms;
  5. 样本中的帧长度N_length = 160;
  6. 帧重叠T_overlap = 10ms;
  7. 样本中的帧重叠N_overlap = 80;
  8. 帧数N_frames =(no_samples - (N_length-N_overlap))/ N_overlap = 11999;
  9. FFT长度= 256;
  10. 所以你将总共处理11999帧,但你的FFT长度会很小。您只需要256的FFT长度(帧长度160以上的2的下一个幂)。实现fft的大多数算法要求信号长度和fft长度相同。所有你需要做的就是将零点附加到帧信号直到256.所以用x量的零填充每个帧,其中x = FFT_length-N_length。我最新的Android应用程序在录制的语音上执行此操作,并使用短时FFT数据显示语音频谱图,并执行各种频谱修改和过滤,其称为Speech Enhancement for Android