Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分析频谱后测量声强?_Java_Android_Fft - Fatal编程技术网

Java 分析频谱后测量声强?

Java 分析频谱后测量声强?,java,android,fft,Java,Android,Fft,我正在智能手机上写一个程序(安卓系统上) 它是关于: 用fft算法分析声音频谱 根据我从上面的分析中得到的频谱,测量声音的强度有f=fo(例如fo=18khz) 使用此强度计算智能手机到声源的距离 在fft之后,我得到了两个数组(实数组和图像数组)。我计算了f=18000hz时的声强(假设18000hz时的声源不变,以便更容易测量声强)。详情如下: bin FFT[i]处的频率为: if i <= [N/2] then i * SamplingFrequency / N i

我正在智能手机上写一个程序(安卓系统上) 它是关于:

  • 用fft算法分析声音频谱
  • 根据我从上面的分析中得到的频谱,测量声音的强度有f=fo(例如fo=18khz)
  • 使用此强度计算智能手机到声源的距离
  • 在fft之后,我得到了两个数组(实数组和图像数组)。我计算了f=18000hz时的声强(假设18000hz时的声源不变,以便更容易测量声强)。详情如下:

    bin FFT[i]处的频率为:

        if i <= [N/2] then i * SamplingFrequency / N
        if i >= [N/2] then (N-i) * SamplingFrequency / N
    
    然而,事实上,强度变化很大,因此很难测量距离。我不知道该怎么解释

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

    这是我的密码:

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

    导入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;
    
    //输入_real1是来自麦克风(智能手机)的值

    //输出是声音强度的值

    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);
    
    publicstaticvoidfft(float[]输入\u real1,float[]输出)
    {
    
    对于(int i=0;i在18 kHz时,话筒类型、位置和方向以及附近声学环境的声音反射将强烈影响声级。

    您似乎不清楚18 kHz时应查看哪个音箱。如果FFT大小为512,采样率为44.1 kHz,则音箱指数将为512*18000/44100=209。请参阅为了更全面的解释,你不可能用这种方法来测量距离。根据理论:bin FFT的频率[k]是:如果k=[N/2],那么(N-k)*采样频率/N,那么FFT[209]=FFT[304]因为我在智能手机上测试时,它们是对称的,209位的bin小于零,所以我使用304位的bin,你对此有什么想法吗?我已经测试并意识到环境噪声的频率经常小于18khz。在这个项目中,一些问题,比如位置,思考和方向,我没有注意。位置和方向,我在测量的时候都没有改变。你对此有什么想法吗?
    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]];
        }
    }
    
    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);
        }