Şimdi Ara

Arduino ile SD Kartsız Ses Çalma

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
9
Cevap
1
Favori
244
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba. Ben Arduino ile ek bir modül, SD kart falan kullanmadan ses çalmak istiyorum ama internette hep SD kart kullanarak ses çalmak üzerine yazılar ve videolar buldum. Ben ses verilerinin Arduino'nun program hafızasında durmasını istiyorum. Arduino'nun program hafızasının sıkıştırmasız veya uzun sesler için çok küçük olduğunu biliyorum, zaten düşük kaliteli ve kısa ses dosyaları hedefliyorum. Hesaplamalarım sonucunda sıkıştırma yapmadan koyulabilecek dosyanın ya anlaşılmayacak kadar kalitesiz ya da çoğunlukla işe yaramayacak kadar kısa olacağını bildiğimden sıkıştırmalı veriler koymayı, format olarak ise özellikle MP3, Vorbis, ADPCM ve Asao'yu hedefliyorum. Çıkışı özel bir PWM olarak almak istiyorum (yerleşik PWM özellikleri çok düşük frekanslı) ve çıkışı düzeltmek için bobin kullanmamın iyi olacağını biliyorum, ve ses çıkışında dalga yumuşatma istemiyorum (çıkış kare dalga formunda olmalı, bu kısım PWM ile karıştırılmamalıdır). Bununla birlikte bobinle PWM düzeltme esnasında 18-20KHz civarından daha aşağısını kesmek istemiyorum ve PWM frekansının da buna göre olması gerekiyor. Ayrıca sanırım ses çalarken aynı anda başka işlemleri yapmak için de bir yönteme ihtiyacım var. Bu konuda yardımcı olabilecek birileri var mı?




    < Bu mesaj bu kişi tarafından değiştirildi rikkoooooo -- 11 Haziran 2023; 23:31:34 >







  • benzer bişeyi ben de stm32 ile yapmak istiyorum. konuyu takip ediyor olacağım. atmel bilgim zayıf. hangi çevre birimleri var onu bile bilmiyorum. arduino ide'ye de çok yabancıyım.


    ama konsept olarak bana sorsan genlik olarak örneklenmiş herhangi bir dizi'yi DAC'e versen bence müzik çalarsın, neden olmasın? (daha önce yapmadım hiç, yapılmıyo olabilir)

  • scapegoat111 kullanıcısına yanıt

    Genlik olarak örneklenmiş herhangi bir diziyi vererek çalmak bence de mümkün, bunu tercih etmek istemememin sebebi bu yöntemle ses depolayabilmek için ya örnek oranı / bit derinliği çok düşük ya da çok kısa bir ses verisine gerek olması (hesaplarım sonucunda 11025hz örnek oranı ve saniye başına 4 bite (benim görüşüme göre sesin kolay anlaşılabildiği en düşük çözünürlük budur) sahip bir sesin Arduino Uno ve Nano'ya yaklaşık beş saniye sığdığını buldum). Daha kaliteli ve daha uzun sesleri depolayabilmek için bu codec'leri kullanmayı hedefliyorum (özellikle genel sıkıştırma için MP3 ve Vorbis, bit derinliğinin daha az önem taşıdığı noktalar için ADPCM, frekans açısından daha fakir ve daha tiz ağırlıklı sesler için Asao). Ayrıca bu yöntem kullanılacak olsa bile ses dosyasını diziye aktarma kısmı var. Ve bana DAC kullanmak yerine PWM sinyali alıp bobinle düzleştirmek daha mantıklı geldi. Bunun yanı sıra Arduino IDE'si kullanarak bu işlemi yapmak bu işlem hız gerektirdiğinden ve Arduino komutları daha yüklü olduğundan zor olabilir ve özel komutlar/teknikler gerektirebilir diye düşünüyorum, zira Arduino Microchip Studio ile programlanırken (Microchip şirketi Atmel'i satın alınca adı değişti) kullanılan komutlar daha hızlı çalıştığından daha kolay olacağını düşünüyorum.





  • Hesabınızı veya yol haritanızı şuna göre yapın.


    Uno : 32KB

    Mega:256KB


    Program hafızasına sahip.


    Her iki chipinde program hafızasının tamamını kullandığınızda (teknik olarak bir işe yaramayacak çünkü program kodlarınız için yer kalmamış olacak), sıkıştırmanız 11khz örnekleme ile;


    Uno: 2,9sn

    Mega : 23,2sn


    Ses depolayabilirsiniz.


    Kullanmayı planladığınız tüm sesleri, kullanmayı düşündüğünüz sıkıştırma formatı ile düzenleyin. Elde ettiğiniz dosya boyutu / boyutların toplamı yukarıdaki kapasitelerin altında ise projeniz üzerinde çalışmaya devam edebilirsiniz.


    Bu kapasitenin bir kısmı sizin yazacağınız program kodları tarafından kullanılacaktır (bu boyut yazacağınız program ve ihtiyaçlara göre değişir).




    Alıntı

    metni:
    Çıkışı özel bir PWM olarak almak istiyorum (yerleşik PWM özellikleri çok düşük frekanslı) .................... (çıkış kare dalga formunda olmalı, bu kısım PWM ile karıştırılmamalıdır).



    Özel pwm, ama pwm ile karıştırmayın kafam karıştı Arduino ile SD Kartsız Ses Çalma 




    < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 11 Haziran 2023; 21:18:43 >




  • rafet32 kullanıcısına yanıt

    Ben 11025Hz örnekleme oranına ve saniye başına 4 bite sahip bir sıkıştırmasız (her örneğin değerinin ayrı ayrı depolandığı, en temel şekilde depolanan) sesin sığma süresini şöyle hesapladım:

     11025 x 4 = 44100 (saniye başına bit)

     44100 / 8 = 5512.5 (saniye başına byte)

     32768 / 5512.5 = ~5.944 (sığacağı saniye)

    Bu hafızanın bir kısmı başka şeyler için kullanılacağından süreyi yaklaşık 5sn olarak aldım. Tabii ki bu değer Uno ve Nano gibi Atmega328 içerenler için, Mega gibi Atmega2560 içerenler için yaklaşık 40sn. Bu değerlerden daha fazlası için sıkıştırma kullanmayı hedefliyorum; özellikle de MP3, Vorbis, ADPCM ve Asao. Nasıl yapacağımı bilemediğim nokta ise sesleri bu formatlarda diziler haline getirmek ve Arduino'ya bunu çözdürmek.



    Kafa karışıklığına gelecek olursam:


    Biraz fazla karışık anlattığımın farkındayım, açıklamaya çalışayım. Ses sinyalini Arduino'dan PWM olarak almak istiyorum, çünkü ek parça kullanmak istemiyorum ve Arduino'nun analog pinleri çıkış için kullanılamıyor. Tabii böyle bir sinyali hoparlöre vermektense bir bobinle üst frekanslarını kesip normal, düz bir sinyal haline getirmek daha iyi olacaktır (sinyali ideal ses formuna, yani asıl hedeflenen dalgaya yaklaştıracaktır). Yalnız çıkışın kare dalga formunda, yani köşeli olmasını ve bu işlemde kesilen frekansların duyma aralığımızın dışında olmasını istiyorum çünkü düşük örnekleme oranlarında örnek geçişlerinde oluşan ve sesin aslında olmayan sesler bence sesi olmamasına rağmen daha kaliteli gibi gösteriyor. Tabii kesim frekansının dışarıda kalabilmesi için PWM frekansı da buna göre olmalı. Arduino'nun yerleşik PWM'i doğru düzgün ses çalamayacak kadar düşük frekanslı. Bu konuyu daha iyi açıklayabilmek için görseller hazırladım. İlk görsel karıştırılmaması gereken şeyleri anlatmak için (bu görsel temsili, gerçekte tam olarak böyle olmaz tabii ki):


    Arduino ile SD Kartsız Ses Çalma


    Bu görsel de çıkışı kare dalga formunda almak istiyorum derken kastettiğim şeyi daha iyi açıklamak için (bu görsel de temsili):


    Arduino ile SD Kartsız Ses Çalma


    İkinci görselde kastettiğim şey sinyalin hedeflenen / bobinle doğrultulmuş hali (1. görseldeki alttaki bölüm). Bununla birlikte 2.9sn ve 23.2sn değerlerini nasıl hesapladığınızı anlayamadım, açıklarsanız sevinirim. Ayrıca sanırım ses çalarken aynı anda başka işlemleri yapmak için de bir yönteme ihtiyacım var. Umarım yeterince açıklayıcı olabilmişimdir.




    < Bu mesaj bu kişi tarafından değiştirildi rikkoooooo -- 11 Haziran 2023; 23:51:15 >




  • Dijital sesi tekrar analog işarete çevirmek için 3,5 (üçbuçuk:) ) farklı yöntem kullanabilirsiniz.


    1: Dahili Pwm çıkışı

    2: Dahili DAC çıkışı

    3-a: 4 veya 8 bit (sesi kaç bit olarak işlediyseniz) op-amp toplayıcı devresi. Sizin çizimlerde anlatmaya çalıştığınız işaret çıkışı bu yöntem için daha uygun görünüyor. MP3 ü decode ettikten sonra (muhtemelen hazır bir kütüphane kullanacaksınız) dijital pinlere yazmadan önce kontrolü sizin alıp gerekli müdahaleyi yapmanız gerekecek.

    3-b: R-2R merdiven tipi DAC yapısı da kullanılabilir. Bu da bir çeşit toplayıcı aslında.


    Karedalga bir işaret üzerinde bobin veya kapasitör kullandığınızda köşeler keskin olarak kalmazlar, kullanım şeklinize ve değerine göre yuvarlaklaşmaya / formu değişmeye başlar. Bunu istemediğinizi söylediniz. O zaman bobin ve kapasitörden uzak durmalısınız veya istekleklerinizi gözden geçirmelisiniz.


    Yukarıdaki mesajdaki süreler 11khz örnekleme ve 8bit çözünürülük içindi. Bunu 4bit yaparsanız süreleri 2 ile çarpmanız yeterli.


    Hesaplama Yöntemi: Sıkıştırılmamış ham ses için


    Süre(sn) = Kapasite(KB)/Örnekleme Frekansı(Khz) = 32/11 = 2,9sn (bu sonuç 8bit için, 4 bit için x2 = 5,8sn)


    Size önerim parça parça ilerleyin. SD kart kullanan bir uygulama örneği ile başlayın, 4 bit kodlanmış olan dosyayı çalmaya çalışın.

    Çalabiliyorsanız bu sefer istediğiniz dalga formunda çıkış olabilecek şekilde ilgili kısmı düzenleyip yine aynı/daha iyi sesi elde etmeye çalışın. Bunların hepsi tamamsa, sd karttan kurtulup program hafızasında saklama kısmına geçersiniz.




    < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 12 Haziran 2023; 21:15:10 >




  • Ses çalarken aynı anda başka işler yapmak isterseniz


    A: Klasik süperloop yapısını kullanırsanız örnekleme frekasına bağlantılı olarak bir sonraki çalınacak ses örneği süresine kadar sabit ve kesinlikle uymanız gereken zamanınız olacak. Bu zamanı tam olarak korumak zorundasınız yoksa aynı örnekleme frekansında çalmazsanız ses bozulur. (11khz için bu süre 90 microsaniye).


    Her 90 micro saniyede; bir sonraki çalınacak ses dosyasınının ilgili kısmını sd kart veya program hafızadan okumanız, ayrıca diğer işlerinize yetecek kadar süre artırmanız veya artan zamana göre işlerinizi organize etmelisiniz. Yapacağınız işler bir 90us peryoda sığmayacak şekilde ise bunları parçalı çalışacak şekilde diğer 90us lik peryotlara yaymanız gerekmektedir.


    B: Interrupt (Kesme) konularını araştırın. Bazı işlemleri işlemcideki donanımlara yaptırmak hız ve yerine göre kolaylık sağlayabilir.


    C: RTOS konusunu araştırın.



    Edit: imla, anlatım bozukluğu düzeltme ve ilave açıklamalar...




    < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 13 Haziran 2023; 1:25:14 >




  • Aylar sonra yeniden merhaba, muhtelif nedenlerle uzun süredir buraya gelemedim fakat şimdi geldim çünkü aklıma bazı fikirler geldi ve ayrıca bazı fikirlerim de değişti. @scapegoat111 benzer bir fikriniz olduğu için sizi de bilgilendirmiş olayım.


    Öncelikle, belirtmeliyim ki ses formatları konusundaki fikrim değişti. Vorbis'in aynı bit hızı için gerçekten de çok kötü bir kalite verdiğini fark ettim ve ondan tamamen vazgeçtim, MP3'ten de umudum kalmadı çünkü canlı olarak çalamayacağımı düşünüyorum (saat hızı yetmeyecek gibi). Aslında bu projeyi SD kart kabul etmeyen bir yapıda değil de SD kart kabul eden fakat SD kart olmadan da çalışan bir yapıda yapmayı planlıyorum, yani SD kartın kullanılacağı bir durum için yine de gerçek zamanlı olmayarak MP3 decode etmek isteyebilirim (mesela Adobe Flash Player emülasyonu için MP3 şart). Nellymoser Asao konusunda daha umutluyum zira daha kolay decode edebileceğimi düşünüyorum (mesela MP3 çerçeveleri 1152 örneklik iken Nellymoser Asao çerçeveleri 256 örneklik), fakat Asao'nun patentinin süresinin dolmamış olabileceğini düşünüyorum. MP3'ünkiler dolduğu için bir belge bulabilme umudum halen daha var, hatta http://www.diva-portal.org/smash/get/diva2:830195/FULLTEXT01.pdf adresindeki bilgiler bile gayet detaylı. Muhtemelen birçok görev için 2 bit, 1.5 bit, ya da 1 bit ile kodlanmış ADPCM veya DPCM'ler kullanacağım.


    IMA ADPCM decoding konusunda da yardıma ihtiyacım var zira index-table ve stepsize-table konusunda kafam karıştı. index-table sadece sonraki örnekleri ilgilendiriyor ve şimdikini alakadar etmiyorsa hangi sekiz örneği alacağımı nereden bileceğim? Şimdikini de ilgilendiriyorsa -1,-1,-1,-1 kısmı iki tarafla beraber altı farklı olasılığın ziyanı anlamına gelmiyor mu? Ayrıca ilk örnekte hangi stepsize öğesini kullanmalıyım? Bu konuda da yardımcı olabilecek birileri varsa iyi olur. Hatta MS ADPCM bilen varsa daha da iyi olur. (Ekleme: Bunu ChatGPT'ye küçük bir kod yazdırarak kendim buldum, stepsize değeri MSB'nin tetiklediği değermiş ve diğer bitler LSB'ye doğru birer birer kaydırarak tetikliyorlarmış, ayrıca emin değilim ama galiba çoğunlukla ortadaki index değerinden başlanıyormuş. Fakat halen MS ADPCM bilmiyorum, bilen varsa yanıtlasın lütfen.)


    Açıkçası örnekleme oranı ve bit derinliği konusunda da fikrim değişti. Uygun müziklerle çoğu zaman 1378.125Hz ve 2756.25Hz gibi değerlerin bile yeterli olduğunu fark ettim. Öte yandan, farklı oranları aynı anda çalmak için bir "kaptan" örnekleme oranına ihtiyacım olacak ve hem 4 hem 8 bitle 32000Hz, 31250Hz, 22050Hz, 16000Hz, 15625Hz, 11025Hz, 8000Hz, ve 7812.5Hz kaptan örnekleme oranlarını kullanarak 16 farklı kaptan olasılığın uygun olacağını düşündüm. 31250Hz, 15625Hz, ve 7812.5Hz oranlarını muhtemelen daha fazla tercih edeceğim çünkü bunlar Arduino'nun çalışma hızının ikinin tam üssüyle çarpılmasıyla oluşan değerler ve bu sesin daha stabil çıkmasını sağlar diye düşünüyorum (sesin "tadı" 1378.125Hz, 2756.25Hz, 5512.5Hz, 11025Hz vb. oranlarda daha güzel oluyor fakat bu da dinlenemez değil). Tabii ki Adobe Flash filmlerini yürütmek için 5512.5Hz, 11025Hz, ve 22050Hz hızlarını kullanmaktan başka çarem yok.


    Ses çalma işinin icrasını Arduino'nun 62500Hz hızlı PWM'iyle yapmayı ve bunu bir de interrupt için kullanmayı düşünüyorum, böylece interrupt'ı tam zamanında gerçekleştirmiş olacağım fakat Arduino sanyiede 62500 defa interrupt edilmeyi kaldırır mı bilmiyorum. Örnekleme oranlarını tutturmak için ise sayaç, eksiltme, ve eşik kullanan bir sistem yapmayı düşünüyorum. Mesela 22050Hz örnekleme oranı için doğru hesapladıysam her interrupt'da 441 ekleyip eşiği geçince 1250 çıkartmak stabil olmasa da (örnekleme oranı 31250Hz ile 15625Hz arasında sürekli gidip gelecek) ortalama olarak 22050Hz'i tutturur diye düşünüyorum. Bu değerler mesela 31250Hz için 1 ve 2 olacak (bu örnekleme oranı 100% stabil olacak demektir).


    Bunu yumuşatmak için bobin veya kondansatör kullanmanın sinyalin köşelerini bozacağını biliyordum, aslında hedeflediğim sadece insan işitme aralığını çok fazla boğmamaktı ve görsellerin temsili olduğunu söylerken kastettiğim de buydu. Yumuşatmak için 50nf kondansatör kullanmayı düşünüyordum (işitme aralığını biraz bozsa da çok fazla boğmayan bir değer, tabii ki yumuşaklık mükemmel olmayacak) fakat RC filtre için gereken direncin ne kadar olduğunu bilmiyorum. Aslında hiç filtrelemeden bile geçirmeyi düşünebilirim, özellikle de amfi yerine doğrudan hoparlöre bağlayacağım durumlarda.




    < Bu mesaj bu kişi tarafından değiştirildi rikkoooooo -- 1 Nisan 2024; 15:34:51 >




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.