Sonir/機能と計算方法

何を、どう測っているか。

FEATURES & MATH

Sonirの測定画面に出るグラフをそのまま並べ、それぞれが何を測り、どう計算しているかを解説します。指標の定義式と算出手順は、公開できる範囲をすべて開きました。ブラックボックスにしないことが、計測ツールの信頼だと考えています。

A

測定

MEASURE

内蔵マイクですぐ測れる基本計測。ここは全部無料で開いています。

72.3 dB SPL · A · FAST

measure › SPL — viz/spl_arc.dartの270° 円弧ゲージ

SPL(音圧レベル)

無料
音の大きさをdBで表示します。重み付けはA / C / Z(フラット)、時間重みはFast(125ms) / Slow(1s) / Impulse(35ms) に対応。Leq・ピーク・最小も同時に出します。校正前はdBFS、校正ファイルを読むとdB SPLに昇格します。
計算方法をひらく
Lp Lp = 20·log10(p/p0),   p0 = 20 µPa
手順: 入力波形を時間窓でRMS(二乗平均平方根)し、上式でdB化。A/C/Z重みはIEC 61672-1のアナログ極を双一次変換したbiquadカスケードで実装(spl.rs)。時間重みは指数移動平均の時定数(Fast/Slow/Impulse)で平滑化します。dB SPLへの換算は校正オフセットoffset_dbを足すだけ ── 校正していない端末で誇張した絶対値を出さないため、未校正時はdBFSのまま表示します。
201001k10k20k

measure › RTA — viz/fft_bars.dart(1/12 octビン)

RTA / FFTスペクトラム

無料
周波数ごとのエネルギーをリアルタイム表示。窓関数はHann(既定)/ Hamming / Blackman、バンド分解は1/3・1/6・1/12オクターブを切替できます。低域はアクセント、高域は暗めに色分けして読みやすくしています。
計算方法をひらく
X(k) X(k) = Σn=0N−1 w(n)·x(n)·e−j2πkn/N    20·log10|X(k)|
手順: 入力ブロック(リアルタイム1024〜4096点)に窓w(n) を掛けて 実数FFT(realfft)。各binの振幅をdB化し、オクターブ分数バンドへエネルギー集約してバー表示します。窓は分解能(狭いメインローブ)と漏れ(低いサイドローブ)のトレードオフ ── 既定のHannは両者のバランス型です。IR解析時は65536点以上の長尺FFTを使います。
0-20-40-60 直接音
0ms150300450ms

measure › FR — ETC(エネルギー時間特性)。縦線=直接音、以降が反射・残響

スイープ → インパルス応答 → 室内音響指標

無料
対数スイープ(Farina ESS)を再生・録音し、逆フィルタ畳み込みで部屋のインパルス応答(IR)を取得。そこからRT60 / EDT / C50 / D50 / 周波数特性 / ETCを一括で算出します。全帯域(既定20Hz–20kHz)のブロードバンド解析まで無料です。
計算方法をひらく
ESS x(t) = sin( 2π·f1·T/ln R · [ Rt/T − 1 ] ),   R = f2/f1
Schroeder L(t) = 10·log10( ∫t h2(τ) dτ  /  ∫0 h2(τ) dτ )
C50 C50 = 10·log10( ∫050ms h2 dt  /  ∫50ms h2 dt )    D50 = ∫050ms h2 dt /0 h2 dt
IRの取得: Farina法の対数スイープを生成 → 再生と録音を同期 → 録音と参照chirpのFFT相互相関でレイテンシを補正 → 逆フィルタ(時間反転 + 振幅補正)を畳み込んでIRを切り出します(ir.rs)。上のグラフはそのIRのETC(エネルギー時間特性)で、直接音と反射・残響の時間構造を表します。
RT60: IRを後ろ向きに二乗積分したSchroeder減衰曲線に、ノイズ尾を打ち切ったうえで直線回帰。−5dB〜−35dB(T30)または −5〜−25dB(T20)の傾きを60dBぶんへ外挿します。EDTは0〜−10dBの傾き×6。
C50 / D50: ピーク起点・打ち切り内で50ms前後のエネルギー比をとります(明瞭度 / 明瞭度比)。SNRや回帰のr² が足りない帯域は信頼度フラグで警告します。
0 t↓
201001k10k20k

measure › FR — CSDヒートマップ(X=周波数 / Y=時間↓ / 色=dB)

ウォーターフォール(CSD)/ ETC

無料
同じIRを時間方向にスライスして「どの周波数の残響が、いつまで残るか」を見せます(累積スペクトル減衰 / CSD)。横軸=周波数、縦軸=時間(上が0、下へ進むほど経過)、色がエネルギー(dB)。低域モードや箱鳴りの居座りが一目で分かります。
計算方法をひらく
CSD S(f, tk) = | FFT[ h(τ)·w(τ − tk) ] |  ,  tk = k·Δt
手順: IRに時間窓wを少しずつ後ろへずらして掛け、その都度FFT(短時間FFT)。各時刻のスペクトルを奥行き方向に積み重ねて描画します。窓を進めるほど早く減衰した成分が消え、居残る帯域(定在波・箱鳴り)だけが奥まで尾を引きます。ETCはIR包絡線 |h(t)| をdB表示したもので、初期反射の到来時刻を読むのに使います。
B

録音と比較

RECORD & COMPARE

録音物を「同じ条件」に揃えて比べる、Sonirのコア。

201001k10k20k
Rec A · 内蔵マイク Rec B · UMIK-2校正済

compare — 2本の周波数特性を0dB基準で重ね描き

比較 + スペクトラム重ね

Pro
2本の録音を レベル整合して瞬時に切替、スペクトラムを重ねて差を可視化します。音量差という最大の錯覚要因を消してから比べるのが肝。機材プロファイル・部屋タグ・校正ファイルのメタを揃えて、後からでも「同じ条件」で並べられます。
計算方法をひらく
level g = RMSref / RMSx    x′(n) = g·x(n)
手順: 各録音のRMSを基準へ合わせるゲインgを求めて整合(等ラウドネスの錯覚で「大きい方が良い音」に聞こえる問題を排除)。切替は 等パワーのランプでクロスフェードし、ブツ切れのクリックを避けます。スペクトラムは同じ1/12 octビンで重ね、Aを青・Bをオレンジで差分を見せます。
87 OVERALL
クリッピング 98
ノイズフロア 86
ダイナミックレンジ 74
周波数バランス 90

record › スコア — ScoreRing(円リング)+ 4軸の内訳

録音スコア

無料
録音1本を クリッピング・ノイズフロア・ダイナミックレンジ・周波数バランスの4軸で採点し、0–100点に集約します。SNSにそのまま出せる比較カードを生成。各軸の閾値は公開しており、重みは設定で変えられます。
計算方法をひらく
score Score = Σi wi·si,   si = clamp( 各軸を0–100に線形写像 )
4軸の定義(score.rs、閾値は調整可):
  • クリッピング: 0 dBFS張り付きサンプル比。0% で100点、1% で0点。
  • ノイズフロア: 無音区間のA特性RMS。−70dBFSで100、−30dBFSで0。
  • ダイナミックレンジ: DR Database方式(ピーク − 上位20% のRMS)。14dBで100、4dBで0。
  • 周波数バランス: 1/3 octバンドの線形fitからのRMS偏差。3dBで100、12dBで0(ジャンルの傾きはfitが吸収)。
重みwiは既定で等分(0.25 × 4)、設定ページで変更できます。
0-30-60-90-120
実効帯域38kHz
201001k10k40k

inspect — max-holdスペクトル + 実効帯域マーカー

ファイル鑑定(偽ハイレゾ / lossy検出)

無料
音源ファイル単体を解析します(マイク・部屋・スピーカー非依存)。本質は 「申告(コンテナの サンプルレート)と実態(PCMスペクトルのカットオフ)の矛盾」。実効帯域が申告ナイキストを大きく下回れば偽ハイレゾ疑い、標準fsで急峻な壁があればlossy由来疑いです。
計算方法をひらく
帯域 feff = max f  s.t.  Smaxhold(f) ≥ Speak − 60dB
手順(inspect.rs): ネイティブがファイルをネイティブfsの一時WAVにデコードし、Rustが ストリーム読み(大きなPCMを境界に載せない)。Hann窓50% overlapで各binの最大をとるmax-holdスペクトルを作ります(シンバル等の瞬間HFを平均で潰さないため)。ピークから −60dBを「床」とし、それを超える最高周波数を実効帯域feffに。
  • 偽ハイレゾ: 48k超の申告なのにfeffがCD帯域(〜26kHz)止まり → アップサンプル疑い。
  • lossy由来: feff/ナイキスト比が高く、16〜20kHzに ≥48dB/octの急峻なブリックウォール。
閾値は実機サンプルで較正中の暫定値です。
C

仕上げと書き出し

FINISH & EXPORT

測った結果を環境に反映し、共有する。

+60-6
2050100200300Hz
測定 ターゲット 補正後

measure › FR/EQ — 測定vsターゲット + 補正後カーブ

ルームEQ / 自動PEQ

Pro
校正済みの測定とターゲット曲線を重ね、その差を最小化する パラメトリックEQを自動提案します。主戦場はモードが暴れる低域(既定20–300Hz)。測定とPEQプレビューは無料REW / EqualizerAPO形式での書き出しがProです。校正済み測定を前提とするハードゲートつき。
計算方法をひらく
error error(f) = measured(f) − target(f)    min Σ |error(f)|2
peaking H(s) = ( s2 + s·(A/Q)·ω0 + ω02 ) / ( s2 + s·(1/(A·Q))·ω0 + ω02 )
手順(roomeq.rs): 残差error(f) が一番大きいところにpeaking biquadを1本ずつ置いていく 貪欲法(matching pursuit)。biquad係数はRBJ Audio EQ Cookbookのpeaking EQをそのまま実装。ブーストよりカットを優先し、最大ブースト/カットを別々にクランプしてヘッドルームを守り、余分なブースト分を打ち消す負のプリアンプを自動算出します。補正の主戦場はSchroeder周波数以下のモーダル域に限定。上のグラフの緑が補正後の予測カーブです。

透明性について

ここに載せた数式・手順は、アプリのDSPコア(Rust)の実装そのものに対応します。閾値の一部は実機サンプルで較正中の暫定値で、確定したら更新します。測定はサーバを介さず端末内で完結し、録音・IR・校正ファイルが外部に送られることはありません。

CLOSING

使ってみる準備はできています。

リリースは準備中です。最初の測定から再現性を。

iOS / Android:近日公開