2013-05-13 61 views
0

我写在智能手机上(在Android) 的程序它是关于:通过FFT算法 分析谱图后测量声强?

  • 测量声音的强度的声音的

    1. 分析光谱有f = FO(例如FO = 18KHZ )从我从上面的分析中得到的结果。
    2. 计算从智能手机的声音的源的距离与该强度

    FFT之后,我有两个阵列(真实的和图像)。我计算f = 18000hz时的声音强度(假设18000hz的声音来源不变,因此可以更容易地测量声音强度)。如下:

    频率仓FFT [i]为:

    if i <= [N/2] then i * SamplingFrequency/N 
        if i >= [N/2] then (N-i) * SamplingFrequency/N 
    

    因此在频率= 18000hz然后我选择I = 304

    sound intensity = real_array[304] * real_array[304] + image_array[304] * image_array[304] 
    

    然而,强度,事实上,变化很多很难测量距离。而且,我不知道如何解释这一点。

    此外,我想问你一个问题,我上面测量的强度使用什么单位来计算。

    这里是我的代码:

    a。 fft算法(我用fft 512点)

    import define.define512;

    公共类FFT {

    private static float[] W_real; 
    private static float[] W_img; 
    private static float[] input_real= new float[512]; 
    private static float[] input_img; 
    

    // input_real1是从MIC值(智能电话)

    //输出是声音强度值

    public static void FFT(float[] input_real1, float[] output) 
    { 
        for(int i =0;i<512;i++) input_real[i] = input_real1[i]; 
        input_img = new float[512]; 
        W_real = define512.W_IMAG; 
        W_img = define512.W_IMAG; 
        int[] W_order = define512.ORDER; 
        float[] output_real = new float[512], output_img = new float[512]; 
    
        fftradix2(0,511); 
    
    与逆

    //订货交易位

    reorder(input_real, input_img, output_real, output_img, W_order, 512); 
    
        for(int i =0;i<512;i++) 
        { 
         output[i] = sqrt((output_real[i]*output_real[i] + output_img[i]*output_img[i])); 
        } 
    
    
    } 
    private static void reorder(float[] in_real,float[] in_imag, float[] out_real,float[] out_imag,int[] order,int N){   
        for(int i=0;i<N;i++){ 
         out_real[i]=in_real[order[i]]; 
         out_imag[i]=in_imag[order[i]]; 
        } 
    } 
    

    种// FFT算法

    private static void fftradix2(int dau,int cuoi) 
    { 
        int check = cuoi - dau; 
        if (check == 1) 
        { 
    
    
         input_real[dau] = input_real[dau] + input_real[cuoi]; 
         input_img[dau] = input_img[dau] + input_img[cuoi]; 
    
         input_real[cuoi] = input_real[dau] -2* input_real[cuoi]; 
         input_img[cuoi] = input_img[dau] -2* input_img[cuoi]; 
    
    
        } 
        else 
        { 
         int index = 512/(cuoi - dau + 1);   
         int tg = (cuoi - dau)/2; 
         fftradix2(dau,(dau+tg)); 
         fftradix2((cuoi-tg),cuoi); 
         for(int i = dau;i<=(dau+tg);i++) 
         { 
    
          input_real[i] = input_real[i] + input_real[i+tg+1]*W_real[(i-dau)*index] - input_img[i+tg+1]*W_img[(i-dau)*index]; 
          input_img[i] = input_img[i] + input_real[i+tg+1]*W_img[(i-dau)*index] + input_img[i+tg+1]*W_real[(i%(tg+1))*index]; 
    
          input_real[i+tg+1] = input_real[i] -2* input_real[i+tg+1]*W_real[(i-dau)*index] +2* input_img[i+tg+1]*W_img[(i-dau)*index]; 
          input_img[i+tg+1] = input_img[i] -2* input_real[i+tg+1]*W_img[(i-dau)*index] -2* input_img[i+tg+1]*W_real[(i-dau)*index]; 
    
         } 
        } 
    } 
        } 
    

    湾在智能手机

    NumOverlapSample = 800; 
        NumNewSample = 224; 
        private static int Fs = 44100; 
        private byte recorderAudiobuffer[] = new byte [1024]; 
        AudioRecord recorder = new AudioRecord(AudioSource.MIC, Fs, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, 4096); 
        //start recorder 
        recorder.startRecording(); 
    
        timer.schedule(new task_update(), 1000, 10); 
        class task_update extends TimerTask 
    { 
        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
    
         for(int i=0;i<NumOverlapSample;i++) 
          recorderAudiobuffer[i] = recorderAudiobuffer[i+NumNewSample]; 
         int bufferRead = recorder.read(recorderAudiobuffer,NumOverlapSample,NumNewSample); 
         convert.decode(recorderAudiobuffer, N, input); 
         fft.FFT(input, output); 
        } 
    

    代码中使用的话筒和我soucre https://www.box.com/s/zuppzkicymfsuv4kb65p

    感谢所有

  • +0

    您似乎对18 kHz时要看哪个bin感到困惑。如果FFT大小为512,采样率为44.1 kHz,则bin索引将为512 * 18000/44100 = 209。请参见[本问题](http:// stackoverflow。com/questions/4364823/how-to-get-frequency-from-fft-result/4371627#4371627)以获得更全面的解释。 – 2013-05-13 16:44:06

    +1

    你不能这样测量距离。根据理论: – 2013-05-13 17:40:54

    +0

    如果k> = [N/2],那么(Nk)* SamplingFrequency/N如果k = [N/2]则k * SamplingFrequency/N 然后FFT [209] = FFT [304],因为当我在智能手机上测试时,它们互相对称,因此在209位置的bin小于零。因此,我在304的位置使用了bin 你有什么想法吗? – 2013-05-16 16:46:58

    回答

    0

    在18 kHz时,麦克风的类型,位置和方向,以及反射声从附近的声学环境意愿强烈影响声音水平。

    +0

    我已经测试并认识到环境噪声的频率往往小于18khz很多。 在这个项目中,一些问题,如位置,反射和方向,我没有注意。在测量的时候,我的位置和方向都没有改变。 你有什么想法吗? – 2013-05-16 16:58:32