我目前正在为手机编写一个Android应用,以控制2个伺服电机。
因此,我需要在50hz处创建一个高振幅的方波。
我已经看过AudioManager和AudioTrack类的一些示例代码,但是我并没有真正了解如何在50hz处获得可听振幅的基本方波的线索。
这是到目前为止我得到的:
package com.example.rollerball;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.support.v7.app.ActionBarActivity;
public class ToneGenerator
{
Thread t;
int sr = 44100;
boolean isRunning = true;
public void startTone()
{
isRunning = true;
t = new Thread() {
public void run() {
// set process priority
setPriority(Thread.MAX_PRIORITY);
int buffsize = AudioTrack.getMinBufferSize(sr,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
// create an audiotrack object
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC, sr,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, buffsize,
AudioTrack.MODE_STREAM);
short samples[] = new short[buffsize];
int amp = 10000;
double twopi = 8. * Math.atan(1.);
double fr = 440.f;
double ph = 0.0;
// start audio
audioTrack.play();
while (isRunning) {
for (int i = 0; i < buffsize; i++) {
samples[i] = (short) (amp * Math.sin(ph));
ph += twopi * fr / sr;
}
audioTrack.write(samples, 0, buffsize);
}
audioTrack.stop();
audioTrack.release();
}
};
t.start();
}
public void stopTone(){
isRunning = false;
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
t = null;
}
}
也许有些人可以帮助我!
提前致谢!
最佳答案
就目前而言,您的代码会生成一个清晰的正弦波,其峰值幅度为±10000
。可以用16位PCM表示的最大采样值为±1^15-1 = ±32767
,它是FSD的〜-10dB。
您想要一个方波。下面的代码实现了它(不是特别有效)。
for (int i = 0; i < buffsize; i++) {
short s = (amp * Math.sin(ph));
if (s > 0.0) {
sample[i] = 32767;
};
if (s < 0.0) {
sample[i] = -32767;
}
ph += twopi * fr / sr;
}