如何使用 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音视频之AudioTrack播放音频

使用 AudioTrack 提高音符合成的性能

Android音视频使用opensles和audiotrack进行播放pcm

Android音视频使用opensles和audiotrack进行播放pcm

如何播放来自服务器的流式 PCM 数据,如 Android AudioTrack 类?

调节 Android AudioTrack 播放速度