Mengolah sinyal di firmware: memahami sampling dan anti-aliasing, merancang filter digital FIR dan IIR, menggunakan FFT untuk analisis frekuensi, serta menjalankan pipeline pemrosesan real-time yang deterministik, ditutup praktik membangun aplikasi DSP

Banyak firmware tidak berurusan dengan "data" abstrak, melainkan dengan sinyal: audio dari mikrofon, getaran dari IMU, tegangan dari sensor medis. Sebelum sinyal itu bisa dipahami atau dijadikan input AI (episode 21), ia harus dibersihkan dan dianalisis — dan itulah pekerjaan DSP (Digital Signal Processing).
DSP adalah matematika yang berjalan dalam real-time: filter membuang noise, FFT mengungkap frekuensi yang terkandung, dan semua itu harus selesai sebelum sampel berikutnya tiba. Episode ini membangun fondasi DSP praktis untuk embedded: sampling, filter digital, FFT, dan desain pipeline real-time yang tidak putus di tengah aliran data.
Perangkat membaca dunia nyata lewat ADC dengan kecepatan tertentu — itulah sampling rate. Dua aturan yang menentukan segalanya:
F, kalian harus sampling minimal 2×F. Mikrofon untuk suara manusia (0-4 kHz) butuh sampling ≥ 8 kHz.Suara manusia : sampling 16 kHz, filter low-pass 8 kHz
Audio musik : sampling 44,1 kHz, filter 20 kHz
Getaran motor : sampling 1 kHz, filter 500 Hz
IMU gesture : sampling 100-500 HzKesalahan sampling adalah biang kegagalan DSP paling umum: sampling terlalu rendah → data "alias" → analisis frekuensi salah → kesimpulan salah. Selalu tentukan bandwidth sinyal kalian sebelum memilih sampling rate.
Filter digital menerima deret sampel dan mengeluarkan deret yang telah diubah. Dua keluarga utama:
| Filter | Karakteristik | Kapan dipakai |
|---|---|---|
| FIR | Stabil, linear-phase, butuh banyak tap | Audio, pemrosesan presisi |
| IIR | Lebih hemat tap untuk roll-off tajam, bisa tidak stabil | Kontrol, telemetri hemat resource |
FIR filter menghitung output sebagai penjumlahan bobot sampel masa lalu. Untuk 16 tap:
/* FIR filter 16 tap, order simetris (linear phase) */
static const float h[16] = { 0.001f, 0.013f, 0.045f, 0.100f,
0.160f, 0.210f, 0.230f, 0.240f,
0.240f, 0.230f, 0.210f, 0.160f,
0.100f, 0.045f, 0.013f, 0.001f };
float fir_process(float x) {
static float buf[16]; /* ring buffer sampel (pola episode 3) */
static uint8_t idx = 0;
buf[idx] = x; /* simpan sampel terbaru */
uint8_t i = idx;
float y = 0.0f;
for (uint8_t k = 0; k < 16; k++) {
y += h[k] * buf[i]; /* bobot * sampel, urut mundur */
i = (i == 0) ? 15 : (uint8_t)(i - 1);
}
idx = (uint8_t)((idx + 1) % 16);
return y;
}Perhatikan pola yang familiar: ring buffer dari episode 3 adalah infrastruktur DSP juga. Koefisien h[] tidak dihitung tangan — mereka dihasilkan oleh tool desain filter (SciPy, Octave) lalu ditanam sebagai tabel.
IIR filter jauh lebih ringkas (beberapa koefisien, memori kecil) — contoh biquad adalah blok bangunan standar:
/* IIR biquad (2 pole, 2 zero) — contoh struktur */
typedef struct {
float b0, b1, b2, a1, a2; /* koefisien dari tool desain */
float z1, z2; /* state */
} biquad_t;
float biquad_process(biquad_t *f, float x) {
float y = f->b0 * x + f->z1;
f->z1 = f->b1 * x - f->a1 * y + f->z2;
f->z2 = f->b2 * x - f->a2 * y;
return y;
}Perhatikan: karena feedback (state z1, z2), IIR bisa tidak stabil jika koefisien salah. Inilah mengapa FIR lebih disukai untuk presisi — tapi IIR menang untuk hemat resource.
FFT (Fast Fourier Transform) mengubah sinyal dari domain waktu ke domain frekuensi — menjawab pertanyaan "frekuensi apa yang ada di sinyal ini?" Ini dasar dari deteksi nada, analisis getaran, dan banyak fitur audio.
Cara kerjanya: kumpulkan window sampel (biasanya 256/512/1024, pangkat dua), jalankan FFT, dan setiap bin output mewakili pita frekuensi:
sampling 16 kHz, window 512 sampel
-> 256 bin frekuensi, resolusi 16.000/512 = 31,25 Hz per bin
Bin 0 = 0 Hz (DC)
Bin 10 = 312,5 Hz
Bin 90 = 2.812,5 Hz (nada sekitar di sini jika ada)Implementasi FFT di embedded biasanya memakai library matang (CMSIS-DSP, KissFFT, ARM's DSP) — jangan menulis FFT sendiri. Tapi memahami outputnya wajib: membaca bin, memilih window (Hamming/Hanning) untuk mengurangi kebocoran spektrum, dan menafsirkan magnitudo.
Aplikasi nyata yang sering muncul: deteksi anomali getaran — hitung FFT getaran motor sehat vs rusak; kerusakan bearing muncul sebagai puncak frekuensi khas. Ini dipakai di predictive maintenance industri (dan menjadi input TinyML di episode 21).
DSP yang baik berjalan dalam pipeline yang deterministik — setiap sampel diproses dalam tenggat yang tetap:
Tiga aturan pipeline DSP embedded:
Important
Titik kegagalan DSP paling umum bukan matematikanya, melainkan overflow dan tipe data. Menambahkan dua int16_t bisa meluap menjadi hasil yang terlihat seperti noise. Aturan: ketahui rentang tiap tahap, naikkan lebar bit di titik rawan (int32_t/q15 fixed-point), dan validasi pipeline dengan sinyal uji yang diketahui — bukan sinyal acak.
scipy.signal.firwin), tanam sebagai tabel.Inti yang harus dibawa pulang:
Di episode 23 selanjutnya kita masuk ke dunia industri yang paling menuntut: automotive & industrial embedded — CAN, AUTOSAR, dan protokol industri, dengan praktik menyiapkan komunikasi CAN pertama. Inilah dunia di mana ASIL dari episode 20 menjadi nyata setiap hari. Sampai jumpa di episode 23!