Я использую этот код https://stackoverflow.com/questions/23432398/audio-recorder-in-android-process-the-audio-bytes для захвата звука с микрофона, но я записываю данные в ByteArrayOutputStream. После того, как я закончу запись, я хочу демодулировать сигнал, полученный с помощью алгоритма Герцеля. Сигнал FSK состоит из 2 частот, 800 Гц для «1» и 400 Гц для «0», каждый бит модулируется с использованием 100 выборок. Я использую этот класс Goertzel: http://courses.cs.washington.edu/courses/cse477/projectwebs04sp/cse477m/code/public/Goertzel.java Я пытаюсь использовать размер ячейки 150.
Вот что я пытаюсь сделать: код после того, как закончу запись:
private void stopRecording()
{
if(recorder != null)
{
isRecording= false;
recorder.stop();
recorder.release();
recorder = null;
recordingThread = null;
int BlockSize = 150;
float HighToneFrequency = 800;
float LowToneFrequency = 400;
byte[] byteArrayData = ByteArrayAudioData.toByteArray();
/*final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
8000, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, byteArrayData.length,
AudioTrack.MODE_STATIC);
audioTrack.write(byteArrayData, 0, byteArrayData.length);
audioTrack.play();*/
double[] daOriginalSine = convertSample2Sine(byteArrayData);
int i = 0;
while(i < daOriginalSine.length)
{
double t1 = testSpecificFrequency(i, HighToneFrequency,BlockSize, daOriginalSine);
double t2 = testSpecificFrequency(i, LowToneFrequency,BlockSize, daOriginalSine);
i+=BlockSize;
}
}
}
И функция testSpecificFrequency:
private double testSpecificFrequency(int startIndex, float ToneFreq, int BlockSize, double[] sample)
{
Goertzel g = new Goertzel(RECORDER_SAMPLERATE, ToneFreq, BlockSize, false);
g.initGoertzel();
for(int j=startIndex ; j<startIndex+BlockSize ; j++)
{
g.processSample(sample[j]);
}
double res= Math.sqrt(g.getMagnitudeSquared());
return res;
}
Я просто пытался посмотреть, какие будут результаты, отправив 800 Гц в конструктор, а затем отправив 400 Гц, не знаю, как действовать дальше =\
Любые идеи?