12Bit Ses Datası üretme

Başlatan Mucit23, 28 Kasım 2020, 23:19:07

Mucit23

Selamlar.

STM32F0 ile DAC de ses çalmayı denedim. Şöyle bir sorun var. Benim Ses datam 8 Bit uzunlukta. DAC girişim ise 12Bit girişe sahip. DAC'deki tek data seçeneği 16 bitlik data registerinin sağa veya sola dayalı olarak seçilebilmesi.


Ses datasını DMA aracılığıyla DAC bufferi'na yazıyorum. Bu yüzden arada dataları işleme imkanım yok.

Şimdi 8 Bit Datayı, Sağa dayalı  DAC registerine yazarsam eğer 12 bitlik verin sadece düşük 8 bitini kullanabiliyorum. Sola dayalı olarak zaten hiç kullanamıyorum. Verinin düşük 4 biti çöpe atılmış oluyor. Bu yüzden Ses datasını 12 bit olarak örnekleyip hafızaya yazmam lazım. 8 ve 16 bit olarak birçok uygulama mevcut ama 12 bit yapan yok. Varmı dır böyle bir uygulama?

power20

#1
Genliği sınırlayarak
16 bit örnekleme yapılır. Genlik 12 bit değerini geçmemiş olur. Çalarken 12 bit olarak kullanılır.

z

#2
Verilerin 8 bit, DAC ise 12 bit veri aliyorsa, cope atilacak verin yok demektir. DAC'a 8 bit veriyi basarsan tek sorunun DAC'in verecegi sinyalin genligin dusuk cikmasi olacaktir.

8 bit veriyi hafizaya yerlestirirken 4 bit sola kaydirip yazarsan bu kez genlik sorunun olmaz ama verilerin hafizada 2 kati yer kaplar.

DMA kullanmaktaki israrini anlamiyorum. Gunumuz islemcileri artik cok hizli.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#3


En ustteki 8 bit secenegi neden isini gormuyor?

Verilerin 8 bit. DAC da 8 bit veri kabul ediyor.

Eger DAC 8 bit veri kabul etmiyor illede 12 bit diyorsa da sorun yok. 12 Bit alana 8 bit veri yazdiginda genlik duser sadece.

Ramdaki verileri 8 bit yerine 16 bit tutmaya razi isen verileri 4 bit sola kaydir. Boylece 12 bir verilerin olur. DAC'i da 12 bit Right aligned seklinde ayarlarsan sorun olmaz.

Fakat ben ortada bir sorun goremedim. STM DMA'de 8 bit veriyi oku ama 16 bit yaz secenegi de vardi.

Ustelik DMA israrini da anlamiyorum. STM yeterince hizli.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

OG

Sola kaydırıp 12 bit yapınca
LSB tarafına eklenen 4 bitin değeri 0 olacağından
5. bit ile bu 4 bit arasında ani değer sıçraması oluşabileceğinden çıtırtılar hissedilebilir.
4 bit çok da anlamlı dB elde etmese de pratikte görmek gerek.

8 bit olan sesin 0. bit (LSB) değeri ne ise (0 veya 1) eklenecek 4 bitin değerini de aynı değerde yaparak denenebilir.

veya matematiksel expand (8 bit'den 12 bite)
8 bit to 12 bit expand
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Mucit23

Aslıda doğrudan 8 bit olarak yazınca da işimi görüyor. Sadece Ses üretilirken vermiş olduğum ofset değeri daha düşük oldu. 8 Bit DAC var MCU da fakat o kanal başka bir iş için kullanılıyor. Onu kullanamıyorum. DMA Kullanmak istememin sebebi işlemcinin başka işlerle yoğun uğraşması. Birkaç farklı yüksek öncelikli kesme kullanıyorum. O yüzden bu işi DMA ya yaptırsam çok şirin olacak.

@OG hocam onu bende düşündüm. 16 Bit ses datası üretip Sola dayalı 12 bit registerine yazarsam düşük 4 bit çöpe atılmış olur. Sesde çok birşey değişmez ama ufak çıtırtılar duyulur.

z

#6
Citirti olmaz.

8 bitte calisirken 0'dan 1'e gecis ile suni 12 bitte 0 dan 16'ya gecis ile ayni anlama gelir.

Yani 8 bitle calisirken cikisa x16 kazanc eklediginde citirti olmuyorsa suni yapilan 12 bitte de citirti olmaz.

Suni 12 bitte yapilan tek sey x16.

En yuksek onceligi Timera verirsen sorun olmaz.

Benim yaptigim wav playerda her sey int ile soft olarak yonetiliyor.  SD kartan veriler okunurken bile  sesde problem olmuyordu. Kaldi ki timer int frekansim da cok yuksek.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com