PWM ile Ses Üretmede Filtreleme işi

Başlatan Mucit23, 31 Ekim 2020, 22:40:01

Mucit23

Selamlar

PWM ile ses ürettiğim bir uygulama var. Wav dosyasını 8 Bit 8Khz Mono olarak Flash hafızaya gömüp oradan pwm olarak dışarı veriyorum. Filtreleme işini düzgün yapamadım.

Anfi olarak basitçe şu devreyi uyguladım.

Bu devreye Telefon veya PC ile ses uyguladığımda gayet güzel ses alıyorum sorun yok bu kısımda.

Fakat PWM ile ses uyguladığımda taşıyıcı sesini çok fazla duyuyorum. PWM çıkışına çeşitli RC Filtreler ekledim PWM frekansı 8Khz olarak ilk başta denedim. Ses datasını flash hafızaya gömdüğüm için programda çok yer kaplasın istemedim ama 8Khz için hışırtı kabul edilebilir seviyede değil. Sonra 16Khz'ye çıktım Hışırtı biraz azaldı ama yine var. Ve Data boyutum X2 oldu.

8Khz gibi Düşük frekanslarda PWM ile düzgün ses çıkarmanın yolu varmı? Eldeki MCU'yu kullanma derdindeyim. DAC yok :)
 

yas


ipek

pin 1 ve 8 arasındaki boostrap kapasitörünü çıkarın boş kalsın,ses elbet düşecektir fakat gürültüde azalacaktır..

z

#3
Eger dinledigin ses muzik ise 8 Khzi bastirmak muzigi kotu etkiler (zaten 8 Khz ornekleme muzik icin uygun degil).

Eger konusma sesi ise low pass filitreyi 2. dereceye cikartip bir dene.

Benim de bir wav uygulamam vardi. Gerci frekansim cok yuksekti ama  amplifikator cipi kullanmadim. PWM sinyali guclendirip cikisi kapasitif kuplajla dogrudan hoparlore verdim diye hatirliyorum.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Alıntı yapılan: yas - 31 Ekim 2020, 23:39:22@Mucit23 hocam şu devre ile deneyin.

(Resim gizlendi görmek için tıklayın.)

Sanırım Benim Anfinin giriş empedansı çok düşük. 47K Seri direnç ile hiç ses alamıyorum.

Sanırım DAC bulunduran bir çip seçsem iyi olacak. Baktım pin to pin uyumlu stm mcu lar var. 2sn lik bir uyarı sesi çıkarıyorum. Bu yüzden SD kart vs gibi olaylara girmeden 8Khz ile basitçe halletmem lazım. 8Khz Dac ile verilse bence yeterli olur. Çünkü PC de çaldığımda pek sorun görünmüyor.

berat23

sinyal mantığıyla bakarsak 8khz taşıyıcı oldukça düşük kalıyor. mantıken taşıyıcının duyulması istenilen frekanstan yüksekte olması ve bu pwm sinyalinin duyulabilir frkenasta cut-off'u olan bir low pass filter'dan geçmesi gerekiyor ki temiz ses alınsın.

diyelim duymak istenilen maks. frekans 16khz. o zaman 32khz üzeri bir pwm frekansı olmalı. low pass ise (@yas'ın paylaştığı devrede r8-c6) cut off'u 16khz veya biraz altı derseniz cızırtı doğal olarak duyulmayacağı gibi diğer frekanslaarı da temizce alırsınız. rakamları çok kaba verdim anlatabilmek için.

yas

#6
@Mucit23 hocam, @berat23 ün dediği gibi bu durum varsa cızırtı oluşması gayet normal. Normalde pwm frekansınızı 70-100 khz gibi bir değerde üretmelisiniz. Örnekleme hızınız 8khz ise yani wav dosyası 8khz lik olarak üretilmişse saniyede 8000 defa olacak şekilde duty değerini değiştirmelisiniz. Aynı dosyayı bilgisayardan nasıl dinliyorsanız devrenizden de o kalitede çıkacaktır.

Not: Ses dosyasının örnekleme hızınızın 10 katı kadar pwm frekansı kullanılmalı.

tunayk

Alıntı yapılan: yas - 01 Kasım 2020, 19:52:10@Mucit23 hocam, @berat23 ün dediği gibi bu durum varsa cızırtı oluşması gayet normal. Normalde pwm frekansınızı 70-100 khz gibi bir değerde üretmelisiniz. Örnekleme hızınız 8khz ise yani wav dosyası 8khz lik olarak üretilmişse saniyede 8000 defa olacak şekilde duty değerini değiştirmelisiniz. Aynı dosyayı bilgisayardan nasıl dinliyorsanız devrenizden de o kalitede çıkacaktır.

Not: Ses dosyasının örnekleme hızınızın 10 katı kadar pwm frekansı kullanılmalı.
Tamam da adam Hi-Fi müzik seti yapmıyor ki :)

power20

Hifi olmasa da 8khz basit bir sesi güzel çalabilmek için galiba 48khz üzeri pwm gerekiyordu. Bizzat denedim. Ben diyeyim 48khz, siz deyin 98khz. Pwm frekansında cimrilik yapılmamalı. Sonuç başarısız olur

Mucit23

PWM'den vazgeçtim. DAC kullanıcam. Diğer türlü en azından 22Khz üzeri bir pwm uygulamam gerekecek. Bunun için wav dosyamda 22Khz örneklenmiş. Bu şekilde örneklenmiş bir sinyali hafızada tutmam çok zor. SD kart kullanmam gerekir.

yas

Alıntı yapılan: tunayk - 01 Kasım 2020, 20:23:48Tamam da adam Hi-Fi müzik seti yapmıyor ki :)

:o 8khz örneklemeli ses dosyası 8khz pwm frekansı ile üretmeye çalışılırsa her bir ses değişim verisi için sadece 1 periyod kullanılmış olur. Bu durumda pwm çıkışına analog dönüşüm için eklenen r-c filtre devresindeki çıkış genliği gerekli seviyesine tam oturmadan arkadan diğer değişimler gelmeye devam edecek sinyal olması gerektiğinden farklı üretilecektir.

Mucit23

Alıntı yapılan: yas - 01 Kasım 2020, 22:35:52:o 8khz örneklemeli ses dosyası 8khz pwm frekansı ile üretmeye çalışılırsa her bir ses değişim verisi için sadece 1 periyod kullanılmış olur. Bu durumda pwm çıkışına analog dönüşüm için eklenen r-c filtre devresindeki çıkış genliği gerekli seviyesine tam oturmadan arkadan diğer değişimler gelmeye devam edecek sinyal olması gerektiğinden farklı üretilecektir.

Aslında sorun benim veriyi aktarma için DMA kullanmamdan kaynaklanıyor. Bunu düşünmemiştim. Büyük bir hata. 8Khz örneklemeli ses datam olsun PWM frekansımı 44KHZ'ye ayarlayıp Bir döngü içerisinde örneğin 8Khz örneklemeli ses datamı 50us aralıklarla PWM registerine yazabilirim. Ben DMA ya start verip başka işlerle uğraşıyordum.

yas

Alıntı yapılan: Mucit23 - 01 Kasım 2020, 22:24:33PWM'den vazgeçtim. DAC kullanıcam. Diğer türlü en azından 22Khz üzeri bir pwm uygulamam gerekecek. Bunun için wav dosyamda 22Khz örneklenmiş. Bu şekilde örneklenmiş bir sinyali hafızada tutmam çok zor. SD kart kullanmam gerekir.
Hocam bence yanlış düşünüyorsun. Eğer konuşma veya alert amaçlı bir ses çalacaksanız 8khz örneklem gayet yeterli. Sadece pwm frekansınız yükseltilmeli. Şayet konuşma yok sadece değişik tonlar üretmek istiyorsanız zaten bunlara hiç gerek yok. Bildiğim kadarıyla proton derleyici kullanıyordunuz. Eğer öyle ise freqout komutu fazlasıyla işinizi görecektir. Eğer proton kullanıyor ve illa sd kart kullanacağım derseniz örnek olarak yapılmış "mmc wave file player" diye bir örneği var gerçekten çok başarılı incelemeniz tavsiye ederim.

yas

Alıntı yapılan: Mucit23 - 01 Kasım 2020, 22:40:33Aslında sorun benim veriyi aktarma için DMA kullanmamdan kaynaklanıyor. Bunu düşünmemiştim. Büyük bir hata. 8Khz örneklemeli ses datam olsun PWM frekansımı 44KHZ'ye ayarlayıp Bir döngü içerisinde örneğin 8Khz örneklemeli ses datamı 50us aralıklarla PWM registerine yazabilirim. Ben DMA ya start verip başka işlerle uğraşıyordum.

Devrenizin diğer speclerini bilmediğim için anlamsız yorumlar yapıyor olabilirim. Daha önce hangi mcu olduğunu hiç sormadan direkt pic18 serisi gibi düşünerek yazdım. hangi mcu olursa olsun 8khz için kesme kullansanız diğer işlerinizi aksatır mı?

Mucit23

Protonu en son 8 sene önce kullanmıştım. Şuan STM32'de deneme yapıyorum. Aslında sistemi yanlış kurdum. Şuan herşey aklıma yattı. Bu DMA ve PWM ile yağılacaksa iki adet itmer kullanılmalı ben burada hata yaptım. Tetikleyici Timer ile PWM üretilen Timer ayrı olmalı. PWM üretilen Timerile 44Khz veya kaç khz kullanılıyorsa sabit pwm üretilmeli. İkinci Timer ise Ses sinyalinin örnekleme frekansına kurulmalı ve update eventinde DMA'ya tetik vermeli. DMA aldığı veriyi PWM registerine yazarsa olur. Bu akşam bunu deneyeceğim.