Merhaba, bugün ses kodek entegreleri hakkında bir yazı yazacağım aklımdaki düşünceler de bu yönde biliyorum ki bu blogda okduğunuz makale sadece bilgilendirme amaçlıdır ve proje için OZK tarafından Kicad ile tasarlanmış devre üzerinde kullanılacak nau88c22 ses kodeği için bir driver katmanı bulunma aşağıdaki paylaşacağım öncelikle örnek bir ses kodeği üzerinden başlayalım.
Temel kavramlar: örnekleme, bit derinliği, bit hızı
Örnekleme frekansı (sample rate)
-
Ses dalgasını saniyede kaç kez ölçtüğün:
-
8 kHz → telefon konuşması
-
44.1 kHz → CD kalitesi
-
48 kHz → çoğu profesyonel video / ses prodüksiyonu
-
96/192 kHz → “hi-res audio” tarafta
-
Nyquist’e göre, örnekleme frekansı en yüksek frekansın en az 2 katı olmalı. İnsan işitme bandı ~20 kHz → 44.1 kHz buradan geliyor.
Bit derinliği (bit depth)
Bir örneğin genlik hassasiyeti:
-
16 bit → 65.536 farklı seviye (CD)
-
24 bit → 16.7 milyon seviye (profesyonel kayıt)
Bit derinliği yükseldikçe:
-
Dinamik aralık artar
-
Kuantizasyon gürültüsü azalır
Bit hızı (bitrate)
Saniyedeki veri miktarı (kbps / kbps) bitrate ≈ sample_rate × bit_depth × kanal_sayısı × sıkıştırma_faktörü
-
1.411 kbps → 44.1kHz/16bit/2kanal sıkıştırılmamış PCM (CD).
-
320 kbps MP3 → yüksek kaliteli sıkıştırılmış müzik.
-
64 kbps mono Opus → gayet anlaşılır VoIP konuşma.
Ses işleme + kodek entegrasyonu (DSP tarafı)
Senin ilgi alanına daha yakın kısım burası: MCU / DSP tarafında bir NAU88C22, WM8960 vb. bir codec IC ile çalışırken aslında şu katmanlar devreye giriyor:
-
Analog frontend
-
Mikrofon preamp, ADC giriş filtreleri
-
Kulaklık/speaker sürücü ampliler
-
-
Dijital ses formatı
-
I2S / TDM / PDM → PCM veri akışı
-
Örnekleme frekansı, bit derinliği ayarları
-
-
Embedded DSP işlemleri
-
HPF, LPF, EQ, compressor, limiter
-
Reverb, echo, chorus gibi efektler
-
AGC (Automatic Gain Control), noise suppression
-
-
Software codec layer
-
MCU üzerinde bir MP3/AAC/Opus/… encoder/decoder kütüphanesi
-
RTOS task’ları ile:
-
DMA buffer → codec encode/decode → network / SD kart yazma
-
Buffering & jitter handling
-
-
-
Network / depolama
-
RTP, WebRTC, custom UDP/TCP protokolleri
-
Dosya sistemi (FAT, exFAT) ve konteyner formatlar (WAV, MP4, OGG, MKV vb.)
-
Bu zincirde ses kodeği, sadece bir “ara katman”:
-
Giriş: PCM buffer
-
Çıkış: Sıkıştırılmış frame’ler (bitstream)
Kodek seçimi
I2S
I2S, dijital ses dünyasında kodek ↔ MCU/DSP arasındaki “ses veri yolu” diyebilirsin.
I²S (Inter-IC Sound)
Philips’in tanımladığı, entegreler arası PCM ses verisi taşımak için kullanılan seri bir protokol.
-
Sadece ses için tasarlanmış (SPI/UART gibi genel amaçlı değil)
-
Genelde:
-
Bir master (MCU / SoC)
-
Bir veya daha fazla slave (DAC, ADC, CODEC) içerir.
-
Hangi hatlar var?
-
BCLK / SCK (Bit Clock)
-
Her bir veri biti için bir clock darbesi.
-
Frekans:
BCLK ≈ sample_rate × bit_depth × kanal_sayısı
Ör: 48 kHz, 16 bit, stereo → 48k × 16 × 2 = 1.536 MHz
-
-
LRCLK / WS (Left-Right Clock / Word Select)
-
Kanal seçimi:
-
WS = 0 → Left
-
WS = 1 → Right
-
-
Frekans: sample_rate (ör: 48 kHz)
-
-
SD / SDOUT / SDIN (Serial Data)
-
PCM verisi bu hat üzerinden akar.
-
Tek hat üzerinde sırayla L, sonra R kanal verisi gönderilir (stereo için).
-
İsteğe bağlı:
-
MCLK (Master Clock)
-
Codec’in iç PLL/oversampling devreleri için yüksek frekans (örneğin 12.288 MHz).
-
Bazı codec’ler MCLK olmadan da LRCLK/BCLK’den PLL türetebiliyor, bazısı istemez, bazısı şart koşar.
-
I2S frame yapısı (stereo örneği)
48 kHz, 16 bit stereo varsayalım:
-
Her frame = 1 adet sol + 1 adet sağ sample
-
LRCLK bir periodu boyunca “Left”, diğer periodda “Right”
Zaman ekseninde:
-
WS = 0 iken: SD hattında Left sample bitleri
-
WS = 1 iken: SD hattında Right sample bitleri
Bitler genelde MSB first gönderilir.
I2S, Left-Justified, Right-Justified farkı
Hepsinde hat isimleri benzer, fark verinin LRCLK’e göre hizalanması:
-
I2S standard (klasik):
-
LRCLK kenarı değiştikten 1 bit clock sonra MSB başlar.
-
-
Left-Justified (LJ):
-
LRCLK kenarı ile aynı anda MSB başlar.
-
-
Right-Justified (RJ):
-
LSB, LRCLK kenarına hizalanır; MSB geride kalır.
-
Çoğu MCU/codec konfigürasyonunda şu ayarları görürsün:
-
I2S standard
-
Word length: 16/24/32 bit
-
Frame format: Philips I2S / LJ / RJ
I2S nerede işin içine giriyor?
Senin dünyandan düşünürsek:
-
NAU88C22 / WM8960 / ES8388 vb. CODEC
-
I2S üzerinden MCU’ya PCM veri gönderir (ADC → I2S RX)
-
I2S üzerinden MCU’dan PCM veri alır (I2S TX → DAC)
-
Akış:
-
Mikrofon → CODEC ADC → I2S RX → MCU’da bir buffer (DMA)
-
MCU bu PCM buffer üzerinde:
-
Filtre, efekt (HPF, EQ, reverb, echo vs.)
-
Kayıt, stream, kodek (Opus/AAC/MP3 encode) yapabilir.
-
-
Çalmak istediğin sesi:
-
MCU I2S TX buffer’a yazar → CODEC DAC → hoparlör / kulaklık
-
Pratik notlar (MCU tarafı)
-
I2S periferik çoğu MCUs’da DMA ile kullanılır:
-
Sürekli sample akışı için CPU’yu boğmamak adına.
-
-
Dikkat edilmesi gerekenler:
-
sample_rate ayarı (LRCLK/BCLK oranı)
-
bit depth (16/24/32)
-
master/slave seçimi:
-
MCU master → BCLK/LRCLK/MCLK üretir
-
Codec master → MCU clock’ları dışarıdan alır
-
-
I2S mod mu, LJ/RJ mi? Codec datasheet ile eşleştirmek lazım.
-
Kodek için ön araştırma ve çalışma prensibi
Özetlersek, ses işleme zincirini şöyle düşünebilirsin:
Analog dünya → ADC → PCM (I2S vb.) → DSP işlemleri (filtre, efekt, AGC…) → KODEK (encode/decode) → Ağ / Depolama → tekrar decode → DAC → analog dünya
-
Kayıpsız kodekler: Kaliteden ödün vermeden sıkıştırma, ama depolama/iletim pahalı.
-
Kayıplı kodekler: İnsan kulağının sınırlarını kullanarak çok daha ekonomik veri boyutları.
-
Belirli bir MCU/ESP32/STM32 için örnek bir ses codec pipeline akış diyagramı,