Merhaba, bugün ses kodek entegreleri hakkında konuşalım.
Projede, OZK tarafından Kicad ile tasarlanmış nau88c22 ses entegresi ve bir driver katmanı bulunmakta aşağıda paylaşacağım örnek bir ses devresi üzerinden ilerliyoruz.
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ı)
MCU / DSP tarafında bir NAU88C22, WM8960 vb. bir codec IC ile çalışırken sırasıyla
-
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.)
-
Kodek seçimi
I2S
I2S, dijital ses dünyasında kodek ↔ MCU/DSP arasındaki “ses veri yolu” diyebiliriz.
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 ve neden?
-
BCLK / SCK (Bit Clock)
-
Her bir veri biti için bir clock sinyali 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şimize yarıyor?
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.
-
-
Çıkış:
-
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 sinyali işleme yöntemi:
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ı,
Hiç yorum yok:
Yorum Gönder