如何从音频样本中确定频率和相位角的大小?

时间:2011-05-03 17:08:56

标签: java audio signal-processing fft frequency

我目前正致力于这个暗示一些DSP技能的项目。 我必须从电影中提取音频,然后通过分析,我必须确定有人说话与否,更像是语音活动检测器。

我正在用Java编写代码(是的,我知道它不是最佳选择)并且只使用库从视频和JLayer中提取音频,这样我就可以处理MP3了。

My class that extracts the audio samples连续获取每个通道的样本,在我的情况下为两个:LEFT0,RIGHT0,LEFT1,RIGHT1,LEFT2,RIGHT2等。

所以这就是我到目前为止所做的:

  • 我将每个通道的样本放在一个数组中。
  • 我应用汉明窗[N = 8192]:
      

    double w = 0.54 - 0.46 * (Math.cos(2*Math.PI*buffer[i]/buffer.length-1));   fftBuffer[i] = new Complex(w, 0);

  •   
  • 然后我在每个频道上perform a simple FFT然后计算幅度   mag = re^2 + im^2;之后,我会进行对数刻度(dB):mag_dB = 10 * log10(abs(mag));
  •   

因为我在这里“寻找声音”,所以我需要80到1000之间的频率(甚至在80 Hz和255 Hz之间的声音范围很大)。所以,从FFT我得到一个镜像的N = 8129阵列,我只需要第一个N / 2.

每个bin的频率(阵列中的插槽由FFT产生)将是采样率(48.000 kHz)  / N;这将是48000/8192 = 5 Hz每箱。所以我只在数组中查看FFT_Result [15]到FFT_Result [199](16 * 5Hz = 80 Hz; 200 * 5 = 1000 Hz)的值吧?!

我在Cool Edit Pro中查看了频率分析仪,所有幅度均为负值。在我的情况下,第一个(声音在背景中并且不响亮)是负面的,之后,它们都是正面的。他们不应该是消极的吗?我错过了这里的东西吗?

到目前为止,根据我在Cool Edit Pro中查看频率分析仪和相位分析仪所说的内容,我需要在此频率范围内设置一个阈值,某种算法可以在n毫秒内确定幅度在该频率范围内是恒定的,并确定声音是否居中。最后一个必须完成(我认为)分析相角,当有人说话时,声音始终居中。

我没有找到办法做到这一点,我对目前为止所做的事情感到困惑,因为我不知道到目前为止我所做的事情是否正确。

所以,如果你读完这一切,谢谢你的耐心,我的问题是:
  - 我做得对,到目前为止我做了什么?   - 幅度必须是负的吗?   - 有谁知道如何计算多个样本的相位?

3 个答案:

答案 0 :(得分:1)

以dB为单位,幅度可以是负数或正数,也无关紧要。重要的是,相对于某个阈值的值。我会根据周围的样本确定阈值。因为口语中的能量在说出音节时会上下波动,所以简单的平均值(乘以一些你必须使用的任意因子才能找到合适的效果)可以很好地作为一个阈值。

对于时域中的相位,您可以先进行希尔伯特变换,然后在每个样本的实部和虚部上使用atan2来估计瞬时相位。

答案 1 :(得分:0)

您可以检查两个频道之间的延迟,而不是查看各个频道的相位。假设向两个声道提供相同的信号,可以从该声道间延迟找到声源的方向。假设耳朵到耳朵的距离约为20厘米,这个延迟最多为.2 / 340 = .58ms或48kHz时的约30个样本。如果计算此范围内的互相关(30个样本),则应找到指示源方向的峰值。

要找到类似语音信号的存在,您可以计算80-1000Hz频段内的总能量,并将其与某个合理值进行阈值处理。您可以在频域中通过将容器中的幅度从80到1000Hz相加,或者使用带通滤波器和RMS值计算在时域中进行此操作。

答案 2 :(得分:0)

你有双面转换。中点是DC分量。负频率实际上是180度异相的正频率!因此,如果您使用带有负频率的FFT值的前半部分,则需要通过pi更改相位,以准确了解正在发生的情况。

或者,使用FFT值的后半部分,其中频率为正且相位正确。

  

我看了一下Cool Edit Pro中的频率分析仪和所有的   幅度是负面的。在我的情况下,第一个(声音是在   背景并且不大声)是消极的,之后,他们是   都很积极。他们不应该是消极的吗?我错过了吗   什么东西在这里?