後続の固定120録音比較を追加しました。以下は先行する一録音の観測です。

一録音の89点が負の無限大になる経路を、保存値と命令列で説明する

Apron24を維持します。今回も音質比較・順位付け・復号音声はありません。元の120録音比較の欠測や未取得アーカイブを、この原因調査で補いません。

対象の高域フレームでは、FFTの実部・虚部は全て有限でした。保存した値と演算設定から厳密に導いた二乗和のうち、極小の正の値となる89点が、実際に負の無限大になった89点と位置まで一致しました。確認した逆平方根近似と補正の命令列で、この一録音・一フレームの結果を説明できます。

二乗和や逆平方根の返却をCPUのレジスターから直接測ったわけではありません。実測した複素値・作業スレッドの状態・実際の機械語を組み合わせた導出であることを、以下でも区別します。他の録音や元の非計装binaryの全実行へは一般化しません。

実測した複素値は有限で、演算の設定も前後で同じだった

前回と同じlibrispeech_121-127105-0035、フレーム371、帯域3を、別の計装版で一度だけ解析しました。解析窓は1,600標本、FFT長2,048、片側1,025点です。高域の実部1,025個は全て正規の有限値、虚部は1,023個が正規の有限値で2個が0でした。

振幅変換の直前・直後に実際の作業スレッドから読んだMXCSRは、どちらも0x00001fb7でした。最近接・偶数丸め、DAZとFTZは無効、六つの例外は全てマスクされています。観測のために設定を書き換えていません。例外の履歴を示すフラグは元から立っているので、前後の値が同じでも「演算中に例外が一度も起きなかった」とは言えません。

対照として観測した元PCM側は、実部・虚部・振幅が全1,025点で0でした。MXCSRは前後とも0x00001fa3で、丸めやDAZ・FTZの制御条件は高域側と同じです。

二乗和を導くと、負の無限大の89点と完全に一致する

実部の二乗、虚部の二乗、その和という、機械語で確認した順序を使いました。それぞれをbinary32の最近接・偶数丸めへ戻す計算を、整数と厳密な有理数で行っています。新しい音声解析やFFTの再実行ではありません。

高域の導出値は、最小の正のbinary32値2⁻¹⁴⁹の1倍が53点、2倍が34点、3倍が2点でした。これら計89点は非正規化数で、残る936点は0へ丸められます。最初の1,024点を処理するベクトル命令の範囲で、正の非正規化数となる全89点が、実測した負の無限大の位置と一致しました。

最後の1点は別のscalar平方根命令でした。この点の導出二乗和と実測振幅はいずれも0です。元PCM側は全1,025点の導出二乗和も実測振幅も0でした。

逆平方根の特殊な扱いと補正式が、符号まで説明する

IntelのRSQRTPSの仕様では、非正規化数の入力を同符号の0として扱い、0には同符号の無限大を返します。今回の命令列は、二乗和が0なら返却をマスクしますが、観測した条件では正の非正規化数は0との比較で非ゼロと扱われます。そのため、逆平方根の正の無限大が残ります。

続くNewton補正は、この正の無限大と正の二乗和から、最終的に負の無限大を作ります。実測した89点はまさにその値でした。正の係数による正規化後も負の無限大のままで、対数変換後にNaNとなり、前回と同じ雑音包絡の検査で拒否されました。

GCCも、fast-mathでベクトル化したfloat平方根を逆平方根とNewton補正へ変換することを説明しています。文献上の可能性だけで結論を出したのではなく、今回は実行したELFにその演算順があること、保存した入力と制御設定から全89点の値の種類を説明できることまで確認しました。

観測用の処理が元の経路を保つことを、実行前に確認した

実行前に、新しいELFの対象分岐を逆アセンブルしました。複素値のコピーが完了してからMXCSRを読み、元と同じベクトル演算を通り、全1,025点の変換後に再びMXCSRを読みます。間には関数呼出しやFPU制御の書換えがありません。最初の1,024点がベクトル、最後の1点がscalar sqrtssという分割も確認しました。

これにより、呼出し元スレッドの設定を作業スレッドの設定と取り違えずに読めます。ただし、命令列の静的確認だけで実行時の記録完成を保証したわけではありません。実行後に有効フラグ・長さ・エラー・二つの保存バッファーの一致を別に照合しました。

一回の観測と、その後の導出を全て保持する

計画は2026-10-26 18:10:39 UTCに固定しました。同じ4配列の来歴を保持し、記録されたPCMと時計系列を使って、24 kHz、全係数1、seed 0で一度だけ解析しました。固定92ファイルと結果22ファイルの全サイズ・SHA、入力、実行境界、三種類のABIを独立に照合しました。

最初の失敗記録256 bytes、段階別観測66,712 bytes、FFT観測16,576 bytesを保持しています。FFTの書込み用・取得用のバッファーは全bytes一致し、正常に解放対象の参照を解除しました。解析自体は状態コード5の拒否で、所有する出力はありません。観測取得は完了し、入力変更・観測エラー・解放処理エラーは記録されていません。

独立した読み手も、生bitsから同じ89点と936点を導きました。ただし、これは外部装置による実行証明ではなく、保存した記録と固定コードの整合確認です。計装によりそれ以前のコード生成や丸めが変わる可能性、外部からの非同期なFPU状態変更がないという前提は残ります。元binaryとの全面的な一致や、残る全録音の原因を証明したとは扱いません。

次は入力を変えず、振幅計算の範囲だけを保つ

候補は、実部・虚部を二乗する前に倍精度へ変換し、二乗和と平方根を計算してからfloatへ戻す局所修正です。有限binary32の非ゼロ入力の二乗は2⁻²⁹⁸以上、二つの二乗和は2²⁵⁷未満なので、binary64では正規の有限範囲へ収まります。尺度調整を使うhypot型の計算にも先例があります。

入力音量、FPU設定、Rdの境界、利得推定を同時に変更しません。NaNを0へ置換する修正でもありません。中間精度を変えることによる通常範囲の丸め差や速度、音質への影響は未測定です。実際の命令列で広い演算が保たれることを確認し、数値修正と品質の採否を分けて進めます。

計画・生データ・一次資料

LibriSpeech test-clean由来の入力です。CC BY 4.0。原16 kHzから24 kHzへ再標本化した解析入力の加工値を含みます。出典・許諾。新規の復号音声はありません。過去のApron24・WORLD16との比較音声は今回の品質結果へ流用しません。