图片中是HIBY Project Ace的频响曲线,结合频响曲线的走向,与互联网风评,分析HIBY ...
Создано: 10 февраля 2026 г.
Отвечено с использованием GPT-5.2 Thinking от Chat01
Создано: 10 февраля 2026 г.
Отвечено с использованием GPT-5.2 Thinking от Chat01
pythonfrom PIL import Image, ImageEnhance img = Image.open('/mnt/data/image.png') img.size (1858, 946)
pythonimport matplotlib.pyplot as plt, numpy as np arr=np.array(img) arr.shape, arr.mean() ((946, 1858, 3), 7.2501816801200984)
pythonimport numpy as np arr=np.array(img).astype(np.int16) b=arr[:,:,2]; g=arr[:,:,1]; r=arr[:,:,0] mask=(b>120) & (b-g>40) & (b-r>40) mask.sum(), mask.shape (16459, (946, 1858))
python# get coordinates of curve ys, xs = np.where(mask) xs.min(), xs.max(), ys.min(), ys.max() (213, 1800, 116, 455)
pythonimport matplotlib.pyplot as plt plt.figure(figsize=(10,4)) plt.imshow(mask, cmap='gray') plt.axis('off') plt.show()
pythongray = arr.mean(axis=2) # detect grid lines and text: pixels brighter than 30 mask2 = gray>25 ys2, xs2 = np.where(mask2) ys2.min(), ys2.max(), xs2.min(), xs2.max(), mask2.sum() (23, 932, 53, 1827, 192256)
pythonrow_counts = mask2.sum(axis=1) col_counts = mask2.sum(axis=0) # find y where row_counts>500 maybe y_indices=np.where(row_counts>200)[0] y_indices.min(), y_indices.max(), len(y_indices) (35, 813, 130)
pythonx_indices=np.where(col_counts>200)[0] x_indices.min(), x_indices.max(), len(x_indices) (127, 1644, 128)
pythonx_indices=np.where(col_counts>80)[0] x_indices.min(), x_indices.max(), len(x_indices) (62, 1799, 371)
pythonx0_plot=200; x1_plot=1800 sub=mask2[:,x0_plot:x1_plot] row_counts_sub=sub.sum(axis=1) # find peaks rows with highest counts peak_rows=row_counts_sub.argsort()[-20:][::-1] peak_rows[:10], row_counts_sub[peak_rows[:10]] (array([149, 147, 811, 148, 591, 259, 538, 539, 540, 36]), array([1590, 1590, 1590, 1590, 1589, 1589, 1589, 1589, 1589, 1589]))
python# pick rows with count>1500 rows=np.where(row_counts_sub>1500)[0] rows[:20], rows[-20:], len(rows) (array([ 35, 36, 91, 92, 93, 147, 148, 149, 202, 203, 204, 259, 260, 261, 312, 313, 314, 368, 369, 370]), array([480, 481, 538, 539, 540, 591, 592, 593, 646, 647, 648, 701, 702, 703, 759, 760, 761, 811, 812, 813]), 46)
pythonrows = rows.tolist() clusters=[] cur=[rows[0]] for r in rows[1:]: if r==cur[-1]+1: cur.append(r) else: clusters.append(cur) cur=[r] clusters.append(cur) centers=[int(np.mean(c)) for c in clusters] centers, len(centers) ([35, 92, 148, 203, 260, 313, 369, 426, 479, 539, 592, 647, 702, 760, 812], 15)
pythonx0=213; x1=1800 # for each x in range, find y mean curve_y=[] curve_x=[] for x in range(x0,x1+1): ys = np.where(mask[:,x])[0] if len(ys)>0: curve_x.append(x) curve_y.append(np.median(ys)) curve_x=np.array(curve_x); curve_y=np.array(curve_y) # map to freq and dB import numpy as np, math logf0=math.log10(20); logf1=math.log10(20000) freq=10**(logf0 + (curve_x-x0)/(x1-x0)*(logf1-logf0)) dB = 130 - (curve_y-35)/(812-35)*70 freq[:5], dB[:5], freq[-5:], dB[-5:] (array([20. , 20.08724399, 20.17486856, 20.26287537, 20.35126607]), array([119.5045045 , 119.45945946, 119.5045045 , 119.5045045 , 119.5045045 ]), array([19654.79683351, 19740.53498148, 19826.64713637, 19913.13492968, 20000. ]), array([97.11711712, 97.07207207, 97.02702703, 96.98198198, 97.02702703]))
python# get dB at ~1k idx=np.argmin(np.abs(freq-1000)) freq[idx], dB[idx] (1001.0664070174108, 115.45045045045045)
pythonpoints=[20,50,100,200,500,1000,2000,3000,5000,8000,10000,12000,15000,20000] vals={} for p in points: i=np.argmin(np.abs(freq-p)) vals[p]=(freq[i], dB[i]) vals {20: (20.000000000000004, 119.50450450450451), 50: (50.106697562937406, 119.41441441441441), 100: (100.10664070174107, 117.56756756756756), 200: (200.00000000000003, 115.4054054054054), 500: (501.06697562937416, 114.0990990990991), 1000: (1001.0664070174108, 115.45045045045045), 2000: (2000.0000000000005, 119.14414414414415), 3000: (2998.0122172076926, 117.74774774774775), 5000: (5010.669756293741, 121.48648648648648), 8000: (7982.9647423395445, 117.11711711711712), 10000: (10010.664070174107, 116.12612612612612), 12000: (12018.713232041491, 110.45045045045045), 15000: (15006.04659237203, 92.56756756756756), 20000: (20000.000000000004, 97.02702702702703)}
下面按**“频响走向 → 听感推断”再用网上风评去交叉验证,给你一个相对稳的“声音画像”(说明:你这张图看起来更像未补偿/原始幅度**的频响,绝对 dB 值意义不大,主要看相对起伏与峰谷位置)。
这点和不少评测里提到的“低频更偏准确、冲击不夸张”一致:例如 Mobileaudiophile 说它的低频“tight and precise… favoring accuracy over impact”。 (Mobileaudiophile)
Headfonia 也直说“sub-bass notably lacking… mid-bass is decent”,并认为低频整体偏克制。 (Headfonia)
Headfonia评价它“very good vocal performance and a smooth mid-range”,但也提到整体偏线性、低频不足会让中频的“fullness”欠一点。 (Headfonia)
B站这篇(耳边评测)同样强调它“干净、通透、女声拿捏很准”,但提到男声有时会“少一点松弛、略紧”。 (Bilibili)
Mobileaudiophile明确点名“5.5–6k 的峰带来兴奋感,但有时会接近尖锐”,并建议用海绵套压一压亮度。 (Mobileaudiophile)
Headfonia也提到“lower treble… aggressive / boosted”,属于它的短板之一。 (Headfonia)
B站文里也把它的核心听感总结成“亮一点、更通透”,并说这种亮度把握得还算到位。 (Bilibili)
把多家评测/用户文的共识合起来,Project Ace(海神圈)的口碑大致是:
“偏线性中性、略偏亮的通透系单动圈;主打人声清晰与解析,低频不靠量取胜,高频有亮点也有风险。”
如果你告诉我你平时主要听的风格(比如“华语流行女声/ACG/摇滚/电音”)和常用前端(手机小尾巴?播放器?),我可以把这条频响再进一步落到更具体的“你大概率会觉得哪里爽、哪里不爽、怎么改最划算”。