19 Kasım 2025 Çarşamba

Ses Kodek Entegreleri

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:

  1. Analog frontend

    • Mikrofon preamp, ADC giriş filtreleri

    • Kulaklık/speaker sürücü ampliler

  2. Dijital ses formatı

    • I2S / TDM / PDM → PCM veri akışı

    • Örnekleme frekansı, bit derinliği ayarları

  3. Embedded DSP işlemleri

    • HPF, LPF, EQ, compressor, limiter

    • Reverb, echo, chorus gibi efektler

    • AGC (Automatic Gain Control), noise suppression

  4. 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

  5. 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

Bir yazılım geliştirici yada donanım tasarımcı olabilirsiniz bu sebeple herhangi bir cihazın içerisinde kullanılacak olan ses işlemcisi veya entegreleri önemli derecede iyi seçilmelidir kısaca DAC olarak çalışan bu entegreler pc deki dijital PCM türündeki sesi doğrudan analog olarak çıkışa aktarır burada I2S çalışma prensibinide öğrenmek gerekir aşağıda değinelim. 

Burada dikkat edilmesi gerekilen husus yukarıda bahsedildiği gibi bitrate ve bit oranı eğer kaliteli bir çıkış isteniyorsa buna dikkat edilmeli hatta ses çıkışının doğrudan özel amplifer ile desktelenmesi önerilir.

NAU88C22 çok üzerine çalıştım yeri geldi kodlarını özenlikle yazdığımdan bu çip üzerinden konuyu ele alacağım aşağıda hali hazırda bir örnek paylaştım.

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?

  1. 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

  2. LRCLK / WS (Left-Right Clock / Word Select)

    • Kanal seçimi:

      • WS = 0 → Left

      • WS = 1 → Right

    • Frekans: sample_rate (ör: 48 kHz)

  3. 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ı:

  1. 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ış:

  1. Mikrofon → CODEC ADC → I2S RX → MCU’da bir buffer (DMA)

  2. MCU bu PCM buffer üzerinde:

    • Filtre, efekt (HPF, EQ, reverb, echo vs.)

    • Kayıt, stream, kodek (Opus/AAC/MP3 encode) yapabilir.

  3. Ç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ı,



Kendi Projemizden örnek sadece kodek için bir devre kartı





https://github.com/hmz06967/Nau88c22-driver


Referanslar
Chatgpt
https://woodandfirestudio.com/wp-content/uploads/2023/05/bits-1.jpg
https://www.nuvoton.com/export/resource-files/en-us--DS_NAU88C22_DataSheet_EN_Rev1.8.pdf


Ses Kodek Entegreleri

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 sa...