Spectrogram
Spektrogram langsung yang menggambar nada dalam suara Anda, memakai transformasi yang saya tulis dan buktikan sendiri

- permintaan jaringan saat runtime, dijamin build
- 0
- lebih cepat dari waktu nyata di desktop
- ~101×
- pemeriksaan terpisah atas kebenaran transformasi
- 4
- sampel audio dibangkitkan lewat kode
- 6
Di halaman ini
Masalahnya
Bentuk gelombang, garis naik-turun yang dikenal semua orang, menunjukkan seberapa keras sebuah suara. Bentuk gelombang tidak menunjukkan nada: dengung rendah dan siulan tinggi terlihat hampir sama. Spektrogram menunjukkan nada apa saja yang muncul dari waktu ke waktu. Beginilah cara pengenal suara, software musik, dan aplikasi pengenal kicau burung melihat suara.
Saya membangun ini untuk dua jenis pengunjung. Yang pertama pernah mendengar transformasi Fourier dan ingin memahaminya secara intuitif. Gagasan utamanya adalah sebuah tarik-ulur: ketepatan waktu dan ketepatan nada tidak bisa didapat sekaligus. Yang kedua adalah peninjau teknis. Browser sudah punya analyser bawaan yang bisa menggambar spektrogram dalam sepuluh baris, dan itu tidak membuktikan apa pun tentang orang yang memakainya. Saya ingin menulis transformasinya sendiri dan menunjukkan bahwa hasilnya benar.
Yang saya bangun
Matematikanya saya buktikan sebelum membuat layar apa pun
Transformasi yang salah tetap bisa menggambar spektrogram yang meyakinkan, dan kesalahannya tidak akan terlihat hanya dengan memandanginya. Karena itu saya menulis transformasi dan tesnya lebih dulu, baru kemudian antarmukanya. Saya menyiapkan empat pemeriksaan yang saling lepas: versi buku teks yang lambat sebagai pembanding, aturan energi yang harus berlaku untuk setiap masukan, perjalanan bolak-balik kembali ke sinyal asal, dan sinyal uji yang bisa dicek dengan tangan. Masing-masing menangkap kesalahan yang lolos dari yang lain.
Tarik-ulurnya menjadi kontrol yang bisa digeser
Layar utama menggambar suara dari mikrofon atau sampel sebagai gambar bergulir, dengan bentuk gelombang di atasnya. Saat kursor diarahkan, muncul waktu, nada, dan kekerasan suara yang tepat. Tarik-ulur antara waktu dan nada menjadi kontrol dengan tiga posisi bernama, dari "lebih tajam di waktu" sampai "lebih tajam di nada". Menggesernya mengajarkan gagasan itu lebih cepat daripada satu paragraf penjelasan. Pengaturan mentahnya disimpan di bagian "lanjutan".
Mulus di layar karena tidak ada memori yang dibuang
Pada 60 frame per detik, jeda pembersihan memori terlihat seperti aplikasi rusak. Saya menyiapkan semua memori kerja sekali per pengaturan lalu memakainya ulang, jadi aplikasi tidak mengalokasikan apa pun per frame. Analisis berjalan di thread latar. Tes yang menjaganya mengukur pertumbuhan memori selama satu menit penuh, selain kecepatan mentahnya.
Audio tidak pernah keluar dari perangkat
Situs yang meminta akses mikrofon wajib menjelaskan ke mana audionya pergi. Di sini jawabannya tidak ke mana-mana, dan build yang memastikannya. Sebuah pemeriksaan memindai situs yang sudah jadi untuk mencari apa pun yang akan diambil browser, dan menggagalkan deploy kalau menemukannya. Satu-satunya pengecualian adalah empat tautan ke profil saya sendiri, masing-masing dicatat dengan alamat persisnya.
Halaman bukti yang mengakui browser lebih cepat
Halaman bukti menjalankan transformasi saya di samping analyser bawaan browser dengan masukan yang sama, dan menampilkan selisihnya di setiap frekuensi. Analyser bawaan lebih cepat, dan halaman itu menyebutkannya. Kecepatan memang tidak pernah menjadi klaimnya. Supaya perbandingannya adil, saya menyamakan bentuk jendela dan skala kekerasannya persis.
Hasilnya
Spectrogram sudah live dan terbuka untuk umum, dalam bahasa Inggris dan Indonesia. Ada empat bentuk jendela, tiga skala nada, dan mode sintesis tempat Anda menyusun sinyal dari nada murni lalu melihat spektrumnya mengembalikan persis apa yang dimasukkan. Enam sampel bawaan dibangkitkan lewat kode, jadi situs tetap bisa dipakai walaupun akses mikrofon ditolak. Di desktop, transformasinya berjalan sekitar 101 kali lebih cepat dari waktu nyata. Saya membangunnya dalam satu sesi sekitar empat jam pada 6 Agustus 2026.
Di balik layarDetail teknis untuk engineer
- Inti DSP di
lib/dsp/sekitar 990 baris: FFT radix-2 Cooley-Tukey in-place beserta inversnya, tabel twiddle dan bit-reversal yang di-cache, empat jendela (rectangular, Hann, Hamming, Blackman) dari Harris (1978), konversi dB, pemetaan bin linear/log/mel, framing, dan sintesis aditif. - Sinyal kebenaran: oracle DFT naif O(n²) di setiap ukuran dan korpus acak ber-seed; identitas Parseval di setiap suite; round trip FFT → invers; fixture analitik (DC, sinus tepat di tengah bin, impuls satuan, kernel kebocoran Dirichlet pada offset setengah bin). Toleransi ditetapkan sekali dari fixture dan tidak pernah dilonggarkan.
- Bagian real dan imajiner disimpan di
Float64Arrayterpisah. Plate berupa ring buffer kolom yang di-blit sebagai satuImageDataper frame. - PRD meminta analisis di
AudioWorkletProcessor, tetapi worklet tidak bisa diandalkan untuk memakai ES import, sehingga butuh salinan FFT kedua yang tidak teruji. Analisis dipindah ke Worker biasa; worklet hanya menjadi penyadap tangkapan, dengan fallbackScriptProcessor. scripts/finalize-export.mjsmemindai hasil build untuksrc,<link href>,srcset,url(), dan@import, ditambah daftar tolak tracker. Namespace XML W3C dianggap aman.- Keadilan halaman bukti: Blackman α = 0,16 dan skala
20·log10(|X[k]|/fftSize)tanpa penggandaan satu sisi, dengan masukan stasioner tepat di tengah bin. tests/ui/tokens.test.tsgagal kalau palet Tailwind dan modul warna canvas tidak sinkron. Tes kamus gagal kalau kedua bahasa tidak sinkron.- Benchmark pada 2048 titik, overlap 75%, 48 kHz: sekitar 0,105 ms per kolom, sekitar 101× waktu nyata, sekitar 0,6 byte pertumbuhan heap per kolom selama satu menit.
- Static export Next.js 14, 4 rute × 2 bahasa, tiga dependensi runtime tanpa library DSP, audio, atau grafik. 256 tes di 13 berkas, sekitar 5,6 detik. Sekitar 8.400 baris, 32 commit.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.