低音哨声?

时间:2014-11-10 18:25:30

标签: java android audio filter fft

我正在使用智能手机中的麦克风进行一些声音分析。因此我正在录制声音并对其进行FFT。之后我打印我的价值观。

我使用低通滤波器来切断200hz以上的所有内容。

  for (int i = 0; i < blockSize; i++){
     //  lowpass filter before analyzing, possibility to cut frequencies above
      int cutFreqFilterLowPass = 200 ; // lowpass frequency
      int    cutFreqBandPass=600;
     for (int ii = 0; ii < audioDataDoubles.length; ii += 2) {


     //  if (ii < (((cutFreqBandPass - 100) * (audioDataDoubles.length/2)) / SAMPLING_RATE)*2 ||     
  ii > (((cutFreqBandPass + 100) * (audioDataDoubles.length/2)) / SAMPLING_RATE)*2){

         if (ii > ((cutFreqFilterLowPass * (audioDataDoubles.length/2)) / SAMPLING_RATE)*2){

            audioDataDoubles[ii] = audioDataDoubles[ii + 1] = 0.0;}
 //        audioDataDoubles_copy[ii]=audioDataDoubles[ii];
 //        System.out.println("gecutteter Frequenzbereich        "+audioDataDoubles[ii]);


  }


    } 

但现在,当我吹口哨时,我会在第一个箱子里得到价值......为什么会这样?

  for (int i = 0; i < blockSize; i++) {
        // real is stored in first part of array
        re[i] = audioDataDoubles[i * 2];
        // imaginary is stored in the sequential part
        im[i] = audioDataDoubles[(i * 2) + 1];
        // magnitude is calculated by the square root of (imaginary^2 + real^2)
        magnitude[i] = Math.sqrt((re[i] * re[i]) + (im[i] * im[i]));
    }

我很想知道1-2的价值观。前两个箱中的东西大约在40-80和80-120赫兹之间。

我曾经把第一个垃圾箱归零了?这有用吗?

这是正常的还是我的FFT无法正常工作?

似乎没有理由为什么我在那里得到价值......

2 个答案:

答案 0 :(得分:1)

两件事:

  1. 如果是低质量的麦克风或音频接口,或者存在高干扰(例如地面嗡嗡声[虽然可能不适用于移动设备],低质量PCB,信号中实际上可能存在低频噪声设计,附近的干扰源)。然而,你所看到的非常准确地表达了你的信号:

  2. FFT有时会包含与源信号样本端点差异相关的其他频率成分。 FFT本质上假设您的输入块是一个循环,如果它没有干净地循环,您可能希望看到其他组件。例如,如果在某个纯正弦波信号的中间采用任意块,相位偏移可能需要在FFT中存在其他频率分量,以便精确地表示异相信号。

  3. 为了对抗#2,通常的方法是使用window functions,它用于修改输入信号以减少突然的边界效应。在块的边缘。在最基本的情况下,窗口函数可以是块开始时的简单线性淡入淡出,并且在块的结尾处淡出(但这是一个非常粗略的函数)。您选择的窗口功能将影响FFT的频率响应(通常,频率分析应用程序将为用户提供窗口函数选择,以便可以在运行中选择最适合给定情况的窗口函数)。查看this page以获得更好的概述并撰写。

    该页面中一个很好的相关模糊和图形:

      

    记录终点的突然不连续性产生原始信号中不存在的频率分量,这在FFT中引入了频谱泄漏。通过研究采样信号是正弦波的情况可以理解这一点:

         

    enter image description here


    顺便说一下,基于FFT的滤波器实现起来可能很棘手,因为在窗口化时会丢失一些信息,并且在去除FFT频率分量后,必须进行块的重叠和交叉衰落以消除块之间的可听边界(可以改变信号的相位和DC偏移。延迟也可能是一个问题,具体取决于所需的FFT分辨率。

    如果您要做的只是将固定过滤器应用于音频,您可能需要查看FIR filters。它们高效且易于实施。有许多简单的FIR滤波器设计工具可供选择,其中许多都是免费的。

答案 1 :(得分:0)

录制现场音频时,通常会有环境噪声基底(室内噪音和/或热噪声层)。这种噪声通常是宽频谱的,因此可以出现在所有FFT频段中。您可以在安静时间记录噪声级别,计算此噪声的统计数据,并且只有在FFT结果箱中的某些内容高于某个统计阈值(3 sigma或某些此类值)时才会认为它是有效的。

任何冲动,无论是哨子开始时的咔哒声还是低音鼓都是广谱的,因此也可以出现在所有的箱子里。

窗口瞬态也可以通过将实时音频馈送到任何有限长度FFT所涉及的矩形窗口产生,并且这也可以在FFT宽度中不完全周期性的任何频率内容的所有频段中产生一些噪声。钟形窗口(von Hann,et.al。)将有助于减少这种伪影。 FFT输入中的调制DC偏移也可以在FFT结果中产生低频噪声。计算和减去任何DC偏移也有助于减少这种伪影。