我正在开发一种工具来比较两个波形文件的波形相似性。例如,我有一个持续时间为1分钟的波形文件,我使用第一个波形文件制作了另一个波形文件,但是每隔5秒就产生5秒数据到0。 现在我的软件将告知在5秒到10秒,15秒到20秒,25秒到30秒的时间间隔内存在波形差异等等......
截至目前,随着最初的发展,这是正常的。 以下是3个测试集:
我有两个波形文件,采样率为960Hz,单声道,没有数据样本为138551(arnd 1min 12sec文件)。我使用128点FFT(128个样本块中的分割文件),结果很好。
当我对采样率为48KHz的波形文件使用相同的算法时,每个通道的2通道没有数据样本6927361(arnd 2min 24 sec file),过程变得太慢。当我使用4096点FFT时,过程更好。
但是,对于22050Hz文件的4096点FFT,每个通道的数据样本数为55776的2通道(arnd 0.6sec文件)会产生非常差的结果。在这种情况下,128点FFT可以得到很好的结果。
所以,我对如何确定FFT的长度感到困惑,因此在每种情况下我的结果都很好。
我想长度应该取决于样本数和采样率。 请提供您的意见。
由于
答案 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的幂。 例如:
所以你将总共处理11999帧,但你的FFT长度会很小。您只需要256的FFT长度(帧长度160以上的2的下一个幂)。实现fft的大多数算法要求信号长度和fft长度相同。所有你需要做的就是将零点附加到帧信号直到256.所以用x量的零填充每个帧,其中x = FFT_length-N_length。我最新的Android应用程序在录制的语音上执行此操作,并使用短时FFT数据显示语音频谱图,并执行各种频谱修改和过滤,其称为Speech Enhancement for Android