gpt4 book ai didi

java - 如何在android上创建一个50hz的方波并播放它

转载 作者:行者123 更新时间:2023-11-29 05:18:28 25 4
gpt4 key购买 nike

我目前正在为手机编写一个 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,即 ~-10dB 的 FSD。

你想要一个方波。下面的代码实现了它(不是特别有效)。

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;
}

关于java - 如何在android上创建一个50hz的方波并播放它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25684821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com