java 实现离散时间傅里叶变换

本文介绍了如何使用Apache Commons Math库在Java中实现离散时间傅里叶变换。针对信号f(t)=100sin(10πt)+25sin(20πt)+10sin(30πt)进行采样,分析了频谱泄漏误差,并强调了数据长度必须为2的幂。在处理过程中,若数据长度不符合要求,需要在末尾插入0。此外,讨论了负频率在实数信号中的特性,指出正负频率的幅值相等,只需将正频率的值乘2。FastFourierTransformer生成的数组中,前半部分表示正频率,后半部分表示负频率,且结果是轴对称的。
摘要由CSDN通过智能技术生成

使用 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 。
频谱分析结果:

Android 幅频图像
[^_^]: ![Android 幅频图像 ](https://imgconvert.csdnimg.cn/aHR0cDovL3d3MS5zaW5haW1nLmNuL2xhcmdlLzAwNjJhSU9FbHkxZnJjOWFxdWx5YWozMHUwMWhjZGhtLmpwZw)

由于存在频谱泄露导致的误差,幅频图像基本正确。

<?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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值