使用 apache.commons.math3库实现离散时间傅里叶变换。(github 地址: https://github.com/apache/commons-math )
Android 使用前需要在 build.gradle 中添加:
// https://mvnrepository.com/artifact/org.apache.commons/commons-math3
compile group: 'org.apache.commons', name: 'commons-math3', version: '3.6.1'
对以下信号的傅里叶变换:
f ( t ) = 100 s i n ( 10 π t ) + 25 s i n ( 20 π t ) + 10 s i n ( 30 π t ) f(t)=100sin(10\pi t)+25sin(20\pi t)+10sin(30\pi t) f(t)=100sin(10πt)+25sin(20πt)+10sin(30πt)
也就是说包含三个分量的信号: 5Hz , 10Hz , 15Hz ,幅值分别为 100 , 25,10 。
采样率为 50Hz 。
频谱分析结果:
由于存在频谱泄露导致的误差,幅频图像基本正确。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/bar"
android:max="50"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/frequency_line_chart"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.github.mikephil.charting.charts.LineChart>
</LinearLayout>
package com.uestc.diagnosis;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Matrix;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ProgressBar;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.LimitLine;
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;
import com.github.mikephil.charting.listener.ChartTouchListener;
import com.github.mikephil.charting.listener.OnChartGestureListener;
import com.github.mikephil.charting.utils.Utils;
import org.apache.commons.math3.analysis.UnivariateFunction;
import org.apache.commons.math3.analysis.interpolation.SplineInterpolator;
import org.apache.commons.math3.analysis.interpolation.UnivariateInterpolator;
import org.apache.commons