当前位置: 首页 > 面试题库 >

Android音频FFT使用音频记录检索特定频率幅度

蒲昊苍
2023-03-14
问题内容

我目前正在尝试使用Android实现一些代码,以检测何时通过手机的麦克风播放了多个特定音频频率范围。我已经使用AudioRecord该类设置了该类:

int channel_config = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int format = AudioFormat.ENCODING_PCM_16BIT;
int sampleSize = 8000;
int bufferSize = AudioRecord.getMinBufferSize(sampleSize, channel_config, format);
AudioRecord audioInput = new AudioRecord(AudioSource.MIC, sampleSize, channel_config, format, bufferSize);

然后读取音频:

short[] audioBuffer = new short[bufferSize];
audioInput.startRecording();
audioInput.read(audioBuffer, 0, bufferSize);

执行FFT是我遇到的困难,因为我在这方面的经验很少。我一直在尝试使用此类:

Java和Complex类中的FFT一起使用

然后,我发送以下值:

Complex[] fftTempArray = new Complex[bufferSize];
for (int i=0; i<bufferSize; i++)
{
    fftTempArray[i] = new Complex(audio[i], 0);
}
Complex[] fftArray = fft(fftTempArray);

这很容易让我误解了此类的工作原理,但是返回的值到处都是跳跃的,即使在沉默中也不能代表一致的频率。有谁知道执行此任务的方法,或者我是否在使事情变得过于复杂以尝试仅获取少量频率范围而不是将其绘制为图形表示形式?


问题答案:

首先,您需要确保将获得的结果正确转换为浮点数/双精度数。我不确定short []版本的工作方式,但是byte []版本仅返回原始字节版本。然后需要将此字节数组正确转换为浮点数。转换代码应如下所示:

    double[] micBufferData = new double[<insert-proper-size>];
    final int bytesPerSample = 2; // As it is 16bit PCM
    final double amplification = 100.0; // choose a number as you like
    for (int index = 0, floatIndex = 0; index < bytesRecorded - bytesPerSample + 1; index += bytesPerSample, floatIndex++) {
        double sample = 0;
        for (int b = 0; b < bytesPerSample; b++) {
            int v = bufferData[index + b];
            if (b < bytesPerSample - 1 || bytesPerSample == 1) {
                v &= 0xFF;
            }
            sample += v << (b * 8);
        }
        double sample32 = amplification * (sample / 32768.0);
        micBufferData[floatIndex] = sample32;
    }

然后,使用micBufferData []创建输入复杂html" target="_blank">数组。

获得结果后,请在结果中使用复数的大小。除具有实际值的频率外,大多数量值应接近零。

您需要采样频率才能将数组索引转换为这样的幅度到频率:

private double ComputeFrequency(int arrayIndex) {
    return ((1.0 * sampleRate) / (1.0 * fftOutWindowSize)) * arrayIndex;
}


 类似资料:
  • 问题内容: 我一直在尝试通过以下代码调整音频片段的音调: http://developer.android.com/guide/topics/media/audio- capture.html 我的猜测是应该使用进行此调整。 http://developer.android.com/reference/android/media/MediaRecorder.html 但是,我不确定调用哪种方法来改

  • 问题内容: 我正在设计一个简单的调谐器,所以我的目标是显示音符名称(A,B,F#)以及理论声音和实际输入之间的 距离( 以分为单位)。 我是音频和信号处理的新手,所以我做了一些研究,发现 了一个 叫做快速傅立叶变换 的东西 ,它可以分析字节并给我频率。另外,我发现了一些Java库,例如通用数学和JTransforms,所以我不会自己编写硬代码。 我相信就这样,因为每个范围的频率都可以以相同的气质直

  • 问题内容: 我正在编写代码来分析语音所唱的单个音频。我需要一种方法来分析音符的频率。当前,我正在使用PyAudio录制音频文件,该文件存储为,然后立即播放。 问题出在while循环上。由于某种原因,该条件永远不会成立。我打印了两个值(len(data)和(chunk * swidth)),它们分别是8192和4096。然后,我尝试在while循环中使用2 * chunk * swidth,这引发了

  • 音频概述 没有音频的游戏是不完整的,例如背景音乐或音响效果。Unity 的音频系统灵活而强大。它可以导入大多数标准音频文件格式,并且为播放 3D 空间中的声音提供了复杂的功能,以及可选的音响效果,例如回音和过滤。Unity 还可以记录来自用户机器上任意可用麦克风的音频,以便在游戏过程中使用,或者用于存储和传输。 基础理论 在现实生活中,声音由对象发出,并被听众听到。声音被感知的方式取决于许多因素。

  • 问题内容: 之前,我问过有关使用FFT和Complex class获取频率wav音频的 问题, 在那里,我需要从AudioRecord输入->从麦克风计算FFT值,以某种方式设法获得FFT值… 现在,我需要从之前保存的* .wav音频文件中计算FFT值,然后将音频保存到项目中“ res”文件夹中的“ raw”文件夹中 我仍然使用相同的FFT类:http : //www.cs.princeton.e

  • 我在android上使用APPRTCdemo应用程序。我试着让它播放来自另一个同龄人的声音,音量与Android设置中设置的音量一样大。因此,如果用户将设备静音,则不会听到音频。我几乎尝试了每一个Android API调用,但似乎对音量没有任何影响。以下是我尝试过的东西:AudioManager AudioManager=(AudioManager)_context.getSystemServic