brew install mesqueeb/tap/fft
用于 FFT 分析的实验性 Swift CLI 工具
此仓库创建的目的是进行声音分析实验,使用 Swift 语言。通过这个项目,我旨在理解声音的工作原理、如何以数字方式存储声音,以及如何使用快速傅里叶变换 (FFT) 等技术对其进行可视化。这个过程涵盖了从原始音频振幅提取到频谱图生成的方方面面。
此工具读取音频文件(包括 .mp3
、.wav
、.flac
和 .raw
),并将它们处理成原始振幅数组和频谱图,同时支持通过 SoX 进行文件格式转换,并生成 FFT 可视化。
完整示例位于 examples
我们从 elephant.flac 开始
它被转换为 elephant_flac.raw
然后,原始文件被转换为原始振幅值,可在 elephant_raw_amplitudes.json 中查看
[0.0018920898,0.0014038086,0.001739502,0.0013427734,0.0008544922,0.0007324219,-0.00012207031,-0.00036621094,-0.00048828125,-0.00076293945,-0.00033569336,-0.00088500977,0.00012207031,-0.00039672852,0.0004272461,-0.00021362305,0.00021362305,-0.00021362305,0,-0.0005187988,3.0517578e-05,-0.00039672852,0.00015258789,-0.0005493164,0.00091552734,6.1035156e-05,0.0014038086,0.00076293945,0.0013427734,0.00076293945,0.00061035156,0.00033569336,9.1552734e-05,-0.00021362305,-0.00018310547,...]
原始振幅值随后被转换为频谱图,可在 elephant_spectrogram.svg 中查看
OVERVIEW: A Swift command-line tool for FFT analysis.
USAGE: fft <input-file> [--json] [--svg] [--open] [--output <output>] [--sample-rate <sample-rate>] [--max-frequency <max-frequency>] [--verbose]
ARGUMENTS:
<input-file> The path to the raw or audio file.
OPTIONS:
--json Save the extracted raw amplitude as JSON.
--svg Save an SVG spectrogram to a file.
--open Open the SVG in Preview.
-o, --output <output> Output SVG spectrogram filename.
-s, --sample-rate <sample-rate> (default: 44100.0)
-m, --max-frequency <max-frequency> (default: 1000.0)
-v, --verbose Enable verbose output.
-h, --help Show help information.
转换和分析 .mp3
文件
swift run fft elephant.mp3 --json --svg --open --verbose
分析 .wav
文件并仅保存 JSON
swift run fft sound.wav --json
创建具有自定义采样率的 SVG 频谱图
swift run fft music.flac --svg --sample-rate 48000 --max-frequency 5000
git clone https://github.com/mesqueeb/SwiftSound.git
cd SwiftSound
brew install sox
swift build
swift run fft <input-file> [options]
.package(url: "https://github.com/mesqueeb/SwiftSound", from: "1.0.3")
import SwiftSound
let result = stft(samples: [/** ... */], sampleRate: 44100.0)
print("result:", result)
.raw
是未压缩的样本,而 .mp3
、.wav
和 .flac
以不同的方式压缩音频。sox
可以在音频格式和采样率之间进行转换。SwiftPlot
可视化 STFT 结果。这个项目始于一个简单的问题:“什么是声音?”,并演变成对音频分析、信号处理和声音的数字表示的深入探索。它也成为探索 Swift 如何用于科学计算的旅程。
我希望这个实验能够启发其他人探索编程、科学和艺术的交叉点。 🎶💻✨
欢迎随意 Fork 这个项目、贡献代码或提出建议!
作者: Luca Ban
GitHub: mesqueeb