我目前正在为手机编写一个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;
}

09-27 23:01