在Android的TarsosDSP库中使用FFT

Has*_*shk 3 android fft tarsosdsp

我刚刚开始将TarsosDSP用于Android,但我不知道如何使用FFT。谁能提供样品给我?我只是想读取一个文件并获取其FFT输出。

And*_*nko 5

试试这个代码:

    new AndroidFFMPEGLocator(this);
    new Thread(new Runnable() {
        @Override
        public void run() {
            File externalStorage = Environment.getExternalStorageDirectory();
            File sourceFile = new File(externalStorage.getAbsolutePath() , "/440.mp3");

            final int bufferSize = 4096;
            final int fftSize = bufferSize / 2;
            final int sampleRate = 44100;

            AudioDispatcher audioDispatcher;
            audioDispatcher = AudioDispatcherFactory.fromPipe(sourceFile.getAbsolutePath(), sampleRate, bufferSize, 0);
            audioDispatcher.addAudioProcessor(new AudioProcessor() {

                FFT fft = new FFT(bufferSize);
                final float[] amplitudes = new float[fftSize];

                @Override
                public boolean process(AudioEvent audioEvent) {
                    float[] audioBuffer = audioEvent.getFloatBuffer();
                    fft.forwardTransform(audioBuffer);
                    fft.modulus(audioBuffer, amplitudes);

                    for (int i = 0; i < amplitudes.length; i++) {
                        Log.d(TAG, String.format("Amplitude at %3d Hz: %8.3f", (int) fft.binToHz(i, sampleRate) , amplitudes[i]));
                    }

                    return true;
                }

                @Override
                public void processingFinished() {

                }
            });
            audioDispatcher.run();
        }
    }).start();
Run Code Online (Sandbox Code Playgroud)

它基于TarsosDSP手册(第12页),并为bufferSize外部存储(SD卡)上的440.mp3文件(测试440Hz音频)中的每个文件计算并以对数FFT显示。您应该从此处将TarsosDSP-Android-2.3.jar(或更新版本)libs添加到项目的文件夹中(并将其添加为库),并与设备的ffmpeg库(armeabi-v7a_ffmpeg,armeabi-v7a-neon_ffmpeg或x86_ffmpeg)相对应这里assets您项目的文件夹。

而且不要忘记添加

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml(和也给运行时权限为targetSdkVersion高于21)

PS。如果bufferSize等于源文件中的样本数(或更大),则可以对整个文件进行FFT 。