【发布时间】: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 是的,我稍后发布了哈哈。