2011-11-15 53 views
4

我正在研究一个工具来比较两个波形文件的波形相似性。恩,我有时间1分钟的声音文件,并让我使用的第一个一拨文件,但在5秒的0 的间隔取得各5秒的数据现在我的软件会告诉大家,有波形差异在时间间隔5秒以10秒,15秒到20秒,25秒到30秒,等等...决定FFT的长度

截至目前,初始的发展,这是工作的罚款。 以下是3个试台:

  1. 我有960Hz的采样率,单声道,没有数据样本为138551(1分钟的Arnd文件12秒)2个波文件。我正在使用128点FFT(分割128个样本块),结果很好。

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

  3. 但是,对于每个通道的数据采样数为55776的22050Hz,2通道文件的4096点FFT(波形为0.6秒文件)的结果非常差。在这种情况下,128点FFT会给出好的结果。

所以,我很困惑如何决定FFT的长度,以便我的结果在每种情况下都很好。

我想长度应当取决于样品和采样率的数量。 请在此提供您的意见。

由于

+1

有100件事情需要您在尝试之前学习像这样的东西,仅举几例 - FFT窗口,声音重采样(采样率变化),音频指纹识别的当前技术,...确定正确的声音匹配算法应该是第一个,它应该来自您的声音匹配的要求。 –

+0

@DanielMošmondor现在,我不担心文件的不同采样率,因为我的输入文件之一是使用另一个文件。所以,抽样率是我最担心的问题。 我只是比较波形,并尝试通过FFT和比较频率分量的大小来找到它们的相似程度。我面临的问题是决定FFT的长度,保持固定或取决于采样率和样本总数(或wav文件的长度) – Garfield

回答

4

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

resolution (Hz) = sample_rate (Hz)/N 

因此,例如,在情况(1)你有resolution = 960/128 = 7.5 Hz。 SO每个在所得FFT(或可能从该导出的功率谱)将是7.5赫兹宽,并且你将能够其中相距很远至少这个频率分量之间进行区分。

既然你不说什么样的波形这些,或者你的应用程序的目的是,它是很难知道你需要什么样的分辨率。

一个重要的进一步的观点 - 许多人第一次使用FFT并不知道一般情况下,您需要在FFT之前应用window function以避免spectral leakage

+0

感谢您的答复。我不确定我应该选择什么样的解决方案。波形是简单的波形文件。这可以像转换为wav格式的音频剪辑一样。在这里,我认为freq决议对我来说并不重要。 关于窗口函数,我用于FFT的数据是静态的,从wav文件中提取,我真的需要应用任何窗口函数吗?如果我这样做,那么这里我也需要窗口长度和FFT长度相同,然后我又回到了第一个窗口。 – Garfield

+0

960赫兹是一个非常低的音频采样率,但我假设你知道你在做什么 - 你能给出更多关于应用程序的信息,因为这很可能决定你需要的分辨率吗? (我猜这可能就像地震数据一样?)无论如何,是的,你肯定需要一个窗口函数 - 像von Hann一样使用简单的东西,窗口大小和FFT的大小相同。 –

+0

是的,960Hz的采样率太低,但它只是一个测试文件来测试我的应用程序。 我只是比较波形,并尝试通过FFT和比较频率分量的大小来找到它们的相似程度。我面临的问题是决定FFT的长度,以确保其固定或取决于采样率和样本总数(即wav文件的长度)。 直到现在,我假设两个文件的采样率都是相同的,并且没有时间偏移的事情。正如你所说,我将使用窗口函数。长度对我来说仍然是个问题。 – Garfield

1

,我不得不说,我发现你的问题很神秘。我认为你应该看看短时傅立叶变换。我之所以这么说,是因为如果您在2分钟内使用2分钟44.1KhZ的采样频率,则您正在查看相当多的样本。整个数据中的一个数据实际上需要相当长的一段时间,更不用说估计值会有偏差,因为信号意味着变化在整个过程中都会急剧变化。为了避免这种情况,您希望首先对时域信号进行帧,这些帧可以小到20ms-40ms(通常用于语音)并且通常重叠(Welch method of Spectral Estimation)。然后应用一个窗函数,如Hamming或Hanning窗口来减少频谱泄漏,并计算每帧的N点fft。其中N是该帧中样本数之上的下一个二的幂。 例如:

  1. Fs = 8Khz,单通道;
  2. 时间= 120秒;
  3. no_samples = time * 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;

所以你将总共处理11999帧,但是你的FFT长度会很小。您只需要一个256的FFT长度(下一个帧长度160以上的两个功率)。大多数实现fft的算法都要求信号长度和fft长度相同。你所要做的就是在你的成帧信号上加零,直到256.所以用x个零填充每一帧,其中x = FFT_length-N_length。我的最新Android应用程序在录制的语音中执行此操作,并使用短时FFT数据显示语音的频谱图,并执行各种频谱修改和过滤,其名称为Speech Enhancement for Android