SwiftSound 🔊

brew install mesqueeb/tap/fft

用于 FFT 分析的实验性 Swift CLI 工具

概述

此仓库创建的目的是进行声音分析实验,使用 Swift 语言。通过这个项目,我旨在理解声音的工作原理、如何以数字方式存储声音,以及如何使用快速傅里叶变换 (FFT) 等技术对其进行可视化。这个过程涵盖了从原始音频振幅提取到频谱图生成的方方面面。

此工具读取音频文件(包括 .mp3.wav.flac.raw),并将它们处理成原始振幅数组频谱图,同时支持通过 SoX 进行文件格式转换,并生成 FFT 可视化

完整示例

完整示例位于 examples

  1. 我们从 elephant.flac 开始

  2. 它被转换为 elephant_flac.raw

  3. 然后,原始文件被转换为原始振幅值,可在 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,...]
  4. 原始振幅值随后被转换为频谱图,可在 elephant_spectrogram.svg 中查看

    elephant_spectrogram

🛠️ 如何使用

用法概述

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.

用例示例

  1. 转换和分析 .mp3 文件

    swift run fft elephant.mp3 --json --svg --open --verbose
  2. 分析 .wav 文件并仅保存 JSON

    swift run fft sound.wav --json
  3. 创建具有自定义采样率的 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]

在您的项目中使用 Swift 代码

.package(url: "https://github.com/mesqueeb/SwiftSound", from: "1.0.3")
import SwiftSound

let result = stft(samples: [/** ... */], sampleRate: 44100.0)

print("result:", result)

📚 我从中学到的关于声音的知识

🧩 声音的构建块:

🎨 声音如何变成数据:

🛠️ 关键技术要点:

❤️ 我为什么构建了这个项目

这个项目始于一个简单的问题:“什么是声音?”,并演变成对音频分析、信号处理和声音的数字表示的深入探索。它也成为探索 Swift 如何用于科学计算的旅程。

我希望这个实验能够启发其他人探索编程、科学和艺术的交叉点。 🎶💻✨

欢迎随意 Fork 这个项目、贡献代码或提出建议!

作者: Luca Ban
GitHub: mesqueeb