【问题标题】:measuring sound intensity after analyzing spectrum?分析频谱后测量声音强度?
【发布时间】:2013-05-13 15:59:24
【问题描述】:

我正在智能手机上编写程序(在 Android 上) 它是关于:

  1. 通过 fft 算法分析声音频谱
  2. 测量声音的强度有 f = fo(例如 fo = 18khz),我从上面的分析中得到了结果。
  3. 以这种强度计算从智能手机到声源的距离

在 fft 之后,我得到了两个数组(真实和图像)。我计算 f=18000hz 的声强(假设 18000hz 的声源不变,这样更容易测量声强)。如下:

bin 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]

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

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

这是我的代码:

一个。 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;

//input_real1 是来自 mic(smartphone) 的值

//输出是声音强度的值

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 处理逆位

    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];

        }
    }
}
    }

b.代码在智能手机中使用麦克风

    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);
    }

还有我的苏克雷https://www.box.com/s/zuppzkicymfsuv4kb65p

谢谢大家

【问题讨论】:

  • 您似乎对查看 18 kHz 的哪个 bin 感到困惑。如果您的 FFT 大小为 512 且采样率为 44.1 kHz,则 bin 索引将为 512 * 18000 / 44100 = 209。请参阅 this question 以获得更完整的说明。
  • 你无法通过这种方式测量距离。
  • 根据理论:bin FFT[k] 处的频率为:如果 k = [N/2] 然后 (N-k) * SamplingFrequency / N 然后 FFT[209] = FFT[304] 因为当我在智能手机上测试时它们彼此对称,位于 209 位置的 bin 小于零。因此,我在 304 的位置使用了 bin,您对此有什么想法吗?

标签: java android fft


【解决方案1】:

在 18 kHz 时,麦克风类型、位置和方向,以及来自附近声学环境的声音反射都会强烈影响声级。

【讨论】:

  • 我已经测试并意识到环境噪声的频率通常小于18khz。在这个项目中,位置、反射和方向等一些问题,我没有注意。位置和方向,我没有改变测量的时间。您对此有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2018-06-05
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多