2013-07-24 3 views
2

AudioTrack (안드로이드)으로 사각형 파를 생성하고 재생하려고합니다. 나는 많은 튜토리얼을 읽었지만 여전히 혼란 스럽다. 코드에서AudioTrack을 사용하여 20Hz 구형파를 생성하고 재생하는 방법은 무엇입니까?

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)로 인코딩되며 "유효"주파수는 샘플링 속도에 따라 달라집니다.

+0

감사합니다! 그 기사는 안드로이드 장치와 mcu간에 데이터가 어떻게 전송되는지 더 잘 이해할 수 있도록 도와 주지만, 나는 아직도 그 일을 할 생각이 없다. 상대 코드가 있습니까? 감사! – randino

+0

불행하게도 나는 어떤 코드도 제공 할 수는 없지만 [무엇을 시도했는지?] (http://mattgemmell.com/2008/12/08/what-have-you- 시도 /). 해당 기사를 읽은 후 시도한 코드를 포함하도록 질문을 편집하십시오 :). 그러나 출발점에 닥칠 경우 힌트가 있습니다. [Modulation section] (https://en.wikipedia.org/wiki/Pulse-code_modulation#Modulation)의 다이어그램을 참조하십시오. 각 "단계"는 배열에서 하나의 '짧은'값/색인입니다. –

+0

도움을 주셔서 감사 드리며이 기사의 [Android에서 임의의 음성 재생] (http://stackoverflow.com/questions/2413426/playing-an-arbitrary-tone-with-android)에 따라 해결했습니다 :) – randino

0

이 방법은 광장, 죄와 톱니파가

  // 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