嘿所以我正在尝试从音频设备录制数据并绘制图表。它是从压电器录制的,输出功率在16khz到19khz之间。下面我将有相关的代码。我目前的问题是数据不能以足够快的速度计算或读取。我不是音响工程师,很多FFT工作都来自多个资源。
这是我正在谈论的图片。正如您所看到的,我从qrs复合体中的第一个R波获得1个数据点。起初我得到了一个。然后我改变了我的最小缓冲区大小* 500,这似乎给了我两个数据点。我希望在很短的时间内有几个能够获得准确的读数。
TLDR:我要改变的是,我每秒可以获得更多的频率读数。
和我的代码...... 缓冲区正被添加到已声明的列表中。我正在使用的FFT方法需要一个简短的[]
public int audioSource = MediaRecorder.AudioSource.MIC;
public int channelConfig = AudioFormat.CHANNEL_IN_MONO;
public int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
public AudioRecord audioRecord = null;
public int blockSize = 256; // deal with this many samples at a time
public int sampleRate = 44100; // Sample rate in Hz
public void audioRecordLoop() throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
Log.e(TAG, "start audioRecordLoop");
int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioEncoding);
audioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioEncoding, bufferSize * 500);
if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
Log.e(TAG, "AudioRecord init failed");
return;
}
final short[] buffer = new short[blockSize];
audioRecord.startRecording();
int len = 0;
while (isRecording == true) {
len = audioRecord.read(buffer, 0, blockSize);
shortList.add(buffer);
if (len < 0) {
Log.e(TAG, "read error " + len);
return;
}
}
if (audioRecord != null)
audioRecord.release();
}
}).start();
}
计算
public void calcFrequency() {
new Thread(new Runnable() {
@Override
public void run() {
FrequencyScanner frequencyScanner = new FrequencyScanner();
while (isRecording) {
if (shortList != null && shortList.size() > 0) {
short[] shorts = shortList.get(0);
final double frequencys = frequencyScanner.extractFrequency(shorts, sampleRate);
frequencyList.add(frequencys);
}
}
}
}).start();
}
然后绘制图表
public void graphFrequenecy() {
new Thread(new Runnable() {
@Override
public void run() {
while (isRecording) {
try {
if (frequencyList != null && frequencyList.size() > 0) {
final double frequency = frequencyList.get(0);
if (frequency > 13000) {
Log.d(TAG, "run: " + frequency);
runOnUiThread(new Runnable() {
@Override
public void run() {
series.appendData(new DataPoint(series.getHighestValueX() + 1, frequency), true, 3000);
}
});
}
frequencyList.remove(0);
}
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}