fork download
  1. package com.kekland.fastfouriertest;
  2.  
  3. import android.Manifest;
  4. import android.content.pm.PackageManager;
  5. import android.media.AudioManager;
  6. import android.os.CountDownTimer;
  7. import android.os.Handler;
  8. import android.support.annotation.Nullable;
  9. import android.support.v4.app.ActivityCompat;
  10. import android.support.v4.content.ContextCompat;
  11. import android.support.v7.app.AppCompatActivity;
  12. import android.os.Bundle;
  13. import android.view.View;
  14. import android.widget.Button;
  15. import android.widget.ProgressBar;
  16. import android.widget.TextView;
  17. import android.widget.Toast;
  18.  
  19. import com.jjoe64.graphview.GraphView;
  20. import com.jjoe64.graphview.series.DataPoint;
  21. import com.jjoe64.graphview.series.LineGraphSeries;
  22.  
  23. import java.util.ArrayList;
  24. import java.util.Arrays;
  25. import java.util.List;
  26. import java.util.Timer;
  27. import java.util.TimerTask;
  28.  
  29. public class MainActivity extends AppCompatActivity {
  30.  
  31. final int PERMISSION_REQUEST_CALLBACK = 25;
  32.  
  33. Button toggleThreadButton;
  34. TextView peakText;
  35. ProgressBar volumeProgress;
  36. GraphView dataGraph;
  37.  
  38. AudioRecorderThread thread;
  39. int indexOfThreadRun = 0;
  40. int indexToUpdateGraph = 1;
  41.  
  42. FastFourierTransform fastFourierTransform = new FastFourierTransform(1024, 44100);
  43.  
  44. public void toggleThread() {
  45. if(thread == null) {
  46. if (ContextCompat.checkSelfPermission(this,
  47. Manifest.permission.RECORD_AUDIO)
  48. != PackageManager.PERMISSION_GRANTED) {
  49.  
  50. // Permission is not granted
  51. ActivityCompat.requestPermissions(this,
  52. new String[]{Manifest.permission.RECORD_AUDIO},
  53. PERMISSION_REQUEST_CALLBACK);
  54. }
  55. else {
  56. thread = new AudioRecorderThread(new AudioRecorderInterface() {
  57. @Override
  58. public void onDataReceive(final float[] buffer) {
  59. runOnUiThread(new Runnable() {
  60. @Override
  61. public void run() {
  62. //Make sure that everything runs in 30fps
  63. indexOfThreadRun++;
  64. if (indexOfThreadRun % indexToUpdateGraph == 0) {
  65. //Evaluate Fourier Transform
  66. fastFourierTransform.forward(buffer);
  67.  
  68. //Get the volume
  69. float maxAmplitude = Float.MIN_VALUE;
  70. for (float sample : buffer) {
  71. maxAmplitude = (sample > maxAmplitude) ? sample : maxAmplitude;
  72. }
  73. volumeProgress.setProgress(Math.round(100 * maxAmplitude));
  74.  
  75. float[] transformValues = new float[fastFourierTransform.specSize()];
  76. float transformMax = -1;
  77. float transformAvg = 0f;
  78. for (int i = 0; i < transformValues.length; i++) {
  79. float freq = (i / 1024f) * 44100f;
  80. float invVolume = (1f - (float)Math.sqrt((freq / 20000f)));
  81. transformValues[i] = fastFourierTransform.getBand(i) * invVolume;
  82. transformMax = (transformValues[i] > transformMax) ? transformValues[i] : transformMax;
  83. transformAvg += transformValues[i];
  84. }
  85. transformAvg /= transformValues.length;
  86.  
  87. //Apply low pass filter below avg value
  88. /*for(int i =0; i < transformValues.length; i++) {
  89.   if(transformValues[i] < transformAvg) {
  90.   transformValues[i] = 0;
  91.   }
  92.   }
  93.   */
  94. DataPoint[] dataPoints = new DataPoint[transformValues.length];
  95. for (int i = 0; i < transformValues.length; i++) {
  96. dataPoints[i] = new DataPoint((i / 1024f) * 44100f, transformValues[i]);
  97. }
  98. dataGraph.removeAllSeries();
  99. LineGraphSeries<DataPoint> series = new LineGraphSeries<>(dataPoints);
  100. dataGraph.addSeries(series);
  101.  
  102. //Find peaks
  103. List<Integer> peaks = new ArrayList<>();
  104. for (int i = 0; i < transformValues.length - 2; i++) {
  105. float slopeFirst = transformValues[i + 1] - transformValues[i];
  106. float slopeSecond = transformValues[i + 2] - transformValues[i + 1];
  107. float slopeAvg = (slopeFirst - slopeSecond) / 2f;
  108. if (slopeFirst * slopeSecond <= 0) { // changed sign?
  109. if (slopeAvg > transformMax / 6f && transformValues[i + 1] > transformAvg) {
  110. peaks.add(i + 1);
  111. }
  112. }
  113. }
  114.  
  115. //Fill String data about peaks
  116. final AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
  117. StringBuilder peakData = new StringBuilder("Peaking at: \n");
  118. boolean lowPass = false, midPass = false;
  119. for (Integer peak : peaks) {
  120. Integer freq = Math.round((peak / 1024f) * 44100f);
  121. if (freq <= 55 && freq >= 35) {
  122. lowPass = true;
  123. }
  124. if (freq <= 56 && freq >= 34) {
  125. midPass = true;
  126. }
  127. peakData.append(freq.toString());
  128. peakData.append("Hz\n");
  129. }
  130. peakText.setText(peakData.toString());
  131. if (lowPass && midPass) {
  132. audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
  133. -100, AudioManager.FLAG_SHOW_UI);
  134. final Handler handler = new Handler();
  135. handler.postDelayed(new Runnable() {
  136. @Override
  137. public void run() {
  138. // Do something after 5s = 5000ms
  139. audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
  140. 100, AudioManager.FLAG_SHOW_UI);
  141.  
  142. }
  143. }, 2000);
  144. }
  145. }
  146. }
  147. });
  148.  
  149. }
  150. }, 1, 44100);
  151. }
  152. toggleThreadButton.setText("Stop Thread");
  153. }
  154. else {
  155. thread.close();
  156. thread = null;
  157. toggleThreadButton.setText("Start Thread");
  158. }
  159. }
  160.  
  161. @Override
  162. protected void onCreate(Bundle savedInstanceState) {
  163. super.onCreate(savedInstanceState);
  164. setContentView(R.layout.activity_main);
  165.  
  166. toggleThreadButton = findViewById(R.id.mainActivityButtonStartThread);
  167. peakText = findViewById(R.id.mainActivityTextPeak);
  168. volumeProgress = findViewById(R.id.mainActivityProgressVolume);
  169. dataGraph = findViewById(R.id.mainActivityGraphData);
  170.  
  171. toggleThreadButton.setOnClickListener(new View.OnClickListener() {
  172. @Override
  173. public void onClick(View view) {
  174. toggleThread();
  175. }
  176. });
  177. }
  178. @Override
  179. public void onRequestPermissionsResult(int requestCode,
  180. String permissions[], int[] grantResults) {
  181. switch (requestCode) {
  182. case PERMISSION_REQUEST_CALLBACK: {
  183. if (grantResults.length > 0
  184. && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  185. toggleThread();
  186. }
  187. else {
  188. Toast.makeText(this, "Permission was not granted", Toast.LENGTH_SHORT).show();
  189. }
  190. }
  191. }
  192. }
  193.  
  194. @Override
  195. protected void onStop() {
  196. thread.close();
  197. super.onStop();
  198. }
  199. }
  200.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:29: error: class MainActivity is public, should be declared in a file named MainActivity.java
public class MainActivity extends AppCompatActivity {
       ^
Main.java:3: error: package android does not exist
import android.Manifest;
              ^
Main.java:4: error: package android.content.pm does not exist
import android.content.pm.PackageManager;
                         ^
Main.java:5: error: package android.media does not exist
import android.media.AudioManager;
                    ^
Main.java:6: error: package android.os does not exist
import android.os.CountDownTimer;
                 ^
Main.java:7: error: package android.os does not exist
import android.os.Handler;
                 ^
Main.java:8: error: package android.support.annotation does not exist
import android.support.annotation.Nullable;
                                 ^
Main.java:9: error: package android.support.v4.app does not exist
import android.support.v4.app.ActivityCompat;
                             ^
Main.java:10: error: package android.support.v4.content does not exist
import android.support.v4.content.ContextCompat;
                                 ^
Main.java:11: error: package android.support.v7.app does not exist
import android.support.v7.app.AppCompatActivity;
                             ^
Main.java:12: error: package android.os does not exist
import android.os.Bundle;
                 ^
Main.java:13: error: package android.view does not exist
import android.view.View;
                   ^
Main.java:14: error: package android.widget does not exist
import android.widget.Button;
                     ^
Main.java:15: error: package android.widget does not exist
import android.widget.ProgressBar;
                     ^
Main.java:16: error: package android.widget does not exist
import android.widget.TextView;
                     ^
Main.java:17: error: package android.widget does not exist
import android.widget.Toast;
                     ^
Main.java:19: error: package com.jjoe64.graphview does not exist
import com.jjoe64.graphview.GraphView;
                           ^
Main.java:20: error: package com.jjoe64.graphview.series does not exist
import com.jjoe64.graphview.series.DataPoint;
                                  ^
Main.java:21: error: package com.jjoe64.graphview.series does not exist
import com.jjoe64.graphview.series.LineGraphSeries;
                                  ^
Main.java:29: error: cannot find symbol
public class MainActivity extends AppCompatActivity {
                                  ^
  symbol: class AppCompatActivity
Main.java:33: error: cannot find symbol
    Button toggleThreadButton;
    ^
  symbol:   class Button
  location: class MainActivity
Main.java:34: error: cannot find symbol
    TextView peakText;
    ^
  symbol:   class TextView
  location: class MainActivity
Main.java:35: error: cannot find symbol
    ProgressBar volumeProgress;
    ^
  symbol:   class ProgressBar
  location: class MainActivity
Main.java:36: error: cannot find symbol
    GraphView dataGraph;
    ^
  symbol:   class GraphView
  location: class MainActivity
Main.java:38: error: cannot find symbol
    AudioRecorderThread thread;
    ^
  symbol:   class AudioRecorderThread
  location: class MainActivity
Main.java:42: error: cannot find symbol
    FastFourierTransform fastFourierTransform = new FastFourierTransform(1024, 44100);
    ^
  symbol:   class FastFourierTransform
  location: class MainActivity
Main.java:162: error: cannot find symbol
    protected void onCreate(Bundle savedInstanceState) {
                            ^
  symbol:   class Bundle
  location: class MainActivity
Main.java:42: error: cannot find symbol
    FastFourierTransform fastFourierTransform = new FastFourierTransform(1024, 44100);
                                                    ^
  symbol:   class FastFourierTransform
  location: class MainActivity
Main.java:47: error: package Manifest does not exist
                    Manifest.permission.RECORD_AUDIO)
                            ^
Main.java:46: error: cannot find symbol
            if (ContextCompat.checkSelfPermission(this,
                ^
  symbol:   variable ContextCompat
  location: class MainActivity
Main.java:48: error: cannot find symbol
                    != PackageManager.PERMISSION_GRANTED) {
                       ^
  symbol:   variable PackageManager
  location: class MainActivity
Main.java:52: error: package Manifest does not exist
                        new String[]{Manifest.permission.RECORD_AUDIO},
                                             ^
Main.java:51: error: cannot find symbol
                ActivityCompat.requestPermissions(this,
                ^
  symbol:   variable ActivityCompat
  location: class MainActivity
Main.java:56: error: cannot find symbol
                thread = new AudioRecorderThread(new AudioRecorderInterface() {
                             ^
  symbol:   class AudioRecorderThread
  location: class MainActivity
Main.java:56: error: cannot find symbol
                thread = new AudioRecorderThread(new AudioRecorderInterface() {
                                                     ^
  symbol:   class AudioRecorderInterface
  location: class MainActivity
Main.java:161: error: method does not override or implement a method from a supertype
    @Override
    ^
Main.java:163: error: cannot find symbol
        super.onCreate(savedInstanceState);
        ^
  symbol:   variable super
  location: class MainActivity
Main.java:164: error: package R does not exist
        setContentView(R.layout.activity_main);
                        ^
Main.java:166: error: package R does not exist
        toggleThreadButton = findViewById(R.id.mainActivityButtonStartThread);
                                           ^
Main.java:167: error: package R does not exist
        peakText = findViewById(R.id.mainActivityTextPeak);
                                 ^
Main.java:168: error: package R does not exist
        volumeProgress = findViewById(R.id.mainActivityProgressVolume);
                                       ^
Main.java:169: error: package R does not exist
        dataGraph = findViewById(R.id.mainActivityGraphData);
                                  ^
Main.java:171: error: package View does not exist
        toggleThreadButton.setOnClickListener(new View.OnClickListener() {
                                                      ^
Main.java:178: error: method does not override or implement a method from a supertype
    @Override
    ^
Main.java:184: error: cannot find symbol
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                                              ^
  symbol:   variable PackageManager
  location: class MainActivity
Main.java:188: error: cannot find symbol
                    Toast.makeText(this, "Permission was not granted", Toast.LENGTH_SHORT).show();
                                                                       ^
  symbol:   variable Toast
  location: class MainActivity
Main.java:188: error: cannot find symbol
                    Toast.makeText(this, "Permission was not granted", Toast.LENGTH_SHORT).show();
                    ^
  symbol:   variable Toast
  location: class MainActivity
Main.java:194: error: method does not override or implement a method from a supertype
    @Override
    ^
Main.java:197: error: cannot find symbol
        super.onStop();
        ^
  symbol:   variable super
  location: class MainActivity
49 errors
stdout
Standard output is empty