[JAVA] Android App Spectrum Analyzer

0. Einleitung

Erstellen Sie einen Spektrumanalysator mit einer Android-App, die den Ton von einem Mikrofon erfasst, die Frequenz analysiert und das Spektrum anzeigt. (Ich habe es nicht veröffentlicht, weil ich nichts machen kann, was veröffentlicht wird) ** Außerdem bleibt das Problem bestehen. ** ** **

Die Grafikzeichnungsbibliothek [MPAndroidChart] wird verwendet.

1. Führen Sie MPAndroidChart in das Projekt ein

Bearbeiten Sie build.gradle, um MPAndroidChart zu installieren. Es gibt zwei Arten von build.gradle, direkt unter dem Stammverzeichnis des Projekts und im App-Ordner. Fügen Sie Folgendes hinzu, um build.gradle direkt unter dem Stammverzeichnis zu erstellen

build.gradle(Project)


allprojects {
    repositories {
        maven {
            url "https://jitpack.io"
        }
    }
}

Fügen Sie build.gradle im App-Ordner Folgendes hinzu

build.gradle(app)


dependencies {
    implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
}

2. Quellcode

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;

//In der Hauptaktivität
public LineChart lineChart;

//in onCreate
lineChart = findViewById(R.id.line_chart);
initChart();

//Innerhalb von onCheckedChanged (weil ich Switch verwende)
fft = new Thread(new Runnable() {
    @Override 
    public void run() {

        //Nach der Verarbeitung wie Fourier-Transformation
        setData(decibelFrequencySpectrum);
    }
});
fft.start();

3. Initialisierung

InitChart-Methode zum Initialisieren des Diagramms

initChart


public void initChart() {

    lineChart.setTouchEnabled(true);
    lineChart.setDragEnabled(false);

    //Rasterhintergrundfarbe
    lineChart.setDrawGridBackground(true);

    // no description text
    lineChart.getDescription().setEnabled(true);

    lineChart.setBackgroundColor(Color.LTGRAY);

    LineData data = new LineData();
    data.setValueTextColor(Color.BLACK);

    // add empty data
    lineChart.setData(data);

    //Die vertikale Gitterachse ist unterbrochen
    XAxis xAxis = lineChart.getXAxis();
    xAxis.setAxisMaximum(2048);
    xAxis.setAxisMinimum(0);
    xAxis.enableGridDashedLine(10f, 10f, 0f);
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    YAxis leftAxis = lineChart.getAxisLeft();
    //Maximale / minimale Einstellung der Y-Achse
    leftAxis.setAxisMaximum(0f);
    leftAxis.setAxisMinimum(-150f);
    //Die horizontale Gitterachse ist unterbrochen
    leftAxis.enableGridDashedLine(10f, 10f, 0f);
    leftAxis.setDrawZeroLine(true);

    //Skalieren Sie rechts
    lineChart.getAxisRight().setEnabled(false);
}

4. Zeichnen

SetData-Methode, die mit einem Mikrofon aufzeichnet und Fourier-transformierte Daten zeichnet

setData


public void setData(double[] data) {

    ArrayList<Entry> values = new ArrayList<>();

    for (int i = 0; i < data.length; i++) {
        values.add(new Entry(i, (int)data[i], null, null));
    }

    LineDataSet set1;

    if (lineChart.getData() != null && lineChart.getData().getDataSetCount() > 0) {
        set1 = (LineDataSet) lineChart.getData().getDataSetByIndex(0);
        set1.setValues(values);
        lineChart.getData().notifyDataChanged();
        lineChart.notifyDataSetChanged();
    } else {
        // create a dataset and give it a type
        set1 = new LineDataSet(values, "Spectrum");

        set1.setDrawIcons(false);
        set1.setColor(Color.rgb(0, 0, 240));
        set1. setDrawCircles(false);
        set1.setLineWidth(0.5f);
        set1.setValueTextSize(0f);
        set1.setDrawFilled(false);
        set1.setFormLineWidth(1f);
        set1.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));
        set1.setFormSize(15.f);
        set1.setDrawValues(true);

        ArrayList<ILineDataSet> dataSets = new ArrayList<>();
        dataSets.add(set1); // add the datasets

        // create a data object with the datasets
        LineData lineData = new LineData(dataSets);

        // set data
        lineChart.setData(lineData);
    }
}

5. App-Bildschirm

5-1. Startbildschirm

Das Diagramm wird korrekt angezeigt. Drücken Sie oben links auf Schalter, um die Aufnahme zu starten und das Spektrum zu zeichnen.

5-2. Aufnahmebildschirm

Wenn ich Schalter drücke, beginnt die Aufnahme, aber die Grafik wird nicht gezeichnet. Warum?

5-3. Wenn Sie das Diagramm berühren

Es wurde gezeichnet. Die Grafik bewegt sich nicht, wenn Sie Ihre Hand loslassen. Wenn Sie es berühren, wird das Diagramm aktualisiert. Warum?

6. Ich möchte wissen, wie ich mich verbessern kann

Ich habe lineChart.setTouchEnabled (True) in False in initChart geändert, aber diesmal ist es überhaupt verschwunden. Es gibt keine Änderung, auch wenn Sie das Diagramm berühren. ~~ Bitte sag mir, wie ich mich verbessern kann ~~

7. Verbessert (29.07.2019)

LineChart.invalidate () hinzugefügt, um das Diagramm auf die setData-Methode im fft-Thread zu aktualisieren. Ich habe immer noch einen Fehler. Die Ursache ist ein Fehler, der durch den Versuch verursacht wird, die Benutzeroberfläche in einem anderen Thread als dem Hauptthread zu ändern. Daher wird es gelöst, indem der Hauptthread aufgefordert wird, die setData-Methode mit Handler zu verarbeiten.

Klicken Sie hier für neuen Code

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;

//In der Hauptaktivität
public LineChart lineChart;

//in onCreate
lineChart = findViewById(R.id.line_chart);
initChart();

//Innerhalb von onCheckedChanged (weil ich Switch verwende)
fft = new Thread(new Runnable() {
    @Override 
    public void run() {

        //Nach der Verarbeitung wie Fourier-Transformation
        handler.post(new Runnable() {
            @Override 
            public void run() {
                setData(decibelFrequencySpectrum);
            }
        });
    }
});
fft.start();

setData


public void setData(double[] data) {

    ArrayList<Entry> values = new ArrayList<>();

    for (int i = 0; i < data.length; i++) {
        values.add(new Entry(i, (int)data[i], null, null));
    }

    LineDataSet set1;

    if (lineChart.getData() != null && lineChart.getData().getDataSetCount() > 0) {
        set1 = (LineDataSet) lineChart.getData().getDataSetByIndex(0);
        set1.setValues(values);
        lineChart.getData().notifyDataChanged();
        lineChart.notifyDataSetChanged();
        lineChart.invalidate();
    } else {
        // create a dataset and give it a type
        set1 = new LineDataSet(values, "Spectrum");

        set1.setDrawIcons(false);
        set1.setColor(Color.rgb(0, 0, 240));
        set1. setDrawCircles(false);
        set1.setLineWidth(0.5f);
        set1.setValueTextSize(0f);
        set1.setDrawFilled(false);
        set1.setFormLineWidth(1f);
        set1.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));
        set1.setFormSize(15.f);
        set1.setDrawValues(true);

        ArrayList<ILineDataSet> dataSets = new ArrayList<>();
        dataSets.add(set1); // add the datasets

        // create a data object with the datasets
        LineData lineData = new LineData(dataSets);

        // set data
        lineChart.setData(lineData);
    }
}

Recommended Posts

Android App Spectrum Analyzer
Android Wetter App
Informationen zu Android-App-Komponenten
Startschuss für die persönliche Entwicklung der Android-App
ROS App Entwicklung auf Android
Android App dekompilieren ⇒ korrigieren ⇒ neu kompilieren
Erstelle eine Android App. (Tag 5)
Importieren Sie Gerätebilder mit der Android App
Erstelle eine Android App. (Erster Tag)
Hinweise zum Aufrufen von Installer in der Android App
Ich habe eine passende App erstellt (Android App)
[Android] Ich habe eine Schrittzähler-App erstellt.
Gesichtserkennungs-App mit OpenCV + Android Studio
Ich habe eine Taschenrechner-App für Android erstellt
Ich habe eine Janken App mit Android gemacht
Ermöglicht die automatische Wiedergabe von Youtube auch mit der Android-App von Cordova