繁体   English   中英

识别Android中录制的声音中的主导频率

Identifying dominant frequency in recorded sound in Android

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试将位于https://github.com/rraval/pied-piper/blob/master/decode.py的Python程序转换为Android Java文件。

第一步是确定主导频率。 我已经编写了以下Java程序来做到这一点

private class RecordAudio
        extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... paramVarArgs) {
        int audioSource = AudioSource.MIC;
        int sampleRateInHz = 44100;
        int channelConfig = AudioFormat.CHANNEL_IN_MONO;
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
        int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
        byte Data[] = new byte[bufferSizeInBytes];

        AudioRecord audioRecorder = new AudioRecord(audioSource,
                sampleRateInHz,
                channelConfig,
                audioFormat,
                bufferSizeInBytes);
        audioRecorder.startRecording();

        boolean isRecording = true;
        while (isRecording) {
            audioRecorder.read(Data, 0, Data.length);
            fftPrint(Data, bufferSizeInBytes);
        }
        return null;
    }

    boolean fftPrint(byte[] waveArray, int bufferSizeInBytes) {
        double HANDSHAKE_START_HZ = 8192;
        double HANDSHAKE_END_HZ = 8192 + 512;
        int len = waveArray.length;
        double[] waveTransformReal = new double[len];
        double[] waveTransformImg = new double[len];

        for (int i = 0; i < len; i++) {
            waveTransformReal[i] = waveArray[i]; //copy of original
            waveTransformImg[i] = waveArray[i]; //FFT transformed below
        }

        RealDoubleFFT p = new RealDoubleFFT(bufferSizeInBytes);
        p.ft(waveTransformImg);

        //Calculating abs
        double[] abs = new double[len];
        for (int i = 0; i < len; i++) {
            abs[i] = (Math.sqrt(waveTransformReal[i] * waveTransformReal[i] + waveTransformImg[i] * waveTransformImg[i]));
        }

        //calculating maxIndex
        int maxIndex = 0;
        for (int i = 0; i < len; i++) {
            if (abs[i] > abs[maxIndex])
                maxIndex = i;
        }

        double dominantFrequency = (maxIndex * 44100) / len;
        if (dominantFrequency > 0) Log.d("Freq: ", String.format("%f", dominantFrequency));

        if (match(dominantFrequency, HANDSHAKE_START_HZ)) {
            Log.i("Handshake start:", "FOUND START");
        }
        if (match(dominantFrequency, HANDSHAKE_END_HZ)) {
            Log.i("Handshake end:", "FOUND END");
            return true;
        }
        return false;
    }

    boolean match(double freq1, double freq2) {
        return (Math.abs(freq1 - freq2) < 20);
    }

注意:RealDoubleFFT来自ca.uol.aig.fftpack

不知道我是否做对了。 我正在Logcat中打印出频率,但是他们找不到正在播放的音频中存在的HANDSHAKE_START_HZ。 我究竟做错了什么?

1 个回复

请注意,FFT幅度峰值的频率分辨率取决于FFT的长度(以及窗口等)。 该长度未在代码中指定或受限制,因此您甚至不知道任何FFT结果箱是否有可能在目标频率的20 Hz之内。

2 录制声音识别android

我开发了一个应用程序,用户可以在其中录制声音,也许是拍手声或其他声音。 由于用户删除了该命令,因此android系统应将其保存。 利用该录音声音,用户可以选择设备可能显示意图的任何命令或其他命令。 现在我的问题是:当麦克风在该设备上时,当听到录音声音时,是否有可能启动意图? 我想也许可以 ...

3 在Android中录制声音

我想知道如何在特定时间内录制声音,而不将其保存到文件中-例如保存在字节流中。 另外,如果可能,使其看起来像AMR文件。 我尝试搜索google,并且自己写了一些代码,但没有成功。 如果您可以将我链接到说明如何进行链接的页面,或举一个例子,那么对您来说非常好:) 谢谢。 ...

4 如何在Android中同时录制声音和读取声音

我是android新手。 我想开发一个应用程序,在其中可以记录声音并同时读取声音(如viber),而无需节省外部存储空间。 我已经在执行线程池上的执行程序的帮助下,将录音和读取声音都放在了异步任务中。 但是我仍然没有得到任何结果。 通过存储在外部设备中,我已经完成,并且我通过创建用于录制 ...

7 如何计算android中的声音频率?

我想开发应用来计算Android中的声音频率。 Android设备将从麦克风(即外侧声音)获取声音,我在应用程序中有一个彩色背景屏幕。 在声音频率变化我必须改变屏幕的背景颜色。 所以我的问题是“我怎样才能获得声音频率”? 有没有可用的Android API? 请帮我解决这个 ...

8 在Android上保存录制的声音

我用意图录制声音。 但是我不知道如何在SD卡中保存此声音。 我创建一个文件夹“ file.mkdirs();”。 如何捕获记录并保存在新文件夹中(并更改名称)? 如果可能需要保存记录,请在记录后立即按“保存”按钮。 我认为需要一个“记录”的变量,如果他为0,则不记录,如果为1, ...

9 录制的声音非常低,Android上录制了很多噪音

我正在尝试使用AudioRecord类记录语音,并使用AudioTrack类将读取的字节写入扬声器。 我能够听到来自扬声器的声音,但是声音非常低,录制的声音会伴随很多噪音。 解决此问题的任何解决方案都可以减少噪音并降低实际声音。 我为此使用以下代码: ...

10 如何在Android(java)中录制音频并定位特定频率

我知道有很多问题,但是没有一个给出明确的答案。 以下是我用来尝试使其工作的代码。 这就是我的全部代码,并且大多数情况下都有效。 问题是单击按钮后textview显示0。 (您可以看到函数getpitch()响应了对按钮的单击。)此外,calculate()函数来自另一个类似的问题, ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM