【问题标题】:How to generate and play a 20Hz square wave with AudioTrack?如何使用 AudioTrack 生成和播放 20Hz 方波?
【发布时间】: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”...

有人可以帮助我吗?提前致谢!

【问题讨论】:

    标签: android wave audiotrack


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多