在声音文件android上执行dtmf解码器FFT

在声音文件android上执行dtmf解码器FFT,android,fft,Android,Fft,我正在使用FFT库对设备麦克风捕获的声音执行FFT。我正在使用以下代码: int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,

我正在使用FFT库对设备麦克风捕获的声音执行FFT。我正在使用以下代码:

int bufferSize = AudioRecord.getMinBufferSize(frequency,
                    channelConfiguration, audioEncoding);
            AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
                    frequency, channelConfiguration, audioEncoding, bufferSize);
            int bufferReadResult;

            try {
                audioRecord.startRecording();
            } catch (IllegalStateException e) {
                e.printStackTrace();
                Log.e("Recording failed", e.toString());
            }
            while (true) {
                bufferReadResult = audioRecord.read(buffer, 0, blockSize);
                if (isCancelled())
                    break;
                boolean bln = false;
                for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                    toTransform[i] = (double) buffer[i] / 32768.0;
                    if (buffer[i] != 0) {
                        bln = true;
                    }
                }
                if (bln) {
                    transformer.ft(toTransform);
                    doStuff(toTransform);
                } else {
                    try {
                        audioRecord = new AudioRecord(
                                MediaRecorder.AudioSource.DEFAULT, frequency,
                                channelConfiguration, audioEncoding, bufferSize);
                        audioRecord.startRecording();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                        Log.e("Recording failed", e.toString());
                    }
                }
                if (isCancelled())
                    break;
            }
            try {
                audioRecord.stop();
            } catch (IllegalStateException e) {
                e.printStackTrace();
                Log.e("Stop failed", e.toString());
            }
InputStream ins;
    ByteArrayOutputStream outputStream;
    int size = 0;
    byte[] buffer = new byte[1024];
 ins = getResources().openRawResource(R.raw.fire);
    outputStream = new ByteArrayOutputStream();
    transformer = new RealDoubleFFT(blockSize);
while ((size = ins.read(buffer, 0, 1024)) >= 0) {
                    outputStream.write(buffer, 0, size);
                    if (isCancelled())
                        break;
                    boolean bln = false;
                    for (int i = 0; i < buffer.length; i++) {
                        toTransform[i] = (double) buffer[i] / 32768.0;
                        if (buffer[i] != 0) {
                            bln = true;
                        }
                    }
                    if (bln) {
                        transformer.ft(toTransform);
                        doStuff(toTransform);
                    }
                }
                ins.close();
它适用于麦克风。但我想对原始文件夹中的声音文件进行此转换。我尝试使用InputStreamReader读取声音文件内容,但如何使用此文件数据对文件应用转换?我尝试使用以下代码使用缓冲区:

int bufferSize = AudioRecord.getMinBufferSize(frequency,
                    channelConfiguration, audioEncoding);
            AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
                    frequency, channelConfiguration, audioEncoding, bufferSize);
            int bufferReadResult;

            try {
                audioRecord.startRecording();
            } catch (IllegalStateException e) {
                e.printStackTrace();
                Log.e("Recording failed", e.toString());
            }
            while (true) {
                bufferReadResult = audioRecord.read(buffer, 0, blockSize);
                if (isCancelled())
                    break;
                boolean bln = false;
                for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                    toTransform[i] = (double) buffer[i] / 32768.0;
                    if (buffer[i] != 0) {
                        bln = true;
                    }
                }
                if (bln) {
                    transformer.ft(toTransform);
                    doStuff(toTransform);
                } else {
                    try {
                        audioRecord = new AudioRecord(
                                MediaRecorder.AudioSource.DEFAULT, frequency,
                                channelConfiguration, audioEncoding, bufferSize);
                        audioRecord.startRecording();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                        Log.e("Recording failed", e.toString());
                    }
                }
                if (isCancelled())
                    break;
            }
            try {
                audioRecord.stop();
            } catch (IllegalStateException e) {
                e.printStackTrace();
                Log.e("Stop failed", e.toString());
            }
InputStream ins;
    ByteArrayOutputStream outputStream;
    int size = 0;
    byte[] buffer = new byte[1024];
 ins = getResources().openRawResource(R.raw.fire);
    outputStream = new ByteArrayOutputStream();
    transformer = new RealDoubleFFT(blockSize);
while ((size = ins.read(buffer, 0, 1024)) >= 0) {
                    outputStream.write(buffer, 0, size);
                    if (isCancelled())
                        break;
                    boolean bln = false;
                    for (int i = 0; i < buffer.length; i++) {
                        toTransform[i] = (double) buffer[i] / 32768.0;
                        if (buffer[i] != 0) {
                            bln = true;
                        }
                    }
                    if (bln) {
                        transformer.ft(toTransform);
                        doStuff(toTransform);
                    }
                }
                ins.close();

但它没有返回正确的数据。也许从文件中接收到的数据不是库想要的。您知道如何在声音文件上应用FFT吗?

您似乎在转换单个字节,但是.wav/RIFF文件的格式,在头文件之后通常是44个字节,通常是16位或2字节的小尾端采样。

声音文件的格式是什么?声音文件通常包含除声音信号以外的附加信息,例如标头。这会弄乱fft。您不能使用inputStreamReader,因为该文件不是原始声音二进制文件。在对声音进行FFT解码之前,您需要对其进行解码。这种想法的可能重复之处在于,您必须首先对wav文件进行解码。您确定要使用FFT do进行DTMF解码吗?这可能不是最简单或最有效的方法。八个Goertzel过滤器可能是一个更好的主意。@njzk2 Yea我后来发布了lol。我应该遵循什么方法?