如何使用 AudioTrack 生成和播放 20Hz 方波?
Posted
技术标签:
【中文标题】如何使用 AudioTrack 生成和播放 20Hz 方波?【英文标题】:How to generate and play a 20Hz square wave with AudioTrack? 【发布时间】:2013-07-24 08:09:53 【问题描述】:我正在尝试使用 AudioTrack(android) 生成和播放方波。我已经阅读了很多教程,但仍然有些困惑。
int sampleRate = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
AudioTrack audioTrack;
int buffer = AudioTrack.getMinBufferSize(sampleRate, channelConfig,
audioFormat);
audioTrack.write(short[] audioData, int offsetInShorts, int sizeInShorts);
在代码中,让我困惑的是如何编写短数组“audioData”...
有人可以帮助我吗?提前致谢!
【问题讨论】:
【参考方案1】:您应该使用Pulse-code modulation。链接的文章有一个编码正弦波的例子,方波更简单。请记住,最大幅度由 short
(32767) 的最大值编码,“有效”频率取决于您的采样率。
【讨论】:
谢谢!那篇文章帮助我进一步了解了数据是如何在android设备和mcu之间传输的,但我仍然不知道与它有关。你有一些相关的代码吗?谢谢! 很遗憾,我无法为您提供任何代码,但如果您显示 what have you tried,我将非常乐意为您提供帮助。只需编辑您的问题以包含您在阅读该文章后尝试的代码:)。但是,如果您一开始就卡住了,这里有一个提示:请参阅Modulation section 中的图表?每个“步骤”都是数组中的一个short
值/索引。
谢谢你的帮助,我已经按照这篇文章解决了Playing an arbitrary tone with Android:)
@randino:没问题。如果您要么接受现有答案,要么创建一个新答案并接受它,这是一件好事。这样,问题就不会悬而未决和“悬而未决”。【参考方案2】:
此方法生成方波、正弦波和锯齿波
// Process audio
protected void processAudio()
short buffer[];
int rate =
AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);
int minSize =
AudioTrack.getMinBufferSize(rate, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
// Find a suitable buffer size
int sizes[] = 1024, 2048, 4096, 8192, 16384, 32768;
int size = 0;
for (int s : sizes)
if (s > minSize)
size = s;
break;
final double K = 2.0 * Math.PI / rate;
// Create the audio track
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, rate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
size, AudioTrack.MODE_STREAM);
// Check audiotrack
if (audioTrack == null)
return;
// Check state
int state = audioTrack.getState();
if (state != AudioTrack.STATE_INITIALIZED)
audioTrack.release();
return;
audioTrack.play();
// Create the buffer
buffer = new short[size];
// Initialise the generator variables
double f = frequency;
double l = 0.0;
double q = 0.0;
while (thread != null)
// Fill the current buffer
for (int i = 0; i < buffer.length; i++)
f += (frequency - f) / 4096.0;
l += ((mute ? 0.0 : level) * 16384.0 - l) / 4096.0;
q += (q < Math.PI) ? f * K : (f * K) - (2.0 * Math.PI);
switch (waveform)
case SINE:
buffer[i] = (short) Math.round(Math.sin(q) * l);
break;
case SQUARE:
buffer[i] = (short) ((q > 0.0) ? l : -l);
break;
case SAWTOOTH:
buffer[i] = (short) Math.round((q / Math.PI) * l);
break;
audioTrack.write(buffer, 0, buffer.length);
audioTrack.stop();
audioTrack.release();
归功于billthefarmer。
完整的源代码:
https://github.com/billthefarmer/sig-gen
【讨论】:
以上是关于如何使用 AudioTrack 生成和播放 20Hz 方波?的主要内容,如果未能解决你的问题,请参考以下文章
Android音视频使用opensles和audiotrack进行播放pcm
Android音视频使用opensles和audiotrack进行播放pcm