Exact Factorisation and Fast Computation of Invertible Constant-Q Transforms
Facundo Franchino, Eloi Moliner, Vesa Välimäki
eess.SP, cs.SD, eess.AS, math.NA
2026-09-24
把选频、加窗、重排压成固定路由表并融进单个 CUDA kernel,可逆 CQT 往返提速 2-8 倍,临时显存省 36%,重建 SNR 约 130 dB。
音频模型的输入几乎都从时频表示开始。STFT 用同一个窗扫所有频带,频率分辨率处处一样;音乐里等音程对应等频率比,CQT(constant-Q transform,常数Q变换)据此把频带按对数间距排列,窗长随中心频率反比变化,低频分得细、高频跟得上,是音高估计、自动记谱和音乐分析的标准前端。基于非平稳 Gabor 变换(NSGT)的构造让 CQT 精确可逆,系数经过分析、编辑甚至由模型生成之后都能还原成波形,变换本身线性可微,本该是音频生成、源分离这类模型的理想前端。
卡住的地方在 GPU 效率。可逆 CQT 各频带窗长不同,高频带在同样时长里产出更多系数,数组是参差的。现有实现分步调用:一次长 FFT、逐带选频加窗、逐带短逆 FFT,每步一个 kernel launch,中间谱写回显存再读出,补零对齐又浪费算力和存储。nnAudio 可微但不可精确求逆,其余可逆实现又偏慢。训练循环里这套变换每个 iteration 都要跑,开销被成倍放大。
核心是把长 FFT 与各频带短逆 FFT 之间的全部操作(选频、共轭、加窗、重排)压成一张固定路由表,让路由和短逆 FFT 在同一个 CUDA kernel 里完成,中间频谱不再落回显存。
三个关键设计:
Theorem 1 给出算术结构边界:radix 上限为 r 时,层深不超过 τr(L) + 1 + max τr(Mλ)。论文配置下 L = 32,768 = 32³,层深为 3+1+3 = 7,块宽度不超过 64;文中还论证在该结构下 7 层是必要的。这个界约束的是算术结构,不代表 kernel 数量或运行时最优。
CUDA 实现锁定 44.1 kHz 下 N = 65,536 个样本为一个 slice:9 个八度、152 个正频率频带,每八度 8/16/32 带的三种分辨率混排;每个频带一个 256 线程 block,共享内存占用不超过 16.25 KiB。更长的音频切成 50% 重叠的 slice 加 Tukey 过渡窗,内存有界,可流式处理。
测在 A100、FP32 上。基线是 PyTorch 调 cuFFT 实现的同一个算子,窗、原生系数长度、边带完全一致且不补零,差距全部来自实现方式:
| 方法 | 重建 SNR (dB) | 峰值临时空间 (MB/信号) | B=1 往返 (ms) | B=1 含反向 (ms) |
| STFT(参照) | 133.1 | 4.3 | 0.051 | 0.838 |
| CQT 基线 | 126.8 | 4.2 | 0.601 | 10.003 |
| Flash-CQT | 129.8 | 2.6 | 0.116 | 1.969 |
一个诚实的细节:B=128 时原生 eager STFT 往返 1.39 ms,低于 Flash-CQT 的 1.66 ms。大 batch 下它逼近 STFT 成本,没有反超。
对做音频模型的人,这篇把可逆 CQT 从比 STFT 贵 12 倍拉到 2 倍上下。扩散音频生成、源分离、带宽扩展、音色迁移这些需要把对数频率系数还原成波形的任务,前端成本不再构成障碍;CQT loss、CQT 判别器即使不用可逆性,也能直接用融合的分析 kernel 和精确梯度。
工程上这是渐进改进:算子没动,数学贡献是把中间操作证明为精确的固定映射,收益全部来自消掉 kernel 之间的数据搬运。这类工作的价值在变换被反复调用的场景最直接,训练正好是这种场景。
作者自己列出的:kernel 专门针对 N = 65,536 的 slice,更短的信号要么砍最低频带要么降低 Q(牺牲频率选择性),都需要新 kernel;对完整模型训练的影响、与对等 cuFFTDx 实现的对照留作开放问题;层深界只针对算术结构;推广到听觉滤波器组等其他 painless NSGT 理论可行,但 fan-out 和性能未验证。
读下来还有两点。切片加过渡窗支撑长音频流式处理,但论文没有评估切片边界的数值或听感质量。所有测试只有 A100 和 V100 两块卡、一种频带配置,换配置要重造路由表和专用 kernel,灵活性弱于通用库。