Engineering

技术细节

写给想弄清楚每一档到底差在哪的人。下面每个数字都标了测法,可以在随包的技术白皮书里复现。

Signal Path

一、信号链:每一步都能换

一首歌从文件到耳朵,走的是这条路。每一环都可以在设置里换成别的做法。

解码 流式分块 FLAC / DSF / WAV 矩阵 多声道下混 2.0 – 7.1.4 均衡 20 段 PEQ 旁路可直通 校准 卷积 IR 房间校正 升频 最高 768 kHz 79 个滤波器 音量 ReplayGain 0 dB 直通 抖动 TPDF / NS9 LNS15 输出 WASAPI 独占 ASIO / UPnP
举例:44.1k 的 FLAC 可以被升到 768k(升频), 用 79 个预设里的某一个做内插(滤波), 降到 24 bit 时加 TPDF(抖动),音量保持 0 dB(直通), 最后走 WASAPI 独占送到 DAC(输出)。这条链上任何一环换了,声音都会变。
Filters

二、79 个滤波器预设

每个预设都跑真实冲激响应,测出六种采样率组合下的 −3 dB 带宽、20 kHz 衰减、阻带深度与群延迟。 随包技术白皮书里附了 87 张双面板频响图,全部来自本机实测。

抽头是按内插后的域预算的

每相抽头数 = 总抽头 ÷ 内插倍数。倍率越高,每相抽头越少。

预设44.1k→96k44.1k→384k
poly-sinc-short-lp12 抽头/相4 抽头/相
poly-sinc-tight-lp512 抽头/输入512 抽头/输入

同一个短抽头滤波器,44.1k→384k 时的可听带镜像抑制会从 −16.5 dB 掉到 −7.8 dB。

PCM 升频与滤波

相位:线性 / 最小 / 混合

类型@100 Hz@1 kHz@10 kHz
线性相位9.286 ms9.286 ms9.286 ms
最小相位0.126 ms0.158 ms4.769 ms

多声道系统建议线性相位,各声道相位才能对齐。

20 段参数均衡器
DSD

三、DSD 调制:三道闸

调制器再激进,也不该把高音单元推爆。所以有这三道保护串在一起。

1024
最高 DSD 比特率(45.1584 MHz)
−108.32 dBFS
DSD64→DSD128 带内噪声(与 DSD64 原样差 0.002 dB)
0.000010 dB
0–20 kHz 通带平坦度最差偏差
3.11× 实时
真实 .dsf 流式转换(258.6 MB / DSD64 / 384 s)
闸 1

量化器输入限幅

|u| ≤ 1.5,超限计入 overload 计数。界面上能看到这个数在动。

闸 2

误差钳位

积分器误差不发散——这是「过载之后还能回来」的前提。

闸 3

恢复判据

瞬态结束后测 RMS 回落、同号率、限幅计数不再增长,三项都过才算恢复。

配置实测结论
7 阶 · DSD64MSSA 0.704稳定
Chebyshev · DSD645640 次/秒钳位 · 带内 −47.5 dBFS持续过载,不建议
降阶的原因带内噪声差 6.5 dB音质取舍,不是稳定性问题
SDM(DSD)设置

DSD 升频:44.1k 族与 48k 族分开算

DSD 的比特率和 PCM 一样有两条族谱:44.1k 族(DSD64 = 2.8224 MHz,逐级翻倍) 与 48k 族(DSD64 = 3.0720 MHz)。两族比值是 147:160,不能混着搬。

  • 输出比特率:DSD64 / 128 / 256 / 512 / 1024
  • 封装:DoP(WASAPI 与 ASIO 都行)或 Native(ASIO 原生 1-bit 直送)
  • 源是 DSD 时可以原样输出,也可以升到更高 DSD 率(DSD→DSD,不经 PCM 中转)
  • 降速也可用(如 DSD128→DSD64),但带内水平受源自身位率限制

实测数据

项目结果
DSD64→DSD128 带内噪声−108.32 dBFS
与「DSD64 原样」对照差 0.002 dB
通带平坦度(0–20 kHz)0.000010 dB
级联 64→128→256 vs 直接 64→256ΔTHD+N −0.004 dB
降速 128→64 的 THD+N101.87 dB(源 106.81 dB)
流式转换吞吐3.11× 实时

降速那条不是缺陷:1-bit 量化步长与位率决定了上限,DSD64 装不下 DSD128 的信息量。 有意思的是,降速结果的 THD+N 比原生 DSD64 基线(99.55 dB)还高 2.3 dB,因为送进来的中间信号更干净。

Tone & Room

四、音色与房间:EQ 与校准

这两块在处理链的中段:先 EQ 调音色,再卷积补房间。顺序是固定的,因为房间的坑不该被 EQ 掩盖。

20 段参数均衡(PEQ)

每段可以设频率、增益、Q 值和类型(峰值 PK / 低架 LS / 高架 HS / 高通 HP / 低通 LP)。 曲线上直接拖节点改增益与频率,Shift + 拖 改 Q,双击归零。

  • 旁路时是真旁路:20 段全部不参与计算,不是把增益置零
  • 默认 20 段全 0 dB,即使生效也等同直通
  • 自动前级:按当前曲线算一个负增益,防止 EQ 后削波
  • 预设可保存 / 加载 / 删除
20 段参数均衡器

房间声学校正

用麦克风测房间的真实响应,反卷积得到校正卷积核,挂到每个声道的处理链上。

  • 方法:Farina 扫频 + 正则化反卷积 + 心理声学平滑 + Hilbert 最小相位变换
  • 实测:反卷积恢复误差 0.0095 dB,校正闭环 1.28 dB
  • 支持 2.0 / 5.1 / 7.1 / 7.1.4 等布局,逐声道独立测量
  • 卷积走 CPU 或 GPU(长 IR 自动切 GPU 流式卷积)
声音校准
处理链顺序(src/engine/pipeline.h):解码 → 矩阵 → PEQ → 每声道 EQ / 延迟 / 卷积 → 重采样 → 音量 → 抖动 / 量化 → 输出。 这条链上任何一环开启处理,都会反映到「是否 bit-perfect」的判定里。
GPU

五、GPU 升频:与 CPU 逐样本一致

AMD HIP 与 NVIDIA CUDA 两条后端。判据不是「快了多少」,而是结果和 CPU 参考完全一样。

−310 dB
流式卷积 relRMS(相对 CPU 参考)
0
max|Δ|(逐样本差)
−316 dB
FP64 升频偏差(≤2 ULP)
0
CUDA 覆盖的 cubin 架构档数
CUDA 后端:DLL 内含 19 档 cubin(sm_50…sm_121)与 PTX 前向兼容,导出 7 个符号、 静态链接 CUDA Runtime——用 cuobjdump -lelf / dumpbin /exports 逐项核对过。
AI Intelligence

六、AI 资料整理:检索、核对、落盘

这是 RLPlayer 认真做的一块。播放器不该只是播放器——一个本地曲库也该有在线资料库的深度。

两步走:先检索,再综合

模型不靠记忆写百科。它先通过 function calling 调用检索与抓取工具, 拿到真实页面,再根据页面内容整理成结构化字段。

  • 检索走 DeepSeek 的 search / fetch 工具,结果带出处
  • 引用外部页面时核对归属:专辑名、曲目列表、时长,至少两项对得上
  • 对不上的页面不采信,也不拿它写断言
  • 模型自己的知识单独标注来源,与检索到的内容分开
专辑详情页的 AI 整理结果

三类档案,字段各不相同

专辑、单曲、艺术家各有自己的字段表。专辑关心首发日期、会场、售价、曲目列表; 单曲关心原曲、编曲、时长、曲目档案;艺术家关心社团归属与作品年表。

  • 结果按文件路径缓存,同一个文件不重复消耗额度
  • 缓存带版本号,提示词升级时整体失效重算
  • 字段值只写纯文本,名词由程序自动挂权威链接(维基 / 萌娘 / VGMdb / THBWiki)
  • AI 结果异步到达,不阻塞播放
单曲页:AI 档案与音频分析

元数据补全

六个数据源并行:MusicBrainz、VGMdb、Discogs 等。不用 AI 也能补全基础字段。

封面与头像

脚本源抓不到时,自动回落到 AI 检索——同一套工具链,不用两套逻辑。

额度可见

设置页能看用量统计。不想花额度随时可以关掉,本地功能不受影响。

Analysis

七、音频分析:假无损一测便知

播放时自动跑一次,结果挂在单曲页。轻量、离线、不打扰。

指标口径实测精度
动态范围ITU BS.1770-4(含 K 加权)997 Hz / −23 dBFS → −23.000 LUFS
跨采样率一致性44.1 / 96 / 192 kHz±0.003 LU
假无损(砖墙)16k / 19k 截止检出±200 Hz
缓坡误报自然衰减的母带不误报
16 bit 装 24 bit容器位深 ≠ 有效位深可检出

置信度 < 0.5 的结果不显示,避免误报。

Notes

八、暂不支持与使用注意

暂不支持 ISO / SACD-ISO / DST

遇到这类文件会识别并提示。需要播放的话,先用 sacd_extract 转成 DSF / DFF, 再放进音乐库即可——转换后的 DSD 可以正常走原生输出。

AI 需要外部服务

要填自己的 API Key 与额度。不填的话全部本地功能照常,只是没有资料整理。

版本对比的维度

对比两个版本时看的是频响与动态差异,这是最能反映编码差别的两个维度。