Ynt: stm32 microcontroller ve wav file

Başlatan Karamel, 15 Ağustos 2015, 01:49:39

OG

#15
Niçin Fark var, görsel olarak da anlaşılır

Hepsi 1KHz
Ancak farklı sıklıkda örnekleniyor.

6000_8_bit

6000_8_bit



22050_8_bit

22050_8_bit



44100_8_bit

44100_8_bit


96000_8_bit

96000_8_bit
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

LukeSkywalker

#16
Bilmem dikkatini çekti mi ama verdiğin linkte şöyle bir bilgi var :
What is Sample Rate?
Sample rate is the number of samples per second. CD-Audio has a sample rate of 44,100. This means that 1 second of audio has 44,100 samples. DAT tapes have a sample rate of 48,000.

When looking at frequency response, the highest frequency can be considered to be 1/2 of the sample rate.



Ayrıca bu işi timer kullanarak yapsan daha iyi olur.

mesaj birleştirme:: 15 Ağustos 2015, 12:31:42

Bir de data formatının  c1 h-l, c2 h-l şeklinde olduğunu nasıl anladın?
Şurada daha farklı bir bilgi verilmiş; http://www.neurophys.wisc.edu/auditory/riff-format.txt
      Sample 1

                     Channel 0    Channel 0   Channel 1    Channel 1
                      (left)       (left)      (right)      (right)
                     low-order   high-order   low-order   high-order
                       byte         byte         byte        byte


                            Data Packing for 16-Bit Stereo PCM


Karamel

#18
hocam bizi yaniltan z hocamin yazilimi oldu. software input u 16 bit olarak aliyor ama output u 8 bit olarak veriyor. bende lsb msb bytelerini yanlis anlamisim ama bikti 8 bit oldugundan bunu anlayamamisim.

neyse simdi konumuza geri donelim ve nasil yapilir i inceleyelim.

Gokhan hocam bana 16bit 44110 hz lin bir wav file in icerigi degistirilmeden alinmis bir ciktisini gonderdi. bunun ile 16 bit wav file i calmayi basardim. sonuc mukemmel değil. iyilestirmek gerekiyor ama ses caliyor. 8 bit ile tam kalitede cikis a ulasabildim ama 8 bitin kendi kalitesi dusuk oldugundan bunu begenmedim. simdi 16 bit wav file i tam kalitede calamiyorum. bunu halledince isi cozmus olacagiz. en iyisi ben birazdaha arastirma yapayim.

      value = 44;
      while(1)
      {
          Ses_Cal = 0;
          Ses_Cal =  Wav[value + 1];
          Ses_Cal = Ses_Cal << 8;

          Ses_Cal = Ses_Cal + Wav[value];
          //
          Ses_Cal = Ses_Cal / 16;

          DAC1_Advanced_Ch1_Output(Ses_Cal, conf1);
          
          Ses_Cal =  Wav[value + 3];
          Ses_Cal = Ses_Cal << 8;

          Ses_Cal = Ses_Cal + Wav[value + 2];

          Ses_Cal = Ses_Cal / 16;
          
          DAC1_Advanced_Ch2_Output(Ses_Cal, conf2);
          
          value++; value++; value++;  value++;  //

          Delay_us(19);

          if(value > 352800)
          {  

             value = 44;

             Delay_ms(3000);

          }
        }


mesaj birleştirme:: 15 Ağustos 2015, 17:44:29

simdi zamanlarda tutuyor. yaklasik 22.5 usn de bir update gerekliydi. aradaki code lari filan cikarinca 19 usn ile ses hizi normal oluyor. wav file beni ilk basta cok yaniltmis.

mesaj birleştirme:: 15 Ağustos 2015, 18:00:19

simdi bu dakikadan sonra hatalar sunlar olabilir.

-dac unit i ben duzgun calistirmayi basaramamis olabilirim. bunun icin soyle deneyler yapmak lazim. Ses_Cal in icersine 0xFFFF; degerini verince dac pinimden 3.3v gormem gerekli.(power) yine ses cal icersine 0x0000; verincede 0votage gormem gerkli. 0x8000; verincede tam orta noktada bir deger gormeliyim. eger bunlar tamamsa birde 22 usn de dac unit i update edip. acaba duzgun mu update oluyor diye test yapmak gerekli. eger hersey okay ise. sorunu baska yerlerde aramak gerekir.

-file i update ederken hata yapiyor olabilirim?

-file da sorun olmus olabilir.(ilk deneyden sonra artik her file dan suphe eder oldum! :P )

suan oscilloscope um olmadigin bu deneyleri yapamiyorum.

deney tam olarak sonuca ulasmis olmasada kismen basarili oldu gibi. :)

t2

#19
Wav file 16bit olunca galiba  baytlar ters oluyordu. Dosyadan okunan msb,lsb, çalarken,  yer degistirecek olabilir.

Bu yapılsa bile DAC a gondermeden once datayi düzeltmek gerek. Mesela sinyal yoksa wav data sıfır okunur. Halbuki DAC çıkışı sıfır değil beslemenin yarısı olması gerek. Yani dac 8bit olsa 128 göndermek gerek. 16 bit olsa ne gonderilecek?

Bence 16bit wav datasina öncelikle DC bias eklenir. Bu sayede min0,maksimum xxx olan 16 bit baytlar oluşur. Sonra bunu sağa kaydırarak 12bit dac'a uygun data elde edilir. Belki zaten öyle yapıldı.mesajları okumadım.

LukeSkywalker

@t2 neden 0 durumunda dac çıkışı beslemenin yarısı olsun?

Karamel

Alıntı yapılan: t2 - 15 Ağustos 2015, 18:16:21
Wav file 16bit olunca galiba  baytlar ters oluyordu. Dosyadan okunan msb,lsb, çalarken,  yer degistirecek olabilir.

Bu yapılsa bile DAC a gondermeden once datayi düzeltmek gerek. Mesela sinyal yoksa wav data sıfır okunur. Halbuki DAC çıkışı sıfır değil beslemenin yarısı olması gerek. Yani dac 8bit olsa 128 göndermek gerek. 16 bit olsa ne gonderilecek?

Bence 16bit wav datasina öncelikle DC bias eklenir. Bu sayede min0,maksimum xxx olan 16 bit baytlar oluşur. Sonra bunu sağa kaydırarak 12bit dac'a uygun data elde edilir. Belki zaten öyle yapıldı.mesajları okumadım.

2048 olmali hocam.

Alıntı yapılan: LukeSkywalker - 15 Ağustos 2015, 18:31:38
@t2 neden 0 durumunda dac çıkışı beslemenin yarısı olsun?

hocam t2 hoca sunu demek istemis.

simdi wav file cordinate axis in positive y kisminda kaliyor ama wav file icin origin OG hocamin gonderdigi fotolardan da anlasilacagi uzere ortadaki kirmizi cizgi olarak kabul ediliyor.

simdi wav file in value larini ayni ac signal inki gibi dusunelim ve minus deger alabildigini hayal edelim. en basta dac unit minus value veremez? daha sonra amplificator minus value icin ne der tam olarak bilemiyorum?

bu yuzden biz bu value yu positive y axis e cekmeliyiz. wav file value + 32768 yaparsak. wav file minus max value da. cikis 0v olur. wav file max positive value da cikis 3.3v olur.


biraz daha aciklayici olmasi acisindan. wav file -32768 <-> + 32768 arasinda degisiyor gibi dusunelim. bizim value degerimiz 0..65535 arasinda degisiyor.

Gökhan BEKEN

Alıntı yapılan: t2 - 15 Ağustos 2015, 18:16:21
Wav file 16bit olunca galiba  baytlar ters oluyordu. Dosyadan okunan msb,lsb, çalarken,  yer degistirecek olabilir.
Evet little endian oluyor genelde ama big endian formatında da kaydedilmiş olabilir. Goldwave programında raw data import ederken veya export yaparken soruyor little endian mı yoksa big endian mı olacağını.
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel

#23
t2 hoca aklima bir kurt soktu ve hemen deneyi yaptim. sonuc mukemmelden bir tik geride.!! :)

      value = 0; //value = 44;
      while(1)
      {
          Ses_Cal = 0;
          Ses_Cal =  Wav[value + 1];
          Ses_Cal = Ses_Cal << 8;

          Ses_Cal = Ses_Cal + Wav[value];
          //
          Ses_Cal = (Ses_Cal+32767) / 16;
          
          Line1 = Ses_Cal;
          
          Ses_Cal =  Wav[value + 3];
          Ses_Cal = Ses_Cal << 8;

          Ses_Cal = Ses_Cal + Wav[value + 2];

          Ses_Cal = (Ses_Cal+32767) / 16;
          
          Line2 = Ses_Cal;
          
          DAC1_Advanced_Ch1_Output(Line1, conf1);
          DAC1_Advanced_Ch2_Output(Line2, conf2);
          
          value++; value++; value++;  value++;  //

          Delay_us(17);

          if(value > 352800)
          {  
             value = 0; //value = 44;
             Delay_ms(3000);
          }



file in value larina 32767 degerini ekleyince ses cok ciddi miktarda duzelme gosterdi. yalniz halen bazi yerlerde ziriltilar var. buda file i duzgun yorumlayamadigimi gosteriyor.

mesaj birleştirme:: 15 Ağustos 2015, 18:55:49

Alıntı yapılan: Gökhan BEKEN - 15 Ağustos 2015, 18:48:40
Evet little endian oluyor genelde ama big endian formatında da kaydedilmiş olabilir. Goldwave programında raw data import ederken veya export yaparken soruyor little endian mı yoksa big endian mı olacağını.

hocam bizimkisi nasildi? file value larini swap yapmamiz gerekirmi?

Gökhan BEKEN

#24
Sana gönderdiğimde tersdi yani little endian.

dizi[]={0x12,0x34,0x56,0x78} şeklinde olanları 16 bit olarak şöyle çevirmen gerek : 0x3412,0x7856

Ek:pardon, sana gönderdiğim ilk dosya yani kendi sesimi kaydettiğim dosya öyledi.
Ama sen dingdong.wav dosyasını çevirmemi istedin ona bakmadım hangi formatta diye.

Ek:Şimdi baktım, 44100hz frekansında little endianmış bana gönderdiğin dosya.


Bu arada değişen bir şey daha var, dosyanın signed mi unsigned mi olduğunu da seçebiliyoruz, bu konudaki şimdiye kadar uğraştığımız bütün dosyalar signed idi. Belki unsigned yaparak bias olayını yapmaktan kurtulunabilir.
Özel mesaj okumuyorum, lütfen göndermeyin.

LukeSkywalker

#25
Peki ses cal ne olarak tanimli? Signed tanimli değilse hic bir anlami yok t2'nin bahsettigi olayin. Kayit -32768 ile 32767 arasinda mi degisiyor?

mesaj birleştirme:: 15 Ağustos 2015, 19:18:23

Evet simdi baktimda 8bit oldugunda datalar unsigned yani 0 255 arasinda degisirken 16 bit oldugunda -32768 ile 32767 arasinda degisiyor. 8 bit ses caldirirken boyle bir problemle karsilasmamistim. 16 bitte olay degismis.

Karamel

Hocam unsigned olarak yapmistim. Suan disaridayim. Gece yeniden bakayim ama.

t2

#27
Belki sinyal fazla ise kırpılma oluyor. bozulma sebebi bu olabilir. 32767 değil 32768 eklemek gerekebilir.

Gökhan BEKEN

Bir sorum var: x hz 16bit ses ile x*2 hz , 8 bit ses arasında kalite farkı var mıdır? Varsa hangisi daha kalitelidir?
Bunu dac'ın çözünürlük sıkıntısı için sordum, gerçi frekans artarsa işlemci daha fazla meşgul olacak ama merak ettim yinede.
Özel mesaj okumuyorum, lütfen göndermeyin.

Erol YILMAZ

Kimileri 24 bit 96 ve 192 khz arasındaki farkı duyduğunu iddia ediyor.

8 bit ile 16 bit arasında cevap veremedim şimdi :))