当前位置: 首页 > news >正文

基于Java实现DFT、FFT,并绘制波形图和频谱图,音频播放频谱或波形图

编程实现按时间抽取的基 2FFT 算法

一、已实现功能介绍:

  • 实现了 DFT、FFT 算法,与手算结果以及 MATLAB 运算比较后结果正确;
  • 计算出 DFT、FFT 的各自所用时间(精确到纳秒);
  • 提取 wav 文件数据(此算法可提取大部分 wav 文件,修复了网上提供的代码不能提取一部分 wav 文件的 bug);
  • 可绘制波形及频谱图(幅度谱),绘制结果如下:
    可绘制前 N 点波形或频谱图;
    可开启线程,边播放音频边绘制波形或频谱图
  • 带有 Java 及 MATLAB 连接数据库方法,可将各自运算结果保存到数据库或通过数据库交换信息。

二、开发环境及介绍

开发用 Eclipse,检验用 Eclipse 和 MATLAB。

三、项目文件介绍

本次项目位于项目文件夹 FFT2_backup,一个类一个 Java 文件,所有类在 priv.Zhanghao.FFT 包,

  • Bignumber 类:验证 Java 计算存在的误差以及解决方法;
  • Complex 类:实现了复数及其加减乘除运算;
  • Demo 类:主类,实现了调用其他类,开启线程等;
  • DFT 类:实现了 DFT 运算;
  • FFT 类:实现了 FFT 运算的两种方法、倒叙、返回一个数是 2 的几次幂;
  • FFTCalc0ToEnd 类:线程运算 FFT 并绘制频谱图;
  • TestComplex 类:复数结果测试类;
  • TestFFT 类:FFT 结果测试类;
  • TestM 类:测试方法(函数)一个数是 2 的几次幂;
  • TestReverse 类:倒叙结果测试类;
  • Util 类:工具类,实现了将提取的数据转换成复数、将复数的实数部分提取到小数数组、将小数数组数据绝对值化、int 数组 转换到 double 数组;
  • WavDraw 类:线程绘制波形图;
  • WavAcc、WaveConstants、WaveFileReader、WaveFileWriter 类:文件读写类
  • WavPlay 类:线程播放音乐。

四、DFT、FFT 算法实现及结果验证

4.1 DFT 算法实现

方法位于 DFT 类

4.2 FFT 算法实现

4.2.1 方法一

方法位于 FFT 类

4.2.2 方法二

方法位于 FFT 类

对此方法进行重载,使之可从 offset 点开始计算 N 点 FFT

4.3 DFT、FFT 运行结果比较与验证

测试位于 TestFFT 类

4.3.1 计算 x(n)= {4,3,2,1,0}的 DFT

Java 计算结果

手算结果

MATLAB 结果

结果分析

结果正确,存在一点误差,误差原因:Java 运算时精确度不够,想要更高的精确度需要运用 Java 的大数(Bignumber),但是编写较为复杂,且绘制频谱图不需要那么高的精确度,因此没有使用。

4.3.2 计算 x(n)= {0,1,2,3,4,5,6,7}的 DFT、FFT

Java  DFT 运算结果

MATLAB  FFT 运算结果

Java  FFT 运算结果

结果分析

除去 Java 自身精确度问题外,结果正确。证明自己用 Java 所编写 DFT 与 FFT 正确,根据运行时间看出,DFT 用时 1.2617 毫秒,FFT 用时 0.8225 毫秒,FFT 比 DFT 速度快。

4.4 绘制波形及前 N 点频谱

4.4.1 绘制波形图

MATLAB 绘制

Java 绘制

4.4.2 绘制前 N 点频谱图(这里 N=2048)

MATLAB 绘制

Java 绘制
DFT

双声道共用时 0.5654s,单声道用时 0.2812s

FFT
方法一

函数名 fft

双声道共用时 0.0064649s,单声道此次最快用时 0.0014863s。

方法二

函数名 myFFT

双声道共用时 0.0087074s,单声道此次最快用时 0.003424s。

结果分析

Java 编写的 DFT、两种 FFT 运算方法与 MATLAB 结果基本相同,(由于 Java 会存在一点误差,想要解决需要用大数数据类型,即 Bignumber,但编程复杂,且对图影响不大,所以未使用)。

  • 运行速度比较:fft>myFFT>dft。
  • 精确度比较:myFFT≈dft>fft。
  • 所以建议使用 myFFT。

五、总结

通过这次编程,实现了 Java、MATLAB 的 DFT、两种 FFT 算法,能提取 Wav 文件数据(修复了网络上已存在代码的 bug,能提取更多种格式的 Wav),能查看 Wav 音频的采样速率、单双声道、采样数据的数据位数、播放时长等信息,能完整绘制波形与频谱图,能绘制前 N 点波形与频谱图,能边播放音频边显示波形或频谱。本次编程存在两点误差与解决方法:

  • Java 计算精确度问题,需要用 Bignumber,不过由于有些复杂所以没有使用;
  • 音频与波形的匹配要自己调节,故存在误差。可以根据采样速率以及 FFT 计算时间计算出较为匹配的线程等待数值。

由于做的比较晚,所以没有去解决这两种问题。

通过这次实验对 DFT、FFT 以及频谱图的绘制有了更深的理解。

http://www.lryc.cn/news/597106.html

相关文章:

  • 内积(Inner Product)和余弦相似度区别
  • MATLAB近红外光谱分析:MATLAB编程+BP神经网络+SVM+随机森林+遗传算法+变量降维+卷积神经网络等
  • 以 “有机” 重构增长:云集从电商平台到健康生活社区的跃迁
  • 零工合规挑战:盖雅以智能安全体系重构企业用工风控
  • 认识linux进程内存布局以及与命令行参数和环境变量的关系
  • 如何在VS code里使用SQLtool连接上WSL上的MySQL服务
  • 【软件系统架构】系列七:物联网云平台系统性能深入解析
  • 线性神经网络(深度学习-李沐-学习笔记)
  • 探索大语言模型(LLM):提升 RAG 性能的全方位优化策略
  • 我考PostgreSQL中级专家证书二三事
  • 论文略读:REMEDY: RECIPE MERGING DYNAMICS IN LARGE VISION-LANGUAGE MODELS
  • vue3笔记(2)自用
  • 微软2025教育AI报告:教育群体采用AI的比例显著提升
  • 技术速递|使用 Semantic Kernel 与 A2A 协议构建多智能体解决方案
  • Qt 样式表(QSS):打造个性化界面
  • 【前端】【Vue DevTools】Vue DevTools 进阶:用 Trae / Cursor 替换 VSCode 打开文件(跳转行列无误)
  • 论文略读:Knowledge is a Region in Weight Space for Finetuned Language Models
  • iOS上使用WebRTC推拉流的案例
  • 想曰加密工具好用吗?本地安全、支持多算法的加密方案详解
  • ZLMediaKit流媒体服务器WebRTC页面显示:使用docker部署
  • 基于Matlab传统图像处理技术的车辆车型识别与分类方法研究
  • 【第三章自定义检视面板_创建自定义编辑器_如何创建自定义PropertyDrawer(9/9)】
  • 第六章 W55MH32 UDP Multicast示例
  • 在离线 Ubuntu 22.04机器上运行 ddkj_portainer-cn 镜像 其他相关操作也可以复刻 docker
  • CCD工业相机系统设计——基于FPGA设计
  • 【后端】FastAPI的Pydantic 模型
  • 【Linux-云原生-笔记】keepalived相关
  • 蒙牛社交电商的升级路径研究:基于开源链动2+1模式、AI智能名片与S2B2C商城小程序源码的融合创新
  • 轻量化RTSP视频通路实践:采集即服务、播放即模块的工程解读
  • 【Redis】在Ubentu环境下安装Redis