فهرست مقاله
وقتی خروجیِ یک پردازشگرِ صوت را کنار مرجع میگذاریم، باید روشن باشد که تغییرِ بهره را خطا میدانیم یا میخواهیم اثرش را کنار بگذاریم. این دو پرسش، عددِ یکسانی نمیسازند. در این درس، هندسهٔ SI-SDR را روی بردارهای کوتاه و کاملاً ساختگی باز میکنیم: برآورد را به بخشی در راستای مرجع و باقیماندهای عمود بر آن تجزیه میکنیم. هیچ فایلِ صوتی، مدلِ گفتار یا ارزیابیِ شنیداری در کار نیست؛ پاسخِ درستِ محاسبه، شاهدِ کیفیتِ محصول نیست.
۱. دو موجِ همتراز و یک قراردادِ عددیِ محدود

ورودیِ تابع، دو تاپلِ هماندازه با یک تا شش عضو است. هر عضو دقیقاً عددِ صحیحِ پایتون، از منفی هشت تا مثبت هشت است؛ بولی، زیرکلاس، اعشار و تبدیلِ بیصدای رشته پذیرفته نمیشوند. این اعداد، دامنههای نسبیِ بیواحدِ انتخابشده برای حسابِ دستیاند. بازهٔ کوچک، قراردادِ آموزشیِ ماست؛ آن را دامنهٔ مجازِ یک میکروفن، قالبِ PCM یا معیارِ عمومیِ صوت نمینامیم.
جفتشدنِ نمونههای همشماره از بیرون فراهم شده است. تابع فقط برابریِ طول را میسنجد؛ نرخ، مبدأِ زمانی و درستیِ واقعیِ همترازی را نمیداند. نمونهای جابهجا یا حذف نمیشود تا امتیاز بهتر شود. مرجعِ نامناسب را هم نمیتوان با محاسبهٔ دقیق اصلاح کرد. در درسِ SNR مرجعدار، اختلافِ مستقیمِ خروجی و مرجع سنجیده میشد و تغییرِ بهره نیز در خطا سهم داشت؛ اینجا آگاهانه پرسشِ متفاوتی میپرسیم.
میانگین را حذف نمیکنیم و ثابتِ کوچکی به مخرج نمیافزاییم. بنابراین بردارِ مرجعِ ثابت اما ناصفر معتبر است و مؤلفهٔ DC در هندسه حضور دارد. جمعِ مربعِ دامنهها در این متن یک کمیتِ عددی است؛ بدون نرخ، مقیاسِ فیزیکی و تعریفِ اندازهگیری، آن را انرژیِ اندازهگیریشده برحسب ژول یا بلندیِ صدا معرفی نمیکنیم.
۲. تصویرِ عمودیِ برآورد روی مرجع را بسازیم

مرجع را r و برآورد را e بنامیم. اگر جمعِ مربعِ r ناصفر باشد، ضریبِ آلفا برابر ضربِ داخلیِ e و r تقسیم بر جمعِ مربعِ r است. بردارِ هدف از ضربِ آلفا در r ساخته میشود؛ باقیمانده، e منهای همین هدف است. آلفا کمترین جمعِ مربعِ باقیمانده را میانِ تمام ضریبهای اسکالر میدهد؛ هیچ فیلتر یا جابهجاییِ زمانی در این کمینهسازی وجود ندارد.
در مقالهٔ اصلیِ Le Roux و همکاران، بخشهای مقایسه با SNR و تعریفِ معیارِ مستقل از مقیاس، همین تصویرِ عمودی را توضیح میدهند. نسبتِ خطی، جمعِ مربعِ هدف تقسیم بر جمعِ مربعِ باقیمانده است. وقتی هر دو مثبتاند، ده برابرِ لگاریتمِ دهدهیِ نسبت، SI-SDR برحسب دسیبل میشود. نسبتِ کسری میتواند دقیق باشد؛ لگاریتمِ شناورِ نمایشدادهشده تقریب است.
شاهدِ دستیِ ما r برابر یک، دو، منفییک و e برابر دو، یک، صفر است. ضربِ داخلی چهار و جمعِ مربعِ مرجع شش است؛ پس آلفا دوسوم میشود. هدف، دوسوم، چهارسوم، منفیدوسوم است و باقیمانده، چهارسوم، منفییکسوم، دوسوم. جمعِ مربعِ هدف هشتسوم و جمعِ مربعِ باقیمانده هفتسوم است؛ نسبتِ دقیق هشتهفتم به دست میآید.
دو وارسیِ مستقلِ هندسی هم داریم: ضربِ داخلیِ مرجع و باقیمانده صفر میشود و دو جمعِ مربعِ هشتسوم و هفتسوم، مجموعاً پنج میدهند؛ همان جمعِ مربعِ e. این تجزیه، نویزِ فیزیکی را شناسایی نکرده است. باقیمانده فقط مؤلفهای است که در راستای این مرجع قرار نمیگیرد؛ منشأ آن میتواند هر اختلافی در دادهٔ ورودی باشد.
۳. تغییرِ بهره، سکوت و نسبتهای مرزی را جدا کنیم

ضربِ برآورد در ضریبِ ناصفر، هدف و باقیمانده را با همان ضریب تغییر میدهد؛ جمعِ مربعِ هر دو در مربعِ ضریب ضرب میشود و نسبت ثابت میماند. حتی وارونهکردنِ علامت نیز امتیاز را عوض نمیکند. این ویژگی برای برخی پرسشها مفید است، اما اگر دامنه یا قطبیت اهمیت داشته باشد، حذفِ آن اختلاف انتخابِ مناسبی نیست. بزرگبودنِ امتیاز، درستبودنِ بهره را اثبات نمیکند.
اگر مرجع سراسر صفر باشد، راستای تصویر تعریف نمیشود؛ وضعیت silent_reference و مقدارهای تهی میدهیم. برای مرجعِ ناصفر و برآوردِ سراسر صفر، هدف و باقیمانده هر دو صفرند؛ نسبت صفر به صفر تعریف نشده و وضعیت zero_estimate است. کوچککردنِ پیوستهٔ یک برآوردِ ناصفر، جای تعریفِ مقدارِ بردارِ دقیقاً صفر را نمیگیرد؛ حد میتواند به راستای نزدیکشدن وابسته باشد.
اگر برآورد ناصفر و عمود بر مرجع باشد، هدف صفر و باقیمانده مثبت است: نسبتِ خطی صفر و وضعیت zero_projection داریم؛ دسیبلِ متناهی نداریم و حدِ لگاریتم منفیِ بینهایت است. در مقابل، برآوردِ ناصفرِ همراستا، حتی با علامتِ مخالف، باقیماندهٔ صفر دارد. وضعیت perfect_projection با حدِ مثبتِ بینهایت گزارش میشود؛ مقدارِ تهیِ عددی همراهِ وضعیت است، نه صفر دسیبل یا سقفِ پنهان.
افزودنِ ثابت، همان ضربِ بهره نیست. برای مرجعِ یک، منفییک و برآوردِ دو، صفر، نسبت یک است. اگر به هر چهار عدد یک اضافه کنیم، مرجعِ دو، صفر و برآوردِ سه، یک، نسبت نه میدهند. حذفِ میانگین مسئلهٔ دیگری میسازد؛ نباید آن را بیخبر واردِ قرارداد کنیم یا نتیجه را معادلِ پیادهسازیهای دارای epsilon بدانیم.
۴. کدِ دقیق و مرجعِ مستقلِ حاصلضربهای زوجی

کد فقط از کتابخانهٔ استاندارد استفاده میکند. راهنمای Fraction ساختنِ عددِ گویا از صورت و مخرجِ صحیح و ویژگیهای آن را شرح میدهد. آلفا، بردارها، جمعِ مربعها و نسبتِ خطی در این مثال کسریاند؛ تبدیلِ اعشاریِ ورودی نداریم. نسخهٔ واقعیِ پایتون در خروجی ثبت میشود؛ مستنداتِ مرجعِ خواندهشده نسخهٔ ۳٫۱۴٫۸ است و نسخهٔ اجرا از آن استنتاج نشده است.
"""Exact bounded SI-SDR geometry; synthetic aligned vectors, no audio API."""
from decimal import Decimal, localcontext
from fractions import Fraction as F
from itertools import product
import json
import math
import platform
import sys
def validate_pair(reference, estimate):
"""Own strict finite input contract, not an audio library API."""
for name, values in (("reference", reference), ("estimate", estimate)):
if type(values) is not tuple or not 1 <= len(values) <= 6:
raise ValueError(name + " must be an exact tuple of length 1..6")
if any(type(v) is not int or not -8 <= v <= 8 for v in values):
raise ValueError(name + " coordinates must be exact int in [-8,8]")
if len(reference) != len(estimate):
raise ValueError("supplied aligned vectors must have equal lengths")
def si_sdr_projection(reference, estimate):
"""Exact projection/linear ratio and an approximate finite dB display.
Pairing is supplied by the caller. There is no alignment, centering,
epsilon, recording, inference, or perceptual assessment.
"""
validate_pair(reference, estimate)
reference_ss = sum(v * v for v in reference)
estimate_ss = sum(v * v for v in estimate)
result = dict(frame_count=len(reference), reference_square_sum=reference_ss,
estimate_square_sum=estimate_ss, alpha=None, target=None,
residual=None, target_square_sum=None, residual_square_sum=None,
linear_ratio=None, si_sdr_db=None)
if reference_ss == 0:
result["status"] = "silent_reference"
return result
dot = sum(a * b for a, b in zip(reference, estimate))
alpha = F(dot, reference_ss)
target = tuple(alpha * a for a in reference)
residual = tuple(F(b) - a for a, b in zip(target, estimate))
target_ss = sum((v * v for v in target), F(0))
residual_ss = sum((v * v for v in residual), F(0))
if estimate_ss == 0:
status, ratio, db = "zero_estimate", None, None
elif residual_ss == 0:
status, ratio, db = "perfect_projection", None, None
elif target_ss == 0:
status, ratio, db = "zero_projection", F(0), None
else:
ratio = target_ss / residual_ss
# Only the linear ratio is exact. The finite logarithm is approximate.
db = 10 * (math.log10(ratio.numerator) -
math.log10(ratio.denominator))
status = "finite"
result.update(status=status, alpha=alpha, target=target, residual=residual,
target_square_sum=target_ss, residual_square_sum=residual_ss,
linear_ratio=ratio, si_sdr_db=db)
return result
def integer_pair_minor_oracle(reference, estimate):
"""Trusted fixtures only; no main validator/projection/result calls.
Lagrange's identity uses squared pairwise areas rather than a projected
Fraction vector or subtraction of two rounded square sums.
"""
n = len(reference)
rr = sum(reference[i] ** 2 for i in range(n))
ee = sum(estimate[i] ** 2 for i in range(n))
cross = sum(reference[i] * estimate[i] for i in range(n))
areas = sum((reference[i] * estimate[j] -
reference[j] * estimate[i]) ** 2
for i in range(n) for j in range(i + 1, n))
if rr == 0:
return dict(status="silent_reference", target_ss=None,
residual_ss=None, ratio=None, db=None, pair_area_sum=areas)
target_ss, residual_ss = F(cross * cross, rr), F(areas, rr)
if ee == 0:
status, ratio, db = "zero_estimate", None, None
elif areas == 0:
status, ratio, db = "perfect_projection", None, None
elif cross == 0:
status, ratio, db = "zero_projection", F(0), None
else:
ratio = F(cross * cross, areas)
with localcontext() as context:
context.prec = 80
db = float(Decimal(10) * (Decimal(cross * cross).log10() -
Decimal(areas).log10()))
status = "finite"
return dict(status=status, target_ss=target_ss, residual_ss=residual_ss,
ratio=ratio, db=db, pair_area_sum=areas)
def json_value(value):
"""Keep exact rationals as strings, without nonstandard JSON infinities."""
if type(value) is F:
return str(value)
if type(value) is dict:
return {k: json_value(v) for k, v in value.items()}
if type(value) in (tuple, list):
return [json_value(v) for v in value]
return value
def rejected(reference, estimate):
try:
si_sdr_projection(reference, estimate)
except ValueError:
return True
return False
def self_check():
reference, estimate = (1, 2, -1), (2, 1, 0)
hand = si_sdr_projection(reference, estimate)
checks = {}
checks["hand_exact_fraction_projection_and_ratio_eight_sevenths"] = (
hand["status"] == "finite" and hand["alpha"] == F(2, 3) and
hand["target"] == (F(2, 3), F(4, 3), F(-2, 3)) and
hand["residual"] == (F(4, 3), F(-1, 3), F(2, 3)) and
hand["target_square_sum"] == F(8, 3) and
hand["residual_square_sum"] == F(7, 3) and
hand["linear_ratio"] == F(8, 7))
geometric_fixtures = ((reference, estimate), ((1, 1), (1, -1)),
((1, 2), (-2, -4)), ((2, 2, 2), (1, 2, 3)))
orthogonal = True
for r, e in geometric_fixtures:
value = si_sdr_projection(r, e)
orthogonal = orthogonal and (
sum((F(a) * b for a, b in zip(r, value["residual"])), F(0)) == 0 and
value["target_square_sum"] + value["residual_square_sum"] ==
value["estimate_square_sum"] and
tuple(a + b for a, b in zip(value["target"], value["residual"])) ==
tuple(F(v) for v in e))
checks["orthogonal_residual_reconstruction_and_Pythagorean_identity"] = orthogonal
oracle_ok, cases, profiles, largest_db_error = True, 0, 0, 0.0
statuses = {}
for n in range(1, 4):
vectors = tuple(product((-1, 0, 1), repeat=n))
profiles += len(vectors)
for r in vectors:
for e in vectors:
actual = si_sdr_projection(r, e)
expected = integer_pair_minor_oracle(r, e)
same = (actual["status"] == expected["status"] and
actual["target_square_sum"] == expected["target_ss"] and
actual["residual_square_sum"] == expected["residual_ss"] and
actual["linear_ratio"] == expected["ratio"])
if expected["db"] is None:
same = same and actual["si_sdr_db"] is None
else:
error = abs(actual["si_sdr_db"] - expected["db"])
largest_db_error = max(largest_db_error, error)
same = same and error <= 1e-12
oracle_ok = oracle_ok and same
statuses[expected["status"]] = statuses.get(expected["status"], 0) + 1
cases += 1
checks["finite_819_pairs_match_integer_pair_minor_oracle_in_ONE_group"] = (
oracle_ok and cases == 819 and profiles == 39)
gains = (-2, -1, 1, 2)
estimate_gain_ok = True
for gain in gains:
value = si_sdr_projection(reference, tuple(gain * v for v in estimate))
estimate_gain_ok = estimate_gain_ok and (
value["linear_ratio"] == hand["linear_ratio"] and
value["alpha"] == gain * hand["alpha"] and
value["target"] == tuple(gain * v for v in hand["target"]) and
value["residual"] == tuple(gain * v for v in hand["residual"]) and
math.isclose(value["si_sdr_db"], hand["si_sdr_db"],
rel_tol=0, abs_tol=1e-12))
checks["nonzero_estimate_gain_including_polarity_preserves_ratio"] = estimate_gain_ok
reference_gain_ok = True
for gain in gains:
value = si_sdr_projection(tuple(gain * v for v in reference), estimate)
reference_gain_ok = reference_gain_ok and (
value["alpha"] == hand["alpha"] / gain and
value["target"] == hand["target"] and
value["residual"] == hand["residual"] and
value["linear_ratio"] == hand["linear_ratio"])
checks["reference_gain_cancels_in_projected_waveform"] = reference_gain_ok
constant = si_sdr_projection((2, 2, 2), (1, 2, 3))
checks["constant_reference_allowed_without_implicit_centering"] = (
constant["alpha"] == 1 and constant["target"] == (F(2), F(2), F(2)) and
constant["residual"] == (F(-1), F(0), F(1)) and
constant["linear_ratio"] == 6)
silence = [si_sdr_projection((0, 0), e) for e in ((0, 0), (1, -1))]
checks["zero_reference_and_both_zero_explicitly_undefined"] = all(
value["status"] == "silent_reference" and value["alpha"] is None and
value["target"] is value["residual"] is value["linear_ratio"] is None and
value["si_sdr_db"] is None for value in silence)
zero_estimate = si_sdr_projection(reference, (0, 0, 0))
checks["zero_estimate_has_zero_over_zero_not_fake_zero_dB"] = (
zero_estimate["status"] == "zero_estimate" and
zero_estimate["target_square_sum"] == zero_estimate["residual_square_sum"] == 0 and
zero_estimate["alpha"] == 0 and zero_estimate["linear_ratio"] is None and
zero_estimate["si_sdr_db"] is None)
perpendicular = si_sdr_projection((1, 1), (1, -1))
checks["nonzero_orthogonal_estimate_has_zero_linear_ratio"] = (
perpendicular["status"] == "zero_projection" and
perpendicular["linear_ratio"] == 0 and
perpendicular["target_square_sum"] == 0 and
perpendicular["residual_square_sum"] == 2 and
perpendicular["si_sdr_db"] is None)
perfect = [si_sdr_projection((1, 2), e) for e in ((2, 4), (-2, -4))]
checks["nonzero_collinear_gain_or_polarity_has_zero_residual"] = all(
value["status"] == "perfect_projection" and
value["target_square_sum"] == 20 and value["residual_square_sum"] == 0 and
value["linear_ratio"] is None and value["si_sdr_db"] is None
for value in perfect)
before_offset = si_sdr_projection((1, -1), (2, 0))
after_offset = si_sdr_projection((2, 0), (3, 1))
checks["common_DC_offset_is_not_gain_invariance"] = (
before_offset["linear_ratio"] == 1 and after_offset["linear_ratio"] == 9)
order = (2, 0, 1)
joint = si_sdr_projection(tuple(reference[i] for i in order),
tuple(estimate[i] for i in order))
shifted = si_sdr_projection(reference, estimate[1:] + estimate[:1])
checks["joint_permutation_preserves_but_unmatched_shift_changes_ratio"] = (
joint["linear_ratio"] == hand["linear_ratio"] and
joint["target_square_sum"] == hand["target_square_sum"] and
joint["residual_square_sum"] == hand["residual_square_sum"] and
shifted["linear_ratio"] == F(1, 29))
class IntSubclass(int):
pass
class TupleSubclass(tuple):
pass
invalid_vectors = (None, [], (), (0,) * 7, "0", (True,), (False,), (0.0,),
(F(1),), ("1",), (None,), (float("nan"),),
(float("inf"),), (9,), (-9,), (10 ** 100,),
(IntSubclass(1),), TupleSubclass((1,)))
invalid_pairs = [(bad, (0,)) for bad in invalid_vectors]
invalid_pairs += [((0,), bad) for bad in invalid_vectors]
invalid_pairs += [((1,), (1, 2)), ((1, 2), (1,)),
((0, 0), (0, "late")), ((0, "late"), (0, 0))]
pulled = []
def untouched_generator():
pulled.append("pulled")
yield 0
generator = untouched_generator()
invalid_ok = all(rejected(r, e) for r, e in invalid_pairs)
invalid_ok = invalid_ok and rejected(generator, (0,)) and not pulled
generator.close()
checks["strict_types_lengths_bounds_late_invalid_and_no_generator_consumption"] = (
invalid_ok and len(invalid_pairs) == 40)
edge_r, edge_e = (-8, 8, -8, 8, -8, 8), (8, 8, -8, -8, 8, -8)
edge = si_sdr_projection(edge_r, edge_e)
saved = dict(edge)
edge["status"], edge["target"] = "caller_changed", ("caller_changed",)
fresh = si_sdr_projection(edge_r, edge_e)
encoded = json_value(fresh)
checks["closed_six_sample_bounds_fresh_results_and_strict_JSON"] = (
fresh == saved and fresh["alpha"] == F(-1, 3) and
fresh["target_square_sum"] == F(128, 3) and
fresh["residual_square_sum"] == F(1024, 3) and
fresh["linear_ratio"] == F(1, 8) and
edge_r == (-8, 8, -8, 8, -8, 8) and
edge_e == (8, 8, -8, -8, 8, -8) and
json.loads(json.dumps(encoded, allow_nan=False)) == encoded)
assert len(checks) == 14 and all(type(v) is bool for v in checks.values()), checks
assert all(checks.values()), checks
return dict(
python=platform.python_version(), implementation=platform.python_implementation(),
dependencies="standard library only; no NumPy, TorchMetrics or audio execution",
data_origin="original supplied synthetic aligned dimensionless integer vectors",
input_contract="exact tuple1..6, builtin int[-8,8], equal lengths, no centering/epsilon",
exact_quantities="Fraction alpha, projected/residual vectors, square sums and linear ratio",
approximate_quantity="finite si_sdr_db only; exact ratios are not exact logarithms",
manual_reference=reference, manual_estimate=estimate, manual_result=hand,
zero_reference_results=silence, zero_estimate_result=zero_estimate,
orthogonal_result=perpendicular, gain_only_results=perfect,
common_offset_results=[before_offset, after_offset],
unmatched_cyclic_shift_result=shifted, six_sample_boundary_result=fresh,
oracle_vector_profiles_inside_ONE_family=profiles,
oracle_pair_cases_inside_ONE_group=cases,
oracle_status_counts=statuses, oracle_decimal_precision=80,
largest_oracle_finite_db_absolute_difference=largest_db_error,
oracle_finite_db_absolute_tolerance=1e-12,
strict_invalid_pairs_inside_ONE_group=len(invalid_pairs) + 1,
unique_executed_checks=len(checks), author_check_groups=len(checks),
checks=checks, all_passed=all(checks.values()),
limitations="No measured audio, perceptual/ASR/product evaluation, alignment guarantee or performance claim.")
if __name__ == "__main__":
payload = json.dumps(json_value(self_check()), ensure_ascii=True,
indent=2, allow_nan=False) + "\n"
sys.stdout.buffer.write(payload.encode("utf-8"))
مرجعِ مستقل، بردارِ تصویر را نمیسازد. برای هر جفتِ شاخصِ i و j، تفاضلِ دو حاصلضربِ متقاطعِ مرجع و برآورد را مربع میکند و جمع میزند. طبقِ اتحادِ لاگرانژ، این جمع برابر حاصلضربِ دو جمعِ مربع، منهای مربعِ ضربِ داخلی است. بنابراین مربعِ ضربِ داخلی تقسیم بر این جمع، همان نسبتِ خطی را میدهد. این مسیر از محاسباتِ صحیحِ زوجی استفاده میکند و تابعِ اصلی یا اعتبارسنجش را برای ساختنِ انتظار صدا نمیزند.
همهٔ جفتبردارهای همطولِ یک تا سه روی اعدادِ منفییک، صفر و یک، هشتصدونوزده مورد میسازند؛ تمامِ این خانواده فقط یک گروه از چهارده گروه است. برای حالتِ متناهی، لگاریتمِ مرجع با Decimal و دقتِ هشتاد رقم محاسبه میشود؛ تلورانسِ یکتریلیونیم دسیبل، حدِ مقایسهٔ همین محاسباتِ کوچک است. این عدد آستانهٔ کیفیتِ صوت نیست.
{
"python": "3.14.5",
"implementation": "CPython",
"dependencies": "standard library only; no NumPy, TorchMetrics or audio execution",
"data_origin": "original supplied synthetic aligned dimensionless integer vectors",
"input_contract": "exact tuple1..6, builtin int[-8,8], equal lengths, no centering/epsilon",
"exact_quantities": "Fraction alpha, projected/residual vectors, square sums and linear ratio",
"approximate_quantity": "finite si_sdr_db only; exact ratios are not exact logarithms",
"manual_reference": [
1,
2,
-1
],
"manual_estimate": [
2,
1,
0
],
"manual_result": {
"frame_count": 3,
"reference_square_sum": 6,
"estimate_square_sum": 5,
"alpha": "2/3",
"target": [
"2/3",
"4/3",
"-2/3"
],
"residual": [
"4/3",
"-1/3",
"2/3"
],
"target_square_sum": "8/3",
"residual_square_sum": "7/3",
"linear_ratio": "8/7",
"si_sdr_db": 0.5799194697768673,
"status": "finite"
},
"zero_reference_results": [
{
"frame_count": 2,
"reference_square_sum": 0,
"estimate_square_sum": 0,
"alpha": null,
"target": null,
"residual": null,
"target_square_sum": null,
"residual_square_sum": null,
"linear_ratio": null,
"si_sdr_db": null,
"status": "silent_reference"
},
{
"frame_count": 2,
"reference_square_sum": 0,
"estimate_square_sum": 2,
"alpha": null,
"target": null,
"residual": null,
"target_square_sum": null,
"residual_square_sum": null,
"linear_ratio": null,
"si_sdr_db": null,
"status": "silent_reference"
}
],
"zero_estimate_result": {
"frame_count": 3,
"reference_square_sum": 6,
"estimate_square_sum": 0,
"alpha": "0",
"target": [
"0",
"0",
"0"
],
"residual": [
"0",
"0",
"0"
],
"target_square_sum": "0",
"residual_square_sum": "0",
"linear_ratio": null,
"si_sdr_db": null,
"status": "zero_estimate"
},
"orthogonal_result": {
"frame_count": 2,
"reference_square_sum": 2,
"estimate_square_sum": 2,
"alpha": "0",
"target": [
"0",
"0"
],
"residual": [
"1",
"-1"
],
"target_square_sum": "0",
"residual_square_sum": "2",
"linear_ratio": "0",
"si_sdr_db": null,
"status": "zero_projection"
},
"gain_only_results": [
{
"frame_count": 2,
"reference_square_sum": 5,
"estimate_square_sum": 20,
"alpha": "2",
"target": [
"2",
"4"
],
"residual": [
"0",
"0"
],
"target_square_sum": "20",
"residual_square_sum": "0",
"linear_ratio": null,
"si_sdr_db": null,
"status": "perfect_projection"
},
{
"frame_count": 2,
"reference_square_sum": 5,
"estimate_square_sum": 20,
"alpha": "-2",
"target": [
"-2",
"-4"
],
"residual": [
"0",
"0"
],
"target_square_sum": "20",
"residual_square_sum": "0",
"linear_ratio": null,
"si_sdr_db": null,
"status": "perfect_projection"
}
],
"common_offset_results": [
{
"frame_count": 2,
"reference_square_sum": 2,
"estimate_square_sum": 4,
"alpha": "1",
"target": [
"1",
"-1"
],
"residual": [
"1",
"1"
],
"target_square_sum": "2",
"residual_square_sum": "2",
"linear_ratio": "1",
"si_sdr_db": 0.0,
"status": "finite"
},
{
"frame_count": 2,
"reference_square_sum": 4,
"estimate_square_sum": 10,
"alpha": "3/2",
"target": [
"3",
"0"
],
"residual": [
"0",
"1"
],
"target_square_sum": "9",
"residual_square_sum": "1",
"linear_ratio": "9",
"si_sdr_db": 9.542425094393248,
"status": "finite"
}
],
"unmatched_cyclic_shift_result": {
"frame_count": 3,
"reference_square_sum": 6,
"estimate_square_sum": 5,
"alpha": "-1/6",
"target": [
"-1/6",
"-1/3",
"1/6"
],
"residual": [
"7/6",
"1/3",
"11/6"
],
"target_square_sum": "1/6",
"residual_square_sum": "29/6",
"linear_ratio": "1/29",
"si_sdr_db": -14.62397997898956,
"status": "finite"
},
"six_sample_boundary_result": {
"frame_count": 6,
"reference_square_sum": 384,
"estimate_square_sum": 384,
"alpha": "-1/3",
"target": [
"8/3",
"-8/3",
"8/3",
"-8/3",
"8/3",
"-8/3"
],
"residual": [
"16/3",
"32/3",
"-32/3",
"-16/3",
"16/3",
"-16/3"
],
"target_square_sum": "128/3",
"residual_square_sum": "1024/3",
"linear_ratio": "1/8",
"si_sdr_db": -9.030899869919436,
"status": "finite"
},
"oracle_vector_profiles_inside_ONE_family": 39,
"oracle_pair_cases_inside_ONE_group": 819,
"oracle_status_counts": {
"perfect_projection": 72,
"zero_estimate": 36,
"silent_reference": 39,
"finite": 464,
"zero_projection": 208
},
"oracle_decimal_precision": 80,
"largest_oracle_finite_db_absolute_difference": 0.0,
"oracle_finite_db_absolute_tolerance": 1e-12,
"strict_invalid_pairs_inside_ONE_group": 41,
"unique_executed_checks": 14,
"author_check_groups": 14,
"checks": {
"hand_exact_fraction_projection_and_ratio_eight_sevenths": true,
"orthogonal_residual_reconstruction_and_Pythagorean_identity": true,
"finite_819_pairs_match_integer_pair_minor_oracle_in_ONE_group": true,
"nonzero_estimate_gain_including_polarity_preserves_ratio": true,
"reference_gain_cancels_in_projected_waveform": true,
"constant_reference_allowed_without_implicit_centering": true,
"zero_reference_and_both_zero_explicitly_undefined": true,
"zero_estimate_has_zero_over_zero_not_fake_zero_dB": true,
"nonzero_orthogonal_estimate_has_zero_linear_ratio": true,
"nonzero_collinear_gain_or_polarity_has_zero_residual": true,
"common_DC_offset_is_not_gain_invariance": true,
"joint_permutation_preserves_but_unmatched_shift_changes_ratio": true,
"strict_types_lengths_bounds_late_invalid_and_no_generator_consumption": true,
"closed_six_sample_bounds_fresh_results_and_strict_JSON": true
},
"all_passed": true,
"limitations": "No measured audio, perceptual/ASR/product evaluation, alignment guarantee or performance claim."
}
گروههای دیگر، شاهدِ دستی، عمودبودن، بازسازی، بهره، مرزهای صفر، جابهجایی، ورودیِ نامعتبر و کرانِ ششنمونهای را میسنجند. تمامِ ورودی پیش از کوتاهکردنِ مسیرِ حالتِ صفر اعتبارسنجی میشود؛ یک عضوِ نامعتبرِ انتهایی پنهان نمیماند. مولد بدون مصرف رد میشود و تغییرِ نگاشتِ بازگشتی توسطِ فراخواننده، نتیجهٔ فراخوانیِ بعدی را تغییر نمیدهد. بررسیها ادعای سرعت یا پوششِ همهٔ موجهای ممکن نیستند.
۵. چهار پرسش دربارهٔ تفسیرِ SI-SDR

پرسش اول: چرا نسبتِ شاهدِ دستی هشتهفتم است؟ پاسخ: ضریبِ چهار تقسیم بر شش، هدفِ کسریِ مشخص را میسازد. جمعِ مربعِ آن هشتسوم و باقیمانده هفتسوم است؛ تقسیمِ آنها هشتهفتم میشود. پنج، جمعِ مربعِ کلِ برآورد است و نباید بهجای صورتِ نسبت گذاشته شود.
پرسش دوم: آیا نصفکردن یا منفیکردنِ برآورد امتیاز را خراب میکند؟ پاسخ: در این قرارداد، ضریبِ ناصفر بر نسبت اثر ندارد؛ تصویر و باقیمانده با هم مقیاس میگیرند. برای برآوردِ همراستای ناصفر، باقیمانده همچنان صفر است. این رفتار با خطای مستقیمِ SNR تفاوت دارد و معیارِ کنترلِ بهره یا قطبیت نیست.
پرسش سوم: آیا خروجیِ صفر همیشه صفر دسیبل دارد؟ پاسخ: خیر؛ برای برآوردِ سراسر صفر، نسبتِ صفر به صفر داریم. برای برآوردِ عمودِ ناصفر، نسبت صفر و حدِ لگاریتم منفیِ بینهایت است. برای تصویرِ کاملِ ناصفر، مخرج صفر و حد مثبتِ بینهایت است. وضعیتها مانعِ یکسانخواندنِ این سه معنا میشوند.
پرسش چهارم: آیا عددِ بهتر یعنی پاسخِ تلفنی قابلفهمتر است؟ پاسخ: خیر؛ حتی همترازیِ نمونهها فرضِ ورودی است. درسِ DTW قراردادِ دیگری برای تطبیقِ قابها داشت؛ این تابع آن مسیر را نمییابد. شنیدن، صحتِ محتوای پاسخ و ارزیابیِ ASR شاهدهای جدا میخواهند. منابع در ۲۹ مهر ۱۴۰۵ خوانده شدند؛ تاریخِ گزارشِ MERL بیستونهم مارسِ ۲۰۱۹ است، تاریخِ نخستین انتشارِ صفحاتِ نامعلوم تهی میماند و این متن خبرِ تازه نیست.
منابع و مطالعهٔ بیشتر
بررسی منابع: ۲۹ مهر ۱۴۰۵. تحلیلها و پیشنهادهای اجرایی، جمعبندی نویسندهاند.

