在声音文件android上执行dtmf-decoder FFT

Posted

技术标签:

【中文标题】在声音文件android上执行dtmf-decoder FFT【英文标题】:Performing dtmf-decoder FFT on sound file android 【发布时间】:2014-12-03 14:34:36 【问题描述】:

我正在使用this 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());
            

它适用于麦克风。但我想对声音文件(在原始文件夹中)进行这种转换。我尝试使用 InputStreamReader 读取声音文件内容,但如何使用此文件数据对文件应用转换?我尝试使用以下代码使用缓冲区:

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?

【问题讨论】:

声音文件的格式是什么?声音文件通常包含除声音信号以外的附加信息,例如标题。这会弄乱您的 fft。 您不能使用 inputStreamReader,因为该文件不是原始声音二进制文件。您需要在 FFT 之前对声音进行解码。 Calculate FFT from audio file 的可能重复项(想法是您必须先解码 wav 文件) 您确定要使用 FFT 执行 DTMF 解码吗?这可能不是最简单或最有效的方法。八个 Goertzel 过滤器可能是一个更好的主意。 @njzk2 是的,我稍后发布了哈哈。 【参考方案1】:

您似乎在转换单个字节,但 .wav/RIFF 文件的格式,在标题之后(通常为 44 字节),通常是 16 位或 2 字节 little-endian 样本。

【讨论】:

我应该遵循什么方法?

以上是关于在声音文件android上执行dtmf-decoder FFT的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上异步和同时(复音)播放声音?

当我单击listview按钮在Android上播放声音时[关闭]

适用于 Android 的 Adob​​e 原生扩展以播放声音

Cordova Local Notification 为 iOS 和 Android 播放本地声音

Android 上的声音字体

如何在 Android 网络浏览器上通过 agora 使用通话声音而不是媒体声音?