来源:AI开发日志公众号专辑「Build Your Own X With AI」
原文链接:https://mp.weixin.qq.com/s?__biz=MzUxMjg3MjE2OA==&mid=2247485945&idx=1&sn=454faa13529261ef26d63d99031e4942&chksm=f95c927ece2b1b68925b203a7d731584a131dbe20999f987021bc30067256c7ac96f6aef14cb#rd

傅里叶变换可视化工具

一个 macOS 应用程序,通过交互式绘图和旋转圆圈动画(本轮)来可视化傅里叶级数分解。

功能特点

交互式绘图画布

:在左侧面板使用鼠标绘制任意路径

实时傅里叶分析

:自动将您的绘图分解为频率分量

本轮动画

:观看旋转的圆圈组合重现您的绘图(右侧面板)

可调参数

圆圈数量(1-50):控制显示多少个频率分量

动画速度(0.1x-5.0x):调整播放速度

持久轨迹

:轨迹可保留多达 1000 个点,便于更好地可视化

使用方法

启动应用程序

:打开应用后看到分屏界面

绘制路径

在左侧白色画布上点击并拖动鼠标绘制任意形状

完成后释放鼠标

开始动画

点击”Start”按钮开始傅里叶级数动画

观看右侧面板中圆圈旋转并描绘您的图形

调整参数

使用”Circles”滑块增加/减少本轮数量

使用”Speed”滑块控制动画速度

清除并重绘

点击”Clear”按钮清除所有内容并重新开始

数学原理

本应用演示了傅里叶级数分解,该理论指出任何周期函数都可以表示为旋转圆圈(复指数)的和。

离散傅里叶变换(DFT)

对于具有 N 个采样点的路径,每个傅里叶系数计算如下:

c_n = (1/N) * Σ f(t) * e^(-int)

其中:

c_n

是频率 n 的复系数

f(t)

将路径表示为复函数(x + iy)

每个系数具有:

频率

:圆圈旋转的速度

振幅

:圆圈的半径

相位

:旋转的起始角度

工作原理

路径采样

:您的绘图被采样为均匀间隔的点(最多 150 个样本)

居中

:点围绕其平均值居中,以正确定位动画

DFT 计算

:对于 -30 到 30 的频率,应用计算振幅和相位

排序

:圆圈按振幅排序(最大的在前),以便更好地可视化

动画

:每一帧,所有圆圈以各自的频率旋转并组合以描绘路径

代码结构

主要组件

FourierTransformApp

:应用程序主入口点

ContentView

:分屏布局,包含绘图画布和动画视图

DrawingCanvas

:处理鼠标输入用于绘图的 NSView

FourierCircleCanvas

:渲染旋转圆圈和轨迹的 NSView

FourierViewModel

:DFT 计算和动画管理的业务逻辑

FourierCoefficient

:存储频率、振幅和相位的数据模型

关键文件

Fourier-Transform/Fourier-Transform/FourierTransformApp.swift

:完整应用代码(405 行)

算法流程

用户绘制路径

捕获点(鼠标事件)

均匀采样(最多 150 个点)

居中点(去除偏移)

计算 DFT(-30 到 +30 频率)

存储系数(频率、振幅、相位)

动画循环(60 fps):

  • 旋转每个圆圈

  • 求和所有圆圈位置

  • 绘制当前点

  • 描绘路径

技术栈

语言

:Swift 5.9+

框架

SwiftUI:现代声明式 UI

AppKit:原生 macOS 视图组件

Combine:响应式状态管理

Core Graphics:2D 渲染

Accelerate:已导入以备将来优化

平台

:macOS 13.0+

架构

:MVVM(模型-视图-视图模型)

系统要求

macOS 13.0(Ventura)或更高版本

Xcode 15.0 或更高版本(从源代码构建)

从源代码构建

克隆仓库

在 Xcode 中打开 Fourier-Transform.xcodeproj

选择目标设备(My Mac)

按 Cmd+R 构建并运行

实现细节

性能优化

DFT 计算最多 150 个采样点

频率范围限制为 -30 到 +30(最多 61 个系数)

圆圈数量可调(默认 10,最大 50)

路径轨迹限制为 1000 个点以防止内存问题

使用 Timer 的 60 fps 动画

动画循环

动画以 60 fps 运行,具有平滑循环:

时间增量:每帧 0.02 * animationSpeed

当时间超过 2π 时,它会环绕:time -= 2π

这创建了无缝的连续动画

坐标系统

绘图画布:标准 NSView 坐标(左下角原点)

动画画布:居中坐标系统,用于正确的圆圈渲染

路径描绘:从中心偏移以与圆圈端点对齐

致谢

本项目展示了几何与频率分析之间的美丽联系,展示了复杂形状如何从简单的旋转圆圈中浮现。

许可证

MIT 许可证 - 详见 LICENSE 文件

image-1