Picproje Elektronik Sitesi

DİJİTAL & ANALOG ELEKTRONİK => Ses Frekansı => Konuyu başlatan: Karamel - 15 Ağustos 2015, 01:49:39

Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 01:49:39
merhaba. wav player projeme baslaya bilmem icin yeterli bilgiye sahip olmadigim icin. adim adim. project in kisimlarini calisiyorum. ekran. microsd card. i2c vs vs adim adim. ilerledim.

simdi digital analog converter pinlerinden ses cikartmaya geldim.

bu baslikta 16 bit mono ve stereo olarak nasil caliyoruz. bunlari nasil yapiyoruz? bunu gorecegiz.

simdi hardware olarak stm32f103vet6 microcontroller kullandigimdan. wav file i 16 bit olarak okuyacagiz ama 12bit olarak digital analog converter dan cikartacagiz.

simdilik microsd card ile ilgili yeterli bilgim olmadigindan wav file i Z hocamin suradaki https://www.picproje.org/index.php/topic,35896.15.html (https://www.picproje.org/index.php/topic,35896.15.html) kendi yaptigi converter software i kullandim. tam bu noktada hocama birsey sormak isterim. hocam siz example lari hep 8 bit uzerinden yapmissiniz. ben microcontrollerdan ses alabiliyorum ama yinede sormak istedim. programiniz 16 bit wav file i duzgunce hex code una cevirebiliyormu? (bir takim bana mantikli gelmeyen seyler oluyor. bunun icin bu soruyu sordum)

forumda her yeri okudum sayilir. 16 bit wav file ile ugrasan hoca olmamis gibi. simdi biz hem 16 bit file ile hasir nesir olacagiz. hemde bunu stereo olarak yapacagiz.

simdi hocamizin programi ile wav file i convert ettikten sonra. software bize wav.c seklinde bir file olusturuyor. bunun icersindede wav file imiz soyle char Wav[]={ basliyor.

biz once digital converter pinlerini acacagiz. daha sonra bir dongu icersinde. frequence hizimiz kadar file i output a update edecegiz.

oyleyse haydi baslayalim.

      unsigned long value;
      unsigned long conf1;
      unsigned long conf2;   

      value = 0;
      DAC1_Init(_DAC_CH1_ENABLE | _DAC_CH2_ENABLE);
     
      conf1 = _DAC_12_BIT | _DAC_TRIGGER_SW | _DAC_RIGHT_ALIGN;
      conf2 = _DAC_12_BIT | _DAC_TRIGGER_SW | _DAC_RIGHT_ALIGN;
     
      Delay_ms(100);


bu code lar ile digital analog converter in 1st channel ini ve 2nd channel ini active diyoruz. simdi 16 bit wav file hakkinda biraz bilgimiz olmasi gerekiyor. bu bilgilere buradan http://www.topherlee.com/software/pcm-tut-wavformat.html (http://www.topherlee.com/software/pcm-tut-wavformat.html) ulasiyoruz.

linten gordugumuz uzere ilk 44 byte file in description kismi. yani burada ismi. boyu vs hersey var. biz bunlari zaten bildigimizden bunlarla ilgilenmeyecegiz.

44. byte tan sonra ilk iki byte bi channel. sonraki 2 byte diger channel seklinde sonuna kadar gidiyor.

channel 1st                    channel 2nd
HByte     Low byte         HByte     Low byte   
45.         46.                    47.         48.   


simdi biz ilk bas kismi ile ilgilenmedigimizden ve on kisim cok kisa oldugundan bunlarida calacagiz. halbuki 44. byte tan baslasak iyi oldurdu ama simdilik boyle yapalim. wav file imizi 16 bit. 22050hz  stereo  olarak ayarliyoruz.


      while(1)
      {
          Ses_Cal = 0;                                         // Degiskenimizi temizledik
          Ses_Cal =  Wav[value];                       // wav file imizin ilk high byteini aldik.
          Ses_Cal = Ses_Cal << 8;                     // bunu 8 bit sola kaydirdik.
         
          Ses_Cal = Ses_Cal + Wav[value + 1]; // sola kaydirdigimiz 16 bitlik degiskenimize. wav file in low byte ini ekledik.
         
          Ses_Cal = Ses_Cal / 16;                      // simdi zurna burada dirt ediyor. dac unit in 12 bit oldugunu soylemistik. burada 16 bitlik veriyi. 12 bit e donustuyoruz.
         
          DAC1_Advanced_Ch1_Output(Ses_Cal, conf1);     // verimizi channel 1 e update ediyoruz ve aynilarini channel 2 icinde yapiyoruz.
         
          Ses_Cal =  Wav[value + 2];
          Ses_Cal = Ses_Cal << 8;

          Ses_Cal = Ses_Cal + Wav[value + 3];

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

          Delay_us(85);
          if(value > 32256){value = 0; Delay_ms(3000);}  // wav file calininca counter degiskenimizi 0 yapip 3 sn bekliyoruz. sonra yine wav file imizi caliyoruz.
      } 



code umuzun uzerine gerekli aciklamalari yaptim. neden 22050 hz frequence kullandik. 16 bit file da en iyi sonucu boyle aldim.

dac unit ten pc hoparlor input una soyle bir devre kullandim.

(http://i.hizliresim.com/3aArk4.png) (http://hizliresim.com/3aArk4)

bu schematic i mikroe nin schematiclerinden arakladim  8) ama bu sanirim degerler bizim project imiz icin iyi degil ki. ses pc den cikas ses gibi degil.

sesi dduyup anlayabiliyorum ama boyle sarki dinlenecek sekilde degil. hafif hisirtilar var.



simdi sorularim soyle.

1- neden en iyi performance 22050 hz te cikti?
2- bu hisirtilarin problemi cikis a bagladigim devremi? bu devrem dogrumu? evet ise bunu neye gore sectik? yani mesela neden 3.3nf ta 10 nf degil? yada 10uf ta 1uf degil?

umarim bu yazdiklarimin. benim gibi yeni ogrenen kisilere faydasi dokunur...... ::)


mesaj birleştirme:: 15 Ağustos 2015, 02:06:41

bir baska sorumda. 1/22050 den bizim ornekleme frequence imiz yaklasik 45us olmaliyken neden iki katinda duzgun sonuc aldik?
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 02:13:41
16 bit DAC olacak ki 16 bitlik ses alasın. Hatırladığım kadarıyla stm32'lerde 12bit dac var(hepsinde aynı olmayabilir)
goldwave gibi bir program ile ses dosyasını aç, kaydederken 12 bitlik olarak kaydet. Sonra HxD hex programı ile dosyadaki bütün byte'ları kopyalayıp boşlukları " ,0x" olarak değiştir notepad++ ile. Bu verileri diziye at, programa öyle ver.

düzeltme: 12bit kayıt yapılmıyor
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 02:24:40
hocam ben zaten sesi 16 ya boylerek 12 bit elde ediyorum?  :-\
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: tekosis - 15 Ağustos 2015, 02:25:22
gökhan hocam karamel programında 16  bitlik verinin ilk 4 bitini yok edip 12 bite çevirmiş. sesteki kalite kaybının nedenlerinden birisi bu olabilir. karamel ayrıca aşağıdaki şema ses kalitesini arttırabilir. şema mikromedia plus for stm32 arm devresinden kırpıntıdır :)

(http://s2.postimg.cc/x95k821ad/sound.jpg) (http://postimg.cc/image/x95k821ad/)
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 02:25:52
12bit 22050hz'lik wav demek, saniyede 22050 adet 12bit eşit süre aralığıyla gidecek demek,
1sn=1000000us eder
saniyede 22050 adet 12bit demek, her 12 bit de bir  1000000/22050 =45,35147392290249 us bekleyeceksin demektir.

senin programda 85us bekleme var bunu neye göre yaptın? Sesi dinlerken yavaş çalması gerekir.
Bu arada byte sıralamasını 1byte kaydırırsan seste bozukluk olur.
Dediğim yöntemle sesi çevirip, dediğim süre kadar bekleme yaparak dener misin?
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 02:39:53
Alıntı yapılan: tekosis - 15 Ağustos 2015, 02:25:22
gökhan hocam karamel programında 16  bitlik verinin ilk 4 bitini yok edip 12 bite çevirmiş. sesteki kalite kaybının nedenlerinden birisi bu olabilir. karamel ayrıca aşağıdaki şema ses kalitesini arttırabilir. şema mikromedia plus for stm32 arm devresinden kırpıntıdır :)

(http://s2.postimg.cc/x95k821ad/sound.jpg) (http://postimg.cc/image/x95k821ad/)

hocam bende zaten buradan kopya cektim ama bunlarin nasil calistigini anlamadan yaptim oldu seklinde calismak. ogretici olmuyor. bunun nasil olmasi gerektigine aciklayici bir cevap veren hoca ile bu schematic i test etmek lazim.  :-\

Alıntı yapılan: Gökhan BEKEN - 15 Ağustos 2015, 02:25:52
12bit 22050hz'lik wav demek, saniyede 22050 adet 12bit eşit süre aralığıyla gidecek demek,
1sn=1000000us eder
saniyede 22050 adet 12bit demek, her 12 bit de bir  1000000/45,35147392290249 us bekleyeceksin demektir.

senin programda 85us bekleme var bunu neye göre yaptın? Sesi dinlerken yavaş çalması gerekir.
Bu arada byte sıralamasını 1byte kaydırırsan seste bozukluk olur.
Dediğim yöntemle sesi çevirip, dediğim süre kadar bekleme yaparak dener misin?

hocam sanirim message imi iyi okumadiniz?

bende bunu dedim zaten. z hocamin programi suan bizi yaniltiyor olabilir. wav i tam olarak donusturmemis olabiliriz. ayrica su cikis kismindaki devre bizim devremize uygmuyor gibi hissediyorum.

ses cikiyor. bozuk degil. sadece belirli kisimlarinda hisirti cikiyor. tam hangi yerlerde sorun cikiyor? bunun deneyini nasil yapacagim bilmiyorum.

hesaplari bende yaptim hocam. yaklasik 45 us de bir systemi refresh yapmami gerekirken neden duzgun sonucu bunun 2 katinda aliyoruz? (45us de ses hizlandirilmis gibi oluyor)

mesaj birleştirme:: 15 Ağustos 2015, 02:43:25

Gokhan hocam. imkaniniz varsa 1-2 sn lik. 44100 khz yada 22050 khz frequance ta bir wav file i convert edip. ses hali ile hemde wav.c hali ile bir yere upload edebilirmisiniz?

su kisimdan goldwave gibi bir program ile ses dosyasını aç, kaydederken 12 bitlik olarak kaydet. Sonra HxD hex programı ile dosyadaki bütün byte'ları kopyalayıp boşlukları " ,0x" olarak değiştir notepad++ ile. Bu verileri diziye at, programa öyle ver. birsey anlamadigim icin bunu sizden istedim.

hocam birde mumkunse quality 16 bit olsun. ben bunu software olarak bolup 12 bit yapiyorum.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 02:49:11
Delay_us(85); fonksiyonun gerçekten 85us mi bekletiyor?
Bu fonsiyonu test etmelisin. Osiloskopun olsaydı iyi olurdu.

Şimdilik şöyle bir deneme yaparsan anlarız belki:
while(1){
Delay_us(1000000);
ledtoggle();
}

ama değer çok büyük olduğu için hata verebilir, eğer verirse şöyle yap
while(1){

   unsigned int i=1000;
   while(--i){
      Delay_us(1000);
   }

   ledtoggle();
}



Dosyayı birazdan atarım.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 02:51:32
hocam logic analyzerim ile test yapayim ama cikti degerinin kuculecegini sanmiyorum. bence 85 ten yuksek bir deger cikacak. cunku ortada code lar isleniyor. hemen deneyi yapayim.

mesaj birleştirme:: 15 Ağustos 2015, 02:58:06

hocam result 88.5 us iste. 45us nin yaklasik 2 kati. peki neden boyle?

mesaj birleştirme:: 15 Ağustos 2015, 03:09:14

bu arada teknosis hocanin isret ettigi kisimlari bread board a ekledim. ses daha kotu oldu. ilk hali daha iyiydi.

bu kisim sesin degisimine etki ediyor. burayi bilimsel olarak incelemek gerekli.

mesaj birleştirme:: 15 Ağustos 2015, 03:36:33

bir dakika!

z hocamizin programi sanirim beni kandiriyor. 8 bit mono 44100 hz de 66672 byte cikti veriyor. bunu 16 bit stereo 44100 hz yapiyorum. yine ayni byte ciktiyi veriyor ama dosyanin boyutu degisiyor. yani sorun convert isleminde olmali!
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 03:50:19
diziye attım:
http://www.gokhanbeken.com/dosyalar/sesdeneme123.txt (http://www.gokhanbeken.com/dosyalar/sesdeneme123.txt)

z hocanın programı ile oluşturduğun diziyi notepad++ ile açıp ",0x" leri sil, hex editöre yapıştır, bunu .raw olarak kaydet. Sonra goldwave ile aç, sana kaç bitlik ve kaç frekansta açmak istediğini felan soracak, gerekli ayarları yap,
dinlediğinde ses bozuk geliyorsa, hocanın çeviride sorun var diyebilirsin.



Ekleme:
Yukarıda verdiğim dosyayı bilgisayardan raw formatında(headersiz) dinlemek için bunu indir: http://gokhanbeken.com/dosyalar/ses_deneme_123-stereo.raw (http://gokhanbeken.com/dosyalar/ses_deneme_123-stereo.raw)
goldwave programına import et, 22050hz, 16 bit, stereo  ve "little endian" seçili olsun.
Sonra play tuşuna bas dinle.

Eğer media player vs direkt dinlemek istersen dosyanın orjinali bu: http://gokhanbeken.com/dosyalar/ses_deneme_123-stereo.wav (http://gokhanbeken.com/dosyalar/ses_deneme_123-stereo.wav)
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 04:05:00
hocam verdiginiz linkten copy paste yapamiyorum. paste yapinca tek bir satira herseyi yazmaya calisiyor. compielr boyle satir olmaz diyor.

hocam sanirim bunu yazilim ile yaptiniz? sizden rica etsem. 8 yada 16 short sonunda bir enter ekleyebilirmisiniz? asagidaki gibi mesela.

,0x6301 ,0x6301 ,0x1A02 ,0x1A02 ,0x8C01 ,0x8C01 ,0x5800 ,0x5800 ,0xEAFF ,0xEAFF ,0x0201
,0x0201 ,0x0003 ,0x0003 ,0xA604 ,0xA604 ,0x2405 ,0x2405 ,0xA004 ,0xA004 ,0x0E04 ,0x0E04


mesaj birleştirme:: 15 Ağustos 2015, 04:06:40

hocam birde muzik ile deney yapsak daha belirgin olur. cunku bunu calinca hatayi anlamayabilirim. diyorum ya. anlasilacak kadar iyi caliyor. ama muzik dinleyebilecek kadar iyi degil.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 04:11:34
Compiler öyle diyemez, dese dese IDE der, ben şimdiye kadar hiç bir IDE'de böyle bir sorunla karşılaşmadım.
Hangi IDE ve compiler'da deniyorsun?
Müzik ile yapmak için çok uzun bir buffer'a ihtiyaç var, bir c programı yazıp array'e çevirme işini onla yapmak lazım, hex editörü ile çevirmek zor oluyor kopyala yapıştır ile.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 04:12:45
hocam mikroc for arm.

hocam bir satir a bu kadar cok letter yazamazsin diyor. yani butun array tek satir a yazilmaya calisiyor.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 04:22:16
Yine mikroc yine hata :D yıldık vallahi
neyse ben şimdi bir program hazırlıyorum, senin textini belirlediğin uzunluğa getirecek
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 04:44:02
az once 8 bit lik ses dosyasinda birsey farkettim. 44100 hz 8 bit wav file da ses kalitesi daha tatmin edici. yalniz sunu farkettim. ses biterken. yani kisilirken. tam o esnada cizirti basliyor. digital analog converter cikisindaki resistor ve capacitor lu devreyi duzgun yapamadigim icin buna neden oluyor.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 04:47:54
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int GetFileSize(FILE *dosya);

FILE *input;
FILE *output;



int main(int argc, char *argv[]) {

unsigned int kacKarakterSonraEnterGelsin=16;
printf("Kac karakter sonra enter gelsin..:");
scanf("%d",&kacKarakterSonraEnterGelsin);


printf("\r\n");


input=fopen("input.txt", "rw+");
if(NULL == input)
    {
        printf("input.txt bulunamadi!!!\n");
        return 1;
    }
   

output=fopen("output.txt", "w+");
if(NULL == output)
    {
        printf("output.txt bulunamadi!!!\n");
        return 1;
    }

unsigned int dosyaBoyutu=GetFileSize(input);
printf("input dosyasi: %d byte",dosyaBoyutu);

unsigned int i=0;
while(i<dosyaBoyutu){
unsigned char buffer[500];
fread(buffer,1,kacKarakterSonraEnterGelsin,input);

fwrite(buffer,1,kacKarakterSonraEnterGelsin,output);
fprintf(output,"\r\n");

i+=kacKarakterSonraEnterGelsin;
}




printf("islem tamamlanmistir\r\n");
printf("Her %d karakterde bir satir basi yapilmistir.",kacKarakterSonraEnterGelsin);





fclose(input);
fclose(output);

char bekle=0;
scanf("%c",&bekle);

  return 0;
}

unsigned int GetFileSize(FILE *dosya){
unsigned int dosyaBoyutu=0, kaldigiYer=0;
kaldigiYer=ftell(dosya);
fseek(dosya, 0L, SEEK_END);
dosyaBoyutu=ftell(dosya);
fseek(dosya,kaldigiYer, SEEK_SET);
return dosyaBoyutu;
}

Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: OG - 15 Ağustos 2015, 04:53:26
Niçin Fark var, görsel olarak da anlaşılır

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

6000_8_bit
(http://s22.postimg.cc/ht1atxor5/Ekran_Al_nt_s.png) (http://postimg.cc/)
6000_8_bit (http://postimg.cc/index.php?lang=turkish)



22050_8_bit
(http://s23.postimg.cc/ji8iervd7/22050_8_bit.png) (http://postimg.cc/)
22050_8_bit (http://postimg.cc/index.php?lang=turkish)



44100_8_bit
(http://s13.postimg.cc/77elajazr/44100_8_bit.png) (http://postimg.cc/)
44100_8_bit (http://postimg.cc/index.php?lang=turkish)


96000_8_bit
(http://s2.postimg.cc/i1hayysjt/96000_8_bit.png) (http://postimg.cc/)
96000_8_bit (http://postimg.cc/index.php?lang=turkish)
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: LukeSkywalker - 15 Ağustos 2015, 12:15:21
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 (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
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: selimkoc - 15 Ağustos 2015, 13:15:50
Ses dönüşümleri için http://audio.online-convert.com/convert-to-wav (http://audio.online-convert.com/convert-to-wav) kullanabilirsiniz.

Burada bir uygulama yapılmış http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/f2014/wz233/ECE%204760%20Final%20Report%20(HTML)/ECE%204760%20Stereo%20Player.html (http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/f2014/wz233/ECE%204760%20Final%20Report%20(HTML)/ECE%204760%20Stereo%20Player.html)

burada da var;
http://tahmidmc.blogspot.com.tr/2015/01/audio-player-using-pic32-microsd-card.html (http://tahmidmc.blogspot.com.tr/2015/01/audio-player-using-pic32-microsd-card.html)
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 17:42: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. :)
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: 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.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: LukeSkywalker - 15 Ağustos 2015, 18:31:38
@t2 neden 0 durumunda dac çıkışı beslemenin yarısı olsun?
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 18:47:02
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.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 18:48:40
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ı.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 18:54:44
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?
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 18:58:59
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.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: LukeSkywalker - 15 Ağustos 2015, 19:11:58
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.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 15 Ağustos 2015, 20:28:36
Hocam unsigned olarak yapmistim. Suan disaridayim. Gece yeniden bakayim ama.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: t2 - 15 Ağustos 2015, 20:59:34
Belki sinyal fazla ise kırpılma oluyor. bozulma sebebi bu olabilir. 32767 değil 32768 eklemek gerekebilir.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 15 Ağustos 2015, 21:56:24
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.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Erol YILMAZ - 15 Ağustos 2015, 22:16:10
Kimileri 24 bit 96 ve 192 khz arasındaki farkı duyduğunu iddia ediyor.

8 bit ile 16 bit arasında cevap veremedim şimdi :))
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: t2 - 15 Ağustos 2015, 22:39:12
Sesi 8 bit kaydedip, cooledit goldwave gibi program ile 16 bite çevirip dinlersek pek fark duymayız

Örnekleme hızını 2 kata çıkarıp çözünürlüğü yarıya indirmek  algılanan kaliteyi  nasıl etkiler?
Galiba sesteki frekans bileşenlerine bağlıdır.

Telefon kalitesindeki sesi  yüksek çözünürlükte veya yüksek hızda örneklemek pek fark oluşturmayacağı için farketmiyormuş gerek yokmuş denebilir. Müzik sesi hatta bazı  enstürmanların sesi için durum farklı olur
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 16 Ağustos 2015, 00:47:50
Alıntı yapılan: Gökhan BEKEN - 15 Ağustos 2015, 21:56:24
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.

hocam bu duruma gore degisiyor. yani goreceli. einstein in relativity theorysi gibi :P

mesaj birleştirme:: 16 Ağustos 2015, 01:32:26

hocam kaliteden kasit olarak neyi anladigimiza bagli bu durum.

OG hocamin paylastigi resimleri incelerseniz. frequence in fazla olmasinin detaylari iyi yakamalamaya yaradigini farkediyoruz. mesela 6000 hz olani bin celeyin ve aklinizda her noktanin uclarini birlestirin. sonuc karemsi birsey olacaktir. frequance arttikca signal gercek bir sinus signaline benzemis. yani frequence imiz arttikca x axies teki kalitemiz artiyor.

peki bit artince neler oluyor?

bu seferde 0-3.3 voltage arasini 256 adimda değilde 65536 adimda geziyoruz. buda y axis teki kalitemizi arttiriyor.



benim deneylerime gore. bit arttikca dip gurultusu azaldi. cunku soyle dusunelim. bir bitlik gurultu babinda degisim var. 0x80 ile 0x81 arasi 3.3/256 kadar. bu amplicator icin yuksek bir deger. kulagimiz bu degisimi hissediyor.

ama 16 bit olunca durum. 3.3/65536 kadar oluyor. buda digerinden 256 kat daha dusuk bir dip sesi demek.

frequance artincada sesin ayrintilari artiyor. mesela wav file imiz speech icersin. frequance dusukken adamin dediklerini iyi anlayamiyoruz. freance artincada OG hocamin resimlerinden faydalanarak bunu anlayabilirsiniz ki. ayrintilar cok belirgin oluveriyor.




mesaj birleştirme:: 16 Ağustos 2015, 01:50:43

suan ulasabildigim son nokta yi hocalarimla paylasmak istedim.

suan wav file i mukemmel bir sekilde okuyoruz caliyoruzda. ses bir sart saglanirsa mukemmel. o sart nedir bunu resimler uzerinden aciklamaliyim.

(http://flfa.ir/wp-content/uploads/2015/01/adobe-audition-waveform.png)

resimde bir music file var. uzantisinin ne oldugu bizi ilgilendirmiyor. hepsinin ic yapisi bu sekilde. originden yukariya yada asagiya dogru surekli hareket ediyor. originden usaklasmasi sesin volume unu belirliyor. mesela resimde uc noktalari sivri olan kisimlarda volume yuksek. mesela birisi orada microphone a parmagiyla pit pit diye vurmus olabilir. orta kisimlarda ses normal.

simdi ben Gokhan hocamdan dingdong kapi zili wav file ini convert etmesini istemistim. hocamin ilk konvert ettigi file sanirim kendi sesi idi. pc microphone u gibi birsey ile kaydedilmis. bu tarz kayitlar ile calisirsak. hata olsa bile hatayi anlamayabilirdik. cunku kayit. music gibi değil. bende hem kisa olsun. hemde hatamiz olunca bunu sesin farkliligindan anlayalim diye dingdong u hocama onerdim.

neyse. simdi bizim wav file imiz normal. yani yukaridaki gibi. ani ziplamalarimiz yok. pc de acinca bu peak lerin olmadigini anlayabiliyorum. peki peak lar olursa ne olur? ses oralarda cat pat diye patlar. yani oralarda bozulur.

simdi biz belli seviyeye kadar sesi peak yaptirmadan dac unit e atabiliyoruz. ama belirli bir seviyeden sonra dac tan 12 bitten daha fazla value degerinde bilgi cikmaya calisiyor. tabiki cikamiyorda. biz onu cat pat diye duyuyoruz.


resimin orta kismindaki normal yukselmelere bakalim. bizim file imiz resimdeki file in orta kismina benziyor. yani peak yok. ama biz normal olan bu sesi dac a duzgun aktaramadigimizdan peak ler olusuyor. peki buna sebep olan sey nedir?

biz 16 bit lik signed file i unsigned hale cevirip. duzgunce bunu 16 ya bolup 12 bitlik file elde edemiyoruz. dingdoonnnnnn kisminda volume yuksek oldugundan cizirtilari duyuyoruz. nggggggggg kisminda ve sonunda cizirti yok. pc de nasilsa speaker lardan da aynisi cikiyor. yani wav file in basinda cizirtilar duyuyoruz. ortasi ve sonunda duymuyoruz.


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

          Ses_Cal = (Ses_Cal + Wav[value] + 128);

         
          Ses_Cal = (Ses_Cal) / 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(19);
      }


16 ya değil. 32 ye boldum yine olmadi. 32767-32768-32769 denedim olmadi. zaten olmamasi normal. 32768 olmasi gerekir. 32767 yasarsam alttan - 1 olur. 32769 yarsamda ustten 65536 olur. bizim 65535 olmasi gerekli. yine bunlar peak a neden olur. signed. unsigned converting ini beceremedim. bu saatten sonra unsgined olarak decode edilmis bir wav file i tertemiz calabiliriz ama bizim isimiz deney yapmak oldugundan bu sorundan birseyler ogrenmeliyiz. simdi ben ogrenmek istiyorum. signed degiskeni unsigned haline bozmadan nasil ceviririm?
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 16 Ağustos 2015, 04:08:57
tamam. tezim dogruymus. biz suan icin. signed value yu unsigned form a duzgunce donusturemiyoruz. sesi 8 kat kistim. suan hic peak almadan calabiliyorum. quality excellent!  :P

simdi bir hocamin bana signed formdan neden unsigned form a duzgunce gecemedigimizi anlatmasini bekliyorum.

sorun burada:


          Ses_Cal = 0;
          Ses_Cal =  Wav[value + 1] + 128;
          Ses_Cal = Ses_Cal << 8;

          Ses_Cal = (Ses_Cal + Wav[value] + 128);

         
          Ses_Cal = (Ses_Cal) / 16;
         
          Line1 = Ses_Cal;




mesaj birleştirme:: 16 Ağustos 2015, 04:10:08

degiskenlerimizde boyle

unsigned long value;
unsigned long conf1;
unsigned long conf2;

unsigned int Ses_Cal = 0;


mesaj birleştirme:: 16 Ağustos 2015, 04:10:39

wav degiskenimizde boyle:

const unsigned char Wav[352846]={.........
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: OG - 16 Ağustos 2015, 06:25:37
1KHz 1 alternans 16 bit bir ton ürettim (cooledit ile).

(http://s16.postimg.cc/e3yk5kud1/6000_16.png) (http://postimg.cc/)
6000_16 (http://postimg.cc/index.php?lang=turkish)

Wav olarak kaydettim.
Wav dosyayı incelemek için Hex Workshop ile açtım.

(http://s3.postimg.cc/pbgal4vjn/Ekran_Al_nt_s.png) (http://postimg.cc/)
Hex Workshop (http://postimg.cc/index.php?lang=turkish)

Datayı export edip açıklamalar ekledim.

'' İlk 44 Byte header
52 49 46 46 32 00 00 00 57 41 56
45 66 6D 74 20 10 00 00 00 01 00
01 00 70 17 00 00 E0 2E 00 00 02
00 10 00 64 61 74 61 0E 00 00 00

'' Örneklenen datalar (16 bit, signed, little endian)
01 00  (          1) => 1. nokta
B0 4C ( 19632) => 2. nokta
B0 4C ( 19632) => 3. nokta 
00 00  (          0) => 4. nokta
50 B3  (-19632) => 5. nokta
51 B3  (-19631) => 6. nokta
00 00   (          0) => 7. nokta         



Üretilen data signed, little endian olarak işlenmiş. Data üretirken, işlerken herhalde bunlara dikkat gerekir. t2' nin dediği DAC yapılanması konusunda da bu şartlara uyulmalı.

Bahsi gecen dosyalar ektedir.

Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 17 Ağustos 2015, 17:50:32
hocam merhaba.

windows calculator u programmer moduna aldim.

4CB0 hex icin. 19632 ondalik sayi sina denk geliyor?

B350 hex icin. 45904 ondalik sayisina denk geliyor? burada bir yanlislik var.bu sayi icin - 19632 demissiniz? bunu nasil buluyoruz? sorun bu kisimda.


mesaj birleştirme:: 17 Ağustos 2015, 17:53:55

ben deneyi bir kac gun once yaptiydim.

minus ve positive value lari 8 kat kuculttum. o cizirti gitti. sorun signed value yu unsigned forma duzgunce cevirememek. bunu yanlis degisken tanimlamasi ilede yapiyor olabilirim. yada mesela char a yi unsiged char b ye unsigned halde gondereceksek.


b = a + 127; seklinde bir cozum. dogru olmuyor.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: t2 - 17 Ağustos 2015, 18:09:39
8'e bölmeye gerek yok. yanlış işlem.
8 kat kuculttme ile sorun çözülmüş gibi görünse de yanlış olmuş. Yanlışı yanlış ile düzeltmeye çalışmaktır.

işin doğrusu şu:

wav dosyadan okunan baytlar yer değişecek ! Sağ ile  sol
OG arkadaşın bildirdiği şekilde,
Wav dosyadaki  B0 4C (=19632) => 2. nokta  bu bilgi doğrudur.

Ancak hex calculatore  B0 4C yazarsak decimal olarak  19632 olmaz. 
4CB0  yazmak gerek.  4CB0  = 19632
Demek ki wav dosyadan 2 bayt okuyacağız. fakat  2bayt yer değişecek!

Sonra bu 2baytlık, signed integer datasına 32768 bias eklenecek, böylece wav data, kesin  pozitif olacak. (0..65535 arası )
Sonra 4 bit sağa kaydıracağız (yani /16) böylece data pozitif ve 12 bit olacak. daha sonra DACa uygulanacak.

Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 17 Ağustos 2015, 18:14:24
signed verilerin ilk biti zaten işaret oluyor. İlk bit 1 ise negatif, 0 ise pozitif.
Yalnız diğer bitler de terslenmiş oluyor, 0 olanları 1 gibi, 1 olanları 0 gibi düşünerek hesaplayıp, sonra en soldaki bitin durumuna göre negatif veya pozitif diyeceksin.
örneğin:
char sayi=0x80; // yani 0b10000000 => -128
char sayi=0xC0; // yani 0b11000000 => -64
char sayi=0xE0; // yani 0b11100000 => -32
char sayi=0xF0; // yani 0b11110000 => -16
char sayi=0xFF; // yani 0b11111111 => -1
char sayi=0x00; // yani 0b00000000 => 0


denemek için, hesap makinesinin programcı modundaki ayarlardan sayı türünü byte seç
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: LukeSkywalker - 17 Ağustos 2015, 18:29:30
t2 işi bitirmiş. Aynılarını yazıyordum sonradan mesajı gördüm.
value değişkenini signed olarak tanımla.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 17 Ağustos 2015, 18:50:03
Alıntı yapılan: t2 - 17 Ağustos 2015, 18:09:39
8'e bölmeye gerek yok. yanlış işlem.
8 kat kuculttme ile sorun çözülmüş gibi görünse de yanlış olmuş. Yanlışı yanlış ile düzeltmeye çalışmaktır.

işin doğrusu şu:

wav dosyadan okunan baytlar yer değişecek ! Sağ ile  sol
OG arkadaşın bildirdiği şekilde,
Wav dosyadaki  B0 4C (=19632) => 2. nokta  bu bilgi doğrudur.

Ancak hex calculatore  B0 4C yazarsak decimal olarak  19632 olmaz. 
4CB0  yazmak gerek.  4CB0  = 19632
Demek ki wav dosyadan 2 bayt okuyacağız. fakat  2bayt yer değişecek!

Sonra bu 2baytlık, signed integer datasına 32768 bias eklenecek, böylecek wav data, kesin  pozitif olacak. (0..65535 arası )
Sonra 4 bit sağa kaydıracağız (yani /16) böylece data pozitif ve 12 bit olacak. daha sonra DACa uygulanacak.

iyide hocam ayni seyleri dene dene duruyorum.

yukarida anlattiklarinizinda deneyini yaptim. isler bir yerde karisiyor. bunu oscilloscope um ile yada debug ile goremeyince. labirete birakilmis fare gibi. surekli ayni yerlerde dolasip duruyorum.

          int Ses_Cal;


          Ses_Cal = 0;
          Ses_Cal =  Wav[value + 1];

          Ses_Cal = Ses_Cal << 8;

          Ses_Cal = (Ses_Cal + Wav[value]);
         
          Ses_Cal = Ses_Cal + 32768;
         
          Ses_Cal = (Ses_Cal) / 16;
         
          Line1 = Ses_Cal;



benim bu code larim ne yapiyor?

44 + 1 inci byte i okuyor. (msb) ve ses cal degiskenimizin icine yerlestiriyor.

daha sonra bunu 8 kere sola kaydiriyor. ve 44 uncu byte ile topluyor.

ses cal a 32768 i ekliyor.

bunu 12 bit e donusturmesi icin. 16 ya boluyor.

Line1 degiskeni digital analog converter in degiskeni.

DAC1_Advanced_Ch1_Output(Line1, conf1);

buda degerimizi analog olarak output ediyor.


yani sizin soyledikleriniz ile olanlar ayni ama. olmuyor iste. sesi 8 kat kisma nedenim. deney yapmakti. 8 kat kisinca oluyor tamam bu is bitti seklide bir deney değildi. 8 kat kisinca neden hersey normal mis gibi oluyor? cunku signed value belli degerleri(mesela atiyorum 10000 den yukarisi veya - 10000 den asagisi) asinca. bizim system duzgun calismiyor. orada bunu kanitladik.

Alıntı yapılan: LukeSkywalker - 17 Ağustos 2015, 18:29:30
t2 işi bitirmiş. Aynılarını yazıyordum sonradan mesajı gördüm.
value değişkenini signed olarak tanımla.

hocam value signed olsa ne degisecek ki? o array in degerini tutuyor? mesela

value = 44;

Ses_Cal =  Wav[value + 1]; // 45 inci byte i al?


mesaj birleştirme:: 17 Ağustos 2015, 18:56:40

burada signed ve unsigned konularini hoca anlatmis. sayilerin birbirlerini compliment etmesi gerekiyormus. bunun icin. en sol bit logic 1. diger bitlerin bit degerininde degisik olma sebebi. mesela +42 ile - 42 yi toplayinca 0 yapabilmesi. bunlari degistirmezsek toplayinca 0 yapamazmis. suan icin matematik diyorum. baskada birsey demiyorum ::)

https://www.youtube.com/watch?v=0MSmwdX5jlw (https://www.youtube.com/watch?v=0MSmwdX5jlw)
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: fatih6761 - 17 Ağustos 2015, 18:58:01
@Karamel bir de şunu denesen?

signed short Ses_Cal;
Ses_Cal = *(signed short *)(&Wav[value]);
Ses_Cal /= 16;
Ses_Cal += 2048;
Line1 = Ses_Cal;
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 17 Ağustos 2015, 19:01:25
hocam Wav array icersindeki bilgiler 8 bitlik. fakat bunlarin byte yerlerini degistirip birbirine toplayinca 16 bit oluyorlar.

siz anladigim kadariyla burada Ses_Cal = *(signed short *)(&Wav[value]);   

Wav[value] array in icersini 16 bitlik olarak dusunmussunuz.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: fatih6761 - 17 Ağustos 2015, 19:08:25
Alıntı yapılan: Karamel - 17 Ağustos 2015, 19:01:25
hocam Wav array icersindeki bilgiler 8 bitlik. fakat bunlarin byte yerlerini degistirip birbirine toplayinca 16 bit oluyorlar.

siz anladigim kadariyla burada Ses_Cal = *(signed short *)(&Wav[value]);   

Wav[value] array in icersini 16 bitlik olarak dusunmussunuz.
@Karamel orada işaretçi aritmetiği var. Wav dosya içinde veriler Little Endian saklanıyorsa (ki muhtemelen öyle) derleyici o iki baytı zaten 16-bit lik veriymiş gibi değerlendirecek bu kodda.
Kodu açıklarsak:
& işareti ile Wav dizisinin value indisli elemanının adresi alınıyor. Adres alındığında artık verinin ne çeşit olduğu önemli değil sadece RAM adresi var. bunun önüne (signed short *) yazarak derleyiciye bak bu adreste 16-bitlik işaretli bir sayı saklıyorum diyoruz ki zaten aslında  Wav içinde bu şekilde saklanıyor. başına * koyarak derleyiciye bak bu adresteki 16-bitlik işaretli sayıyı bana oku diyoruz. Little Endian için byte sıralamasını derleyici bizim için yapıyor böylelikle.
Sen bir dene bakalım çalışırsa detaya gireriz :)

Not: Verinin hep 45. bayttan itibaren başladığını varsaymışsınız ama bu genel geçer bir kural değil. Format chunk'ında ExtraSize ile belirtilen kadar veri olabilieceği gibi değişik chunk'lar da mevcut. Bizzat 2-3 gün önce deneyimlediğimden biliyorum.
Bu soruna çözüm olarak da dosyanın başından 100 bayt okuyup "data" string'inin yerini buluyorum. Sonraki 4-bayt 32-bitlik veri boyutu oluyor. Geri kalanı da ses verisi oluyor.
Eğer 44-45 bayt kısmında 1-3-5-7... baytlık hata olursa verilerin tamamı bozulur. MSB-LSB karışır. Bundan da emin ol. Yani wav dosyayı hex editörle aç, data yazısını bul 4-bayt atla bundan sonrası ses verisidir.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: LukeSkywalker - 17 Ağustos 2015, 19:17:18
Value degiskenini signed yap, islemleri signed degiskenlerle yap, daca yukleyecegin degisken unsigned olsun.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 17 Ağustos 2015, 19:23:04
anladim hocam. :) ilk bos zamanimda c kitabi okuyayim. tek satirda bircok seyi halletmek bana cok cazip geldi ::)

hocam esrarengiz birsekilde short degilde int olarak cevirince calisiyor ama bir onceki gibi sorun. wav file in volumunun yukselen kisimlarinda cizirti var. buda bizim o kisimlari 12 bit e duzgunce ceviremedigimizi gosteriyor.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: fatih6761 - 17 Ağustos 2015, 19:25:22
Alıntı yapılan: Karamel - 17 Ağustos 2015, 19:23:04
anladim hocam. :) ilk bos zamanimda c kitabi okuyayim. tek satirda bircok seyi halletmek bana cok cazip geldi ::)

hocam esrarengiz birsekilde short değilde int olarak cevirince calisiyor ama bir onceki gibi sorun. wav file in volumunun yukselen kisimlarinda cizirti var. buda bizim o kisimlari 12 bit e duzgunce ceviremedigimizi gosteriyor.
@Karamel Line1 değişkeninin unsigned olduğundan emin misin?
Ayrıca short olarak çalışması lazım int olarak çalışıyorsa bir sorun var demektir.
Wav dosyasını atabilir misin?
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 17 Ağustos 2015, 20:13:35
const char Wav[352846]={

0x52,0x49,0x46,0x46,0x46,0x62,0x05,0x00,0x57,0x41,0x56,0x45,0x66,0x6D,0x74,0x20,0x12,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x44,0xAC,0x00,0x00,0x10,0xB1,
0x02,0x00,0x04,0x00,0x10,0x00,0x00,0x00,0x64,0x61,0x74,0x61,0x20,0x62,0x05,0x00,0xE2,0xFF,0xE2,0xFF,0x6C,0xFF,0x6C,0xFF,0xD9,0xFE,0xD9,0xFE,0x47,0xFE,
0x47,0xFE,0xD0,0xFD,0xD0,0xFD,0x79,0xFD,0x79,0xFD,0x3E,0xFD,0x3D,0xFD,0x1D,0xFD,0x1F,0xFD,0x13,0xFD,0x12,0xFD,0x27,0xFD,0x26,0xFD,0x55,0xFD,0x58,0xFD,
0xB8,0xFD,0xB3,0xFD,0x28,0xFE,0x2F,0xFE,0xA3,0xFE,0x9C,0xFE,0xDF,0xFE,0xE4,0xFE,0xEB,0xFE,0xE8,0xFE,0x9A,0xFE,0x9C,0xFE,0x0E,0xFE,0x0E,0xFE,0x86,0xFD,
0x83,0xFD,0x33,0xFD,0x37,0xFD,0x00,0xFD,0xFD,0xFC,0xF0,0xFC,0xF2,0xFC,0xF7,0xFC,0xF6,0xFC,0xE6,0xFC,0xE6,0xFC,0xCD,0xFC,0xCD,0xFC,0xCB,0xFC,0xCD,0xFC,
0xD1,0xFC,0xCE,0xFC,0xEE,0xFC,0xF2,0xFC,0x14,0xFD,0x0F,0xFD,0x1C,0xFD,0x20,0xFD,0x1E,0xFD,0x1C,0xFD,0x20,0xFD,0x21,0xFD,0x31,0xFD,0x31,0xFD,0x2A,0xFD,
0x2A,0xFD,0x18,0xFD,0x16,0xFD,0x0F,0xFD,0x11,0xFD,0x14,0xFD,0x14,0xFD,0x4A,0xFD,0x49,0xFD,0x98,0xFD,0x99,0xFD,0xC3,0xFD,0xC2,0xFD,0xB6,0xFD,0xB6,0xFD,
0x8F,0xFD,0x90,0xFD,0x79,0xFD,0x79,0xFD,0x7D,0xFD,0x7C,0xFD,0xA7,0xFD,0xA8,0xFD,0xE0,0xFD,0xDE,0xFD,0x19,0xFE,0x1C,0xFE,0x5F,0xFE,0x5C,0xFE,0x84,0xFE,
0x88,0xFE,0x88,0xFE,0x84,0xFE,0x6B,0xFE,0x6C,0xFE,0x44,0xFE,0x45,0xFE,0x1F,0xFE,0x1E,0xFE,0xFE,0xFD,0x00,0xFE,0xF9,0xFD,0xF7,0xFD,0x10,0xFE,0x11,0xFE,
0x2B,0xFE,0x29,0xFE,0x4C,0xFE,0x50,0xFE,0x73,0xFE,0x6F,0xFE,0x6F,0xFE,0x73,0xFE,0x4E,0xFE,0x4A,0xFE,0x19,0xFE,0x1B,0xFE,0xC4,0xFD,0xC5,0xFD,0x8D,0xFD,
0x8B,0xFD,0x6B,0xFD,0x6D,0xFD,0x4C,0xFD,0x49,0xFD,0x33,0xFD,0x36,0xFD,0x29,0xFD,0x27,0xFD,0x44,0xFD,0x47,0xFD,0x8E,0xFD,0x8A,0xFD,0xE9,0xFD,0xEC,0xFD,
0x6B,0xFE,0x6A,0xFE,0x12,0xFF,0x11,0xFF,0xAD,0xFF,0xB0,0xFF,0x44,0x00,0x41,0x00,0xA7,0x00,0xAA,0x00,0xD2,0x00,0xD0,0x00,0xCA,0x00,0xCB,0x00,0xD8,0x00,
0xD7,0x00,0xD2,0x00,0xD3,0x00,0xC0,0x00,0xC1,0x00,0xBC,0x00,0xBA,0x00,0xB5,0x00,0xB7,0x00,0xBF,0x00,0xBC,0x00,0xE0,0x00,0xE3,0x00,0x1D,0x01,0x1B,0x01,
0x59,0x01,0x5B,0x01,0xBA,0x01,0xB8,0x01,0x0D,0x02,0x0E,0x02,0x46,0x02,0x45,0x02,0x67,0x02,0x69,0x02,0x6A,0x02,0x68,0x02,0x42,0x02,0x43,0x02,0x02,0x02,
0x00,0x02,0xB7,0x01,0xBA,0x01,0x70,0x01,0x6E,0x01,0x25,0x01,0x26,0x01,0xFD,0x00,0xFD,0x00,0xE1,0x00,0xE0,0x00,0xE1,0x00,0xE2,0x00,0xFF,0x00,0xFE,0x00,
0x3C,0x01,0x3D,0x01,0x84,0x01,0x84,0x01,0xC3,0x01,0xC3,0x01,0x04,0x02,0x05,0x02,0x52,0x02,0x4F,0x02,0xA5,0x02,0xA8,0x02,0xDC,0x02,0xDA,0x02,0xF5,0x02,
0xF7,0x02,0xEE,0x02,0xEC,0x02,0xE4,0x02,0xE6,0x02,0xEA,0x02,0xE6,0x02,0xE1,0x02,0xE6,0x02,0xE1,0x02,0xDD,0x02,0xE0,0x02,0xE3,0x02,0xDC,0x02,0xDA,0x02,
0xD4,0x02,0xD4,0x02,0xC0,0x02,0xC1,0x02,0xA9,0x02,0xA8,0x02,0x98,0x02,0x9A,0x02,0xA4,0x02,0xA2,0x02,0xCA,0x02,0xCC,0x02,0xDB,0x02,0xD7,0x02,0xCF,0x02,
0xD4,0x02,0xBE,0x02,0xBC,0x02,0xAA,0x02,0xAA,0x02,0xC1,0x02,0xC1,0x02,0xDB,0x02,0xDB,0x02,0x04,0x03,0x03,0x03,0x38,0x03,0x3A,0x03,0x69,0x03,0x67,0x03,
0x8E,0x03,0x90,0x03,0xB0,0x03,0xAE,0x03,0xC3,0x03,0xC5,0x03,0xB8,0x03,0xB5,0x03,0xA6,0x03,0xA9,0x03,0xB1,0x03,0xB0,0x03,0xDE,0x03,0xDC,0x03,0x20,0x04,
0x24,0x04,0x8B,0x04,0x86,0x04,0x04,0x05,0x09,0x05,0x74,0x05,0x71,0x05,0xB3,0x05,0xB3,0x05,0xE2,0x05,0xE4,0x05,0x1D,0x06,0x1B,0x06,0x3B,0x06,0x3C,0x06,
0x3A,0x06,0x3A,0x06,0x49,0x06,0x48,0x06,0x52,0x06,0x53,0x06,0x48,0x06,0x48,0x06,0x1E,0x06,0x1D,0x06,0xB2,0x05,0xB3,0x05,0x25,0x05,0x24,0x05,0x93,0x04,
0x93,0x04,0x46,0x04,0x47,0x04,0x64,0x04,0x63,0x04,0x91,0x04,0x92,0x04,0xA5,0x04,0xA4,0x04,0x7A,0x04,0x7A,0x04,0x25,0x04,0x25,0x04,0xCA,0x03,0xCB,0x03,
0x9B,0x03,0x9A,0x03,0xB3,0x03,0xB3,0x03,0x9E,0x03,0x9D,0x03,0x58,0x03,0x5B,0x03,0x07,0x03,0x03,0x03,0xB9,0x02,0xBE,0x02,0x7D,0x02,0x78,0x02,0x6D,0x02,
0x70,0x02,0x71,0x02,0x70,0x02,0x5F,0x02,0x5F,0x02,0x16,0x02,0x18,0x02,0xC3,0x01,0xBF,0x01,0x90,0x01,0x95,0x01,0xC6,0x01,0xC0,0x01,0x23,0x02,0x28,0x02,
0x6F,0x02,0x6C,0x02,0x53,0x02,0x55,0x02,0x05,0x02,0x04,0x02,0x78,0x01,0x78,0x01,0xE1,0x00,0xDF,0x00,0x57,0x00,0x5A,0x00,0xCE,0xFF,0xCB,0xFF,0x67,0xFF,
0x6C,0xFF,0x5A,0xFF,0x54,0xFF,0x68,0xFF,0x6C,0xFF,0x8D,0xFF,0x8B,0xFF,0x80,0xFF,0x80,0xFF,0x23,0xFF,0x24,0xFF,0x77,0xFE,0x77,0xFE,0xDB,0xFD,0xD9,0xFD,
0x68,0xFD,0x6C,0xFD,0x1E,0xFD,0x00,0xFD,0xDE,0xFC,0xE1,0xFC,0xB0,0xFC,0xAD,0xFC,0x9F,0xFC,0xA3,0xFC,0xE9,0xFC,0xE4,0xFC,0x7E,0xFD,0x85,0xFD,0x27,0xFE,
0x20,0xFE,0x7D,0xFE,0x82,0xFE,0x9A,0xFE,0x97,0xFE,0x86,0xFE,0x88,0xFE,0x6C,0xFE,0x6B,0xFE,0x6E,0xFE,0x6F,0xFE,0x6E,0xFE,0x6C,0xFE,0x33,0xFE,0x36,0xFE,
0xE3,0xFD,0xDF,0xFD,0xBE,0xFD,0xC2,0xFD,0xB4,0xFD,0xB1,0xFD,0x9E,0xFD,0xA1,0xFD,0x7D,0xFD,0x7A,0xFD,0x34,0xFD,0x37,0xFD,0xCC,0xFC,0xC8,0xFC,0x62,0xFC,
0x66,0xFC,0x20,0xFC,0x1F,0xFC,0xEB,0xFB,0xE9,0xFB,0x9E,0xFB,0xA1,0xFB,0x43,0xFB,0x40,0xFB,0xE9,0xFA,0xEC,0xFA,0xD8,0xFA,0xD7,0xFA,0x1D,0xFB,0x1D,0xFB,
0x7D,0xFB,0x7B,0xFB,0xD6,0xFB,0xD9,0xFB,0x0D,0xFC,0x0B,0xFC,0x0E,0xFC,0x0F,0xFC,0x07,0xFC,0x07,0xFC,0x3B,0xFC,0x39,0xFC,0x7B,0xFC,0x7D,0xFC,0xCD,0xFC,
0xCD,0xFC,0x2B,0xFD,0x29,0xFD,0x3F,0xFD,0x41,0xFD,0x12,0xFD,0x10,0xFD,0xAC,0xFC,0xAE,0xFC,0x6F,0xFC,0x6D,0xFC,0x31,0xFC,0x33,0xFC,0x23,0xFC,0x21,0xFC,
0x32,0xFC,0x35,0xFC,0x43,0xFC,0x3F,0xFC,0x3A,0xFC,0x3E,0xFC,0x1D,0xFC,0x00,0xFC,0xFA,0xFB,0xFB,0xFB,0xE0,0xFB,0xE1,0xFB,0xDA,0xFB,0xD7,0xFB,0xDA,0xFB,
0xDD,0xFB,0xF4,0xFB,0xF4,0xFB,0x1C,0xFC,0x19,0xFC,0x3A,0xFC,0x3E,0xFC,0x2B,0xFC,0x26,0xFC,0xE4,0xFB,0xE9,0xFB,0xA0,0xFB,0x9C,0xFB,0x82,0xFB,0x87,0xFB,
0xA9,0xFB,0xA2,0xFB,0xF8,0xFB,0xFE,0xFB,0x58,0xFC,0x55,0xFC,0xB2,0xFC,0xB4,0xFC,0xFF,0xFC,0xFE,0xFC,0x20,0xFD,0x20,0xFD,0x1E,0xFD,0x1D,0xFD,0x02,0xFD,
0x04,0xFD,0xEB,0xFC,0xEA,0xFC,0xB7,0xFC,0xB8,0xFC,0x78,0xFC,0x76,0xFC,0x4D,0xFC,0x50,0xFC,0x61,0xFC,0x5E,0xFC,0x83,0xFC,0x85,0xFC,0xB1,0xFC,0xB1,0xFC,
0xD6,0xFC,0xD5,0xFC,0x15,0xFD,0x15,0xFD,0x98,0xFD,0x9A,0xFD,0x34,0xFE,0x30,0xFE,0xC9,0xFE,0xCF,0xFE,0x34,0xFF,0x2E,0xFF,0x3B,0xFF,0x41,0xFF,0x0C,0xFF,
0x07,0xFF,0xE4,0xFE,0xE6,0xFE,0xDE,0xFE,0xDD,0xFE,0xD9,0xFE,0xDA,0xFE,0xE3,0xFE,0xE5,0xFE,0xF7,0xFE,0xF3,0xFE,0xE5,0xFE,0xE9,0xFE,0xD2,0xFE,0xCD,0xFE,
0xBF,0xFE,0xC4,0xFE,0xBB,0xFE,0xB8,0xFE,0xD8,0xFE,0xD9,0xFE,0xFC,0xFE,0xFD,0xFE,0x16,0xFF,0x13,0xFF,0x10,0xFF,0x14,0xFF,0x04,0xFF,0x01,0xFF,0xF6,0xFE,
0xF8,0xFE,0x08,0xFF,0x07,0xFF,0x24,0xFF,0x25,0xFF,0x5D,0xFF,0x5C,0xFF,0x89,0xFF,0x89,0xFF,0xC8,0xFF,0xC9,0xFF,0x1F,0x00,0x1E,0x00,0x73,0x00,0x75,0x00,
0xC2,0x00,0xC0,0x00,0xE1,0x00,0xE2,0x00,0xC8,0x00,0xC7,0x00,0x88,0x00,0x89,0x00,0x44,0x00,0x44,0x00,0xF4,0xFF,0xF2,0xFF,0xB6,0xFF,0xBA,0xFF,0x8C,0xFF,
0x87,0xFF,0x42,0xFF,0x47,0xFF,0xF2,0xFE,0xEC,0xFE,0xA0,0xFE,0xA7,0xFE,0x90,0xFE,0x8A,0xFE,0xC9,0xFE,0xCD,0xFE,0x22,0xFF,0x20,0xFF,0x6A,0xFF,0x6A,0xFF,
0xAC,0xFF,0xAD,0xFF,0x00,0x00,0x00,0x00,0x6F,0x00,0x6E,0x00,0xD7,0x00,0xD9,0x00,0x2E,0x01,0x2C,0x01,0x60,0x01,0x62,0x01,0x8D,0x01,0x8A,0x01,0xA2,0x01,
0xA6,0x01,0xDF,0x01,0xDA,0x01,0xFB,0x01,0x00,0x02,0x01,0x02,0xFE,0x01,0xF7,0x01,0xF8,0x01,0xBF,0x01,0xBE,0x01,0x7F,0x01,0x80,0x01,0x7A,0x01,0x78,0x01,
0xA4,0x01,0xA7,0x01,0xB6,0x01,0xB3,0x01,0xBA,0x01,0xBC,0x01,0xB0,0x01,0xAF,0x01,0xB7,0x01,0xB7,0x01,0xDA,0x01,0xDA,0x01,0x00,0x02,0x00,0x02,0x4C,0x02,
0x4B,0x02,0x6D,0x02,0x6F,0x02,0xAB,0x02,0xA9,0x02,0xE9,0x02,0xEB,0x02,0x09,0x03,0x07,0x03,0xFD,0x02,0xFE,0x02,0xEF,0x02,0xF0,0x02,0xD1,0x02,0xCE,0x02,
0xC3,0x02,0xC8,0x02,0xC6,0x02,0xC0,0x02,0xC2,0x02,0xC8,0x02,0xC6,0x02,0xC1,0x02,0xAF,0x02,0xB4,0x02,0x93,0x02,0x8E,0x02,0x8A,0x02,0x8E,0x02,0x97,0x02,
0x94,0x02,0x9A,0x02,0x9C,0x02,0xAF,0x02,0xAF,0x02,0xDE,0x02,0xDC,0x02,0xFC,0x02,0xFF,0x02,0x0C,0x03,0x09,0x03,0xF8,0x02,0xFA,0x02,0xC4,0x02,0xC2,0x02,
0x76,0x02,0x78,0x02,0x17,0x02,0x17,0x02,0xD0,0x01,0xCF,0x01,0x9A,0x01,0x9A,0x01,0x88,0x01,0x88,0x01,0x96,0x01,0x96,0x01,0xAB,0x01,0xAC,0x01,0xB5,0x01,
0xB4,0x01,0xC7,0x01,0xC7,0x01,0xEF,0x01,0xEF,0x01,0x2D,0x02,0x2D,0x02,0x88,0x02,0x87,0x02,0xE9,0x02,0xEB,0x02,0x42,0x03,0x40,0x03,0x82,0x03,0x85,0x03,
0xAE,0x03,0xAA,0x03,0xAF,0x03,0xB2,0x03,0x88,0x03,0x86,0x03,0x59,0x03,0x5A,0x03,0x38,0x03,0x38,0x03,0x1B,0x03,0x1B,0x03,0x04,0x03,0x03,0x03,0xE6,0x02,
0xE8,0x02,0xAF,0x02,0xAC,0x02,0x6E,0x02,0x70,0x02,0x27,0x02,0x26,0x02,0xD6,0x01,0xD8,0x01,0xA7,0x01,0xA4,0x01,0xA9,0x01,0xAD,0x01,0xC7,0x01,0xC3,0x01,
0xC5,0x01,0xC9,0x01,0xA2,0x01,0x9E,0x01,0x61,0x01,0x65,0x01,0x32,0x01,0x2D,0x01,0x09,0x01,0x10,0x01,0x07,0x01,0xFF,0x00,0x19,0x01,0x20,0x01,0x49,0x01,
0x44,0x01,0x60,0x01,0x63,0x01,0x62,0x01,0x61,0x01,0x4B,0x01,0x4A,0x01,0x18,0x01,0x00,0x01,0xE3,0x00,0xE2,0x00,0xAB,0x00,0xAB,0x00,0x99,0x00,0x9A,0x00,
0xB4,0x00,0xB2,0x00,0xCA,0x00,0xCC,0x00,0xD7,0x00,0xD7,0x00,0xD1,0x00,0xCE,0x00,0xA8,0x00,0xAE,0x00,0x6A,0x00,0x62,0x00,0x27,0x00,0x2E,0x00,0xEF,0xFF,
0xEA,0xFF,0xA5,0xFF,0xA8,0xFF,0x6B,0xFF,0x6B,0xFF,0x44,0xFF,0x41,0xFF,0x23,0xFF,0x26,0xFF,0x39,0xFF,0x37,0xFF,0x75,0xFF,0x77,0xFF,0xB4,0xFF,0xB3,0xFF,
0xCF,0xFF,0xCF,0xFF,0xD0,0xFF,0xD0,0xFF,0xB5,0xFF,0xB5,0xFF,0x78,0xFF,0x79,0xFF,0x27,0xFF,0x26,0xFF,0xCA,0xFE,0xCA,0xFE,0x5A,0xFE,0x5B,0xFE,0xD2,0xFD,
0xD1,0xFD,0x5F,0xFD,0x5F,0xFD,0xEE,0xFC,0xEF,0xFC,0x7E,0xFC,0x7B,0xFC,0x3A,0xFC,0x3F,0xFC,0xFF,0xFB,0xFB,0xFB,0xE3,0xFB,0xE5,0xFB,0x17,0xFC,0x17,0xFC,
0x60,0xFC,0x5E,0xFC,0x8A,0xFC,0x8D,0xFC,0xBA,0xFC,0xB9,0xFC,0xE9,0xFC,0xE9,0xFC,0xFE,0xFC,0xFE,0xFC,0x1E,0xFD,0x1E,0xFD,0x45,0xFD,0x44,0xFD,0x6C,0xFD,
0x6E,0xFD,0x91,0xFD,0x8F,0xFD,0xA5,0xFD,0xA7,0xFD,0xB6,0xFD,0xB5,0xFD,0xB6,0xFD,0xB5,0xFD,0xAC,0xFD,0xAE,0xFD,0x8D,0xFD,0x8A,0xFD,0x52,0xFD,0x56,0xFD,
0x26,0xFD,0x22,0xFD,0xF6,0xFC,0xFA,0xFC,0xDA,0xFC,0xD6,0xFC,0xBE,0xFC,0xC1,0xFC,0xAD,0xFC,0xAC,0xFC,0x9D,0xFC,0x9C,0xFC,0xAE,0xFC,0xB1,0xFC,0xC1,0xFC,
0xBD,0xFC,0xBF,0xFC,0xC3,0xFC,0xC5,0xFC,0xC1,0xFC,0xD6,0xFC,0xDA,0xFC,0xE0,0xFC,0xDE,0xFC,0xFC,0xFC,0xFB,0xFC,0x25,0xFD,0x28,0xFD,0x4C,0xFD,0x48,0xFD,
0x5F,0xFD,0x63,0xFD,0x76,0xFD,0x73,0xFD,0x8F,0xFD,0x90,0xFD,0xA9,0xFD,0xA9,0xFD,0xCB,0xFD,0xCB,0xFD,0x15,0xFE,0x14,0xFE,0x72,0xFE,0x73,0xFE,0xD5,0xFE,
0xD4,0xFE,0x21,0xFF,0x23,0xFF,0x4F,0xFF,0x4C,0xFF,0x58,0xFF,0x5B,0xFF,0x7F,0xFF,0x7C,0xFF,0x94,0xFF,0x97,0xFF,0x83,0xFF,0x80,0xFF,0x5F,0xFF,0x61,0xFF,
0x5C,0xFF,0x5B,0xFF,0x5E,0xFF,0x5E,0xFF,0x66,0xFF,0x68,0xFF,0x55,0xFF,0x52,0xFF,0x28,0xFF,0x2B,0xFF,0xE6,0xFE,0xE2,0xFE,0xB6,0xFE,0xB9,0xFE,0xA3,0xFE,
0xA2,0xFE,0xB2,0xFE,0xB2,0xFE,0xC8,0xFE,0xCA,0xFE,0xCD,0xFE,0xC9,0xFE,0xC0,0xFE,0xC3,0xFE,0xFE,0xFE,0xFC,0xFE,0x65,0xFF,0x66,0xFF,0xAB,0xFF,0xAC,0xFF,
0xCA,0xFF,0xC8,0xFF,0xB9,0xFF,0xBB,0xFF,0x8E,0xFF,0x8D,0xFF,0x78,0xFF,0x78,0xFF,0xA9,0xFF,0xAA,0xFF,0xE5,0xFF,0xE4,0xFF,0x17,0x00,0x18,0x00,0x48,0x00,
0x47,0x00,0x5A,0x00,0x5A,0x00,0x72,0x00,0x74,0x00,0xBF,0x00,0xBC,0x00,0x28,0x01,0x2B,0x01,0x77,0x01,0x74,0x01,0xA5,0x01,0xA6,0x01,0xC3,0x01,0xC4,0x01,
0xC8,0x01,0xC6,0x01,0xBC,0x01,0xBE,0x01,0xE3,0x01,0xE0,0x01,0x18,0x02,0x1B,0x02,0x3D,0x02,0x3A,0x02,0x56,0x02,0x59,0x02,0x84,0x02,0x82,0x02,0xC3,0x02,
0xC3,0x02,0x3F,0x03,0x40,0x03,0xCB,0x03,0xC9,0x03,0x32,0x04,0x36,0x04,0x65,0x04,0x60,0x04,0x6B,0x04,0x70,0x04,0x49,0x04,0x42,0x04,0x25,0x04,0x2E,0x04,



mesaj birleştirme:: 17 Ağustos 2015, 20:15:03

hocam hepsini message ile gonderemiyormusuz. size fazla diyor.

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

line imiz unsigned hocam.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: fatih6761 - 17 Ağustos 2015, 20:44:28
Verdiğin tabloya göre ilk index değerinin 46 olması lazım sayabildiğim kadarıyla.
"data" 0x64 0x61 0x74 0x61 bundan sonraki 4 byte veri boyutu (bayt cinsinden) ondan sonraki baytlar veri oluyor.
Ayrıca:
Format Size 0x12 = 18 olarak belirtilmiş. FormatExtraSize = 0 olduğundan önemli değil.
Channels = 2 olarak belirtilmiş bu 2 kanallı bir kayıt bunu oynatırken left right sample'ları tek tek değerlendirmek gerekir!!!
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: t2 - 17 Ağustos 2015, 20:46:46
Sorun bence tam olarak şu kısımda:
Tablodan 2 bayt okuyup bu 2 baytı yer değiştirip  integerin  low ve high baytı olarak atama kısmında sorun var. 
bu aşama tamamsa geriye bir şey kalmıyor. 32768 ekleyecez. 4 bit sağa kaydıracaz. 12bit pozitif data kalacak hepsi bu.

mesaj birleştirme:: 17 Ağustos 2015, 20:52:37

          Ses_Cal = Ses_Cal << 8;

          Ses_Cal = (Ses_Cal + Wav[value]);

işte hata tam burada! 2. satırda.
2. baytı toplama ile eklemeyelim. OR lama yapalım

Hatta integer'in low ve high baytlarına direk erişim fonksiyonu varsa, okunan baytları bu fonksiyonla eşitleyelim. toplama yapılmasın.



Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 17 Ağustos 2015, 21:07:05
hocam.

decimal 8 = 1000 binary
decimal 4 = 0100 binary

logic or  8 | 4   =1100 = decimal 12

decimal addition 8+2 = 12 = 1100 binary


burada matematiksel olarak sorun olmamasi gerekir? zaten fatih hocamin code larindada c languace char degiskeni int e ceviriyor ve bize cikti sunuyor. ikimizdede ayni sonucu aldik(bunu duyarak soyluyorum. debug ile nasil bakiliyor bilemiyorum)

biz c languge in yaptigini manual olarak yapmisiz.

burada yapmamiz gereken deney su. keske oscilloscope um olsaydi.

Ses_Cal = 0xFFFF; iken scope ekraninda 3.3v gormek gerekir?
Ses_Cal = 0x0000; iken scope ekraninda 0v gormek gerekir?
Ses_Cal = 0x8000; iken scope ekraninda 3.3/2 voltage gormek gerekir?

bu deneyleri yapamadigimdan hep ayni seyleri dondur dondur yapiyorum.  acikacsi biraz sIkIldim. biraz daha farkli deneylere kayayim diyorum. birkac gun ara verirsem. bekli aklimi daha iyi toparlar sorunu daha iyi gorebilirim.

birde burada deney yapiyoruz ama deneyi neden sadece ben yapiyorum?  :P
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: z - 17 Ağustos 2015, 21:09:01
ARM derslerindeki wav projesinde 8 bit veri kullandık.

Böylece 16 yada 12 bit kayda göre 2 kat daha uzun süreli sesler elde edebildik.

16 bit verilerle çalışılacaksa fakat veriler 8 bitlik paketlerle tanımlıysa

12 bit Dac için verileri;

Ses=(Buf<<4) | (Buf[i+1]>>4) olarak çevirebiliriz.

Eğer veriler ters yazıldı ise

Ses=(Buf[i+1]<<4) | (Buf>>4) olarak çevirebiliriz.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: t2 - 17 Ağustos 2015, 21:09:47
denemek için donanım veya simulatör yok. proteuste çalışır mı STM32 demosu ?

Alıntı yapılan: Karamel - 17 Ağustos 2015, 21:07:05

birde burada deney yapiyoruz ama deneyi neden sadece ben yapiyorum?  :P
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: LukeSkywalker - 17 Ağustos 2015, 21:33:42
Alıntı yapılan: t2 - 17 Ağustos 2015, 20:46:46
Sorun bence tam olarak şu kısımda:
Tablodan 2 bayt okuyup bu 2 baytı yer değiştirip  integerin  low ve high baytı olarak atama kısmında sorun var. 
bu aşama tamamsa geriye bir şey kalmıyor. 32768 ekleyecez. 4 bit sağa kaydıracaz. 12bit pozitif data kalacak hepsi bu.

mesaj birleştirme:: 17 Ağustos 2015, 20:52:37

          Ses_Cal = Ses_Cal << 8;

          Ses_Cal = (Ses_Cal + Wav[value]);

işte hata tam burada! 2. satırda.
2. baytı toplama ile eklemeyelim. OR lama yapalım

Hatta integer'in low ve high baytlarına direk erişim fonksiyonu varsa, okunan baytları bu fonksiyonla eşitleyelim. toplama yapılmasın.

Neden toplama yapılmasın?

mesaj birleştirme:: 17 Ağustos 2015, 21:35:13

@Karamel İyi bir ölçü aletin yok mu?
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: t2 - 17 Ağustos 2015, 21:43:16
toplarken galiba elde oluşuyor, taşma oluyor . Bu da büyük sayılarda oluyor. 8 e bölmenin faydası işte bu. hatayı örtbas ediyor. sonuç ORlama ile aynı oluyor

mesaj birleştirme:: 17 Ağustos 2015, 21:44:40

Alıntı yapılan: Karamel - 17 Ağustos 2015, 17:50:32
8 kat kuculttum. o cizirti gitti.


normalde baytlar maksimum olsa bile
FF00 +00FF = FFFF
şeklinde olacak ama hata çıkmayacaktı. yani toplama ile orlama aynı gibi. Acaba değişken signed integer olunca farklı mı oluyor?  diye bakmak lazım.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: z - 17 Ağustos 2015, 22:00:07
Neden işin içine işaretli sayıları sokuyorsunuzki?

İşaretsiz sayı olarak ele alın. Daha önce verdiğim şekilde kaydırma yapıp orlayacak yada toplayacaksınız.

işaretli 8 bit sayılardan işaretli 16 bit sayı elde etmek için şu işlemi yaparsanız sonuç hatalı olur.

FF<<8 + FF = FEFF çıkar.

Bu işlemi işaretsiz sayı olarak yaparsanız sonuç FFFF çıkar.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: t2 - 17 Ağustos 2015, 22:13:21
İşaretli olarak dikkate alma  sebebi, Wav dosyadaki datanın işaretli olmasından dolayı.  8 bit gibi değil
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: z - 17 Ağustos 2015, 22:52:07
Olsun. Sonuçta işaretli sayının iki parçasını birleştiriyorsun. Bu işlemi işaretsiz sayı ıolarak düşünerek yapmak zorundasın. Yoksa yukarıda söylediğim hataya neden olunur.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 17 Ağustos 2015, 23:49:18
Alıntı yapılan: LukeSkywalker - 17 Ağustos 2015, 21:33:42
Neden toplama yapılmasın?

mesaj birleştirme:: 17 Ağustos 2015, 21:35:13

@Karamel İyi bir ölçü aletin yok mu?

hocam olcu aleti beni daha cok yaniltabilir diye olcu aleti ile deney yapmadim. sonucta orada degisken bir signal olursa. ben avo meter uzerinde karmasik rakamlar okuyacaktim?

ama yinede deneyi yaptim. bizim code larda ve dusuncemizde sanirim mantik hatasi yok.

          Ses_Cal = 0;
          Ses_Cal =  0x80; //Wav[value + 1];    MSB

         
          Ses_Cal = Ses_Cal << 8;

          //Ses_Cal = (Ses_Cal | 0x00); //Wav[value]); T2 hocaya ayip olmasin diye logic OR yaptik. LSB
         
          -Ses_Cal = Ses_Cal + 32767;
         
          -Ses_Cal = (Ses_Cal) / 16;
         
          Line1 = Ses_Cal;

          DAC1_Advanced_Ch1_Output(Line1, conf1);

          while(1);


basina "-" yerlestirdigim satirlari en basta commend sekline aldim.

ust bit e 0xFF. alt bite 0xFF verdim. cikistan avometer ile 3.2 voltage i okudum.

daha sonra bunlara 0x00 ve 0x00 degerlerini verdim. cikis 0.02voltage olarak okudum(herhalde bu 0v oluyor?

en sonunda msb ye 0x80 ve lsb ye 0x00 verdim. 1.6 voltage okudum.

bu deneylerden sonra. basina "-" koydugum code larin commend ini kaldirdim. ve deneyleri yeniden yaptim.

msb ye 0x7F lsb ye 0xFF (yani +32767) verdim. output tan 3.2voltage i gordum.

daha sonra msb ve lsb ye 0x00 degerlerini verdim(yani signed olarak 0) output voltage = 1.67v (3.3 un yaklasik yarisi)

en son msb ye 0x80 lsb ye 0x00(yani -32768). output voltage = 0.03v. herhalde buda 0 voltage olarak kabul edilebilir.


simdi ben bu deneyleri avo meter ile yaptim. bizi yuksek ihtimalle yaniltmadi. ama yaniltmis olabilirde. bu cikislari oscilloscope ile test etmeden. bu bilgiler uzerine yeni bilgiler insa etmek pek mantikli olmaz.

avo meter deneyinden bizim signed ve unsigned cevrimini becerdigimiz gozukuyor.

bundan sonra 2 soru isareti kaliyor geriye.

1. wav file belirli bir volume degerinden sonra file iceriginde degisiklik yapiyor. (ben boyle birseyi daha once bir yerde okumadim. bana hic mantikli gelmiyor)
2. wav file i string array e duzgunce cevirememis olabiliriz.


2. olan bana daha mantikli geliyor. simdi herhangi bir hocamda. max 3 sn kadar. 44100 hz 16 bit bir wav file varsa ve bunu string array e cevirebiliyorsa. o array ilede bir deney yapip. sonucu gormeliyiz. wav file mumkunse music tarzinda birsey olsun ki. eger ses bozuk cikiyorsa bunu anlayabileyim.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: fatih6761 - 18 Ağustos 2015, 00:27:13
@Karamel 3 sn çok az değil mi? 3 sn denedim birşey anlaşılmıyor. 5 sn lik yaptım. Kullandığın mikrodenetleyicinin hafızası ne kadar?

https://drive.google.com/file/d/0ByIscC6i2OS-MmJCaGhxMm9PNjg/view?usp=sharing (https://drive.google.com/file/d/0ByIscC6i2OS-MmJCaGhxMm9PNjg/view?usp=sharing)

Fazla geliyorsa başından sonundan kesersin :)
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 18 Ağustos 2015, 00:53:48
Alıntı yapılan: Karamel - 17 Ağustos 2015, 21:07:05
birde burada deney yapiyoruz ama deneyi neden sadece ben yapiyorum?  :P

@Karamel ben de deneyeceğim de, kulaklığa kabloyu elimle doluyorum felan sağlam olmuyor. Bana bir kulaklık konnektörü lazım.
Ayrıca devre kurup lehimleme yerine modül şeklinde bulursam hemen deney yapıp projeyi çalıştırmak isterim.
Discovery'dekini sökmek de istemiyorum, eski bir cihaz felan bulsam sökeceğim  8)

Bu arada forumca yeni bir proje olarak, bu projeyi yapmayı teklif ediyorum.
Yazılım olarak sonuna kadar destekliyorum, başarılı olacağından şüphem yok. SD kart SDIO ve DMA yöntemi ile çalışmalarım oldu.
Dokunmatik TFT ekran olarak yeni çıkan Nextion HMI'ları kullanırız direnc.net'te var, tx rx ile çok basit bir şekilde kullanabiliyoruz. Arayüzünü bilgisayardan bir kereliğine hazırlıyoruz o kadar.
Mikrofonlu rf'li kulaklıklı güzel bir telekulak ve kaydedici, beğenmezseniz sadece müzik player olarak yaparız.

Benim aklımda çok proje var da, çizim yapmak ve montaj yapmak benim en sevmediğim şey. Birileri el atarsa yaparız.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 18 Ağustos 2015, 01:03:49
Alıntı yapılan: fatih6761 - 18 Ağustos 2015, 00:27:13
@Karamel 3 sn çok az değil mi? 3 sn denedim birşey anlaşılmıyor. 5 sn lik yaptım. Kullandığın mikrodenetleyicinin hafızası ne kadar?

https://drive.google.com/file/d/0ByIscC6i2OS-MmJCaGhxMm9PNjg/view?usp=sharing (https://drive.google.com/file/d/0ByIscC6i2OS-MmJCaGhxMm9PNjg/view?usp=sharing)

Fazla geliyorsa başından sonundan kesersin :)

kocaman bir aferim olsun bize!  8) 8) 8) 8) 8) 8) 8) 8) 8)  ::)

yapmisiz. wav file arrayimizde sorun varmis. fatih6761 hocanin verdigi array i excellent quality ile calabiliyoruz :) basarmisiz gercekten. suan cok sevincliyim ::)

mesaj birleştirme:: 18 Ağustos 2015, 01:07:51

flah memory 512 kb hocam ::)
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 18 Ağustos 2015, 01:08:42
İyi de sendeki arrayı ben ürettim, tek tek kontrol ettim, bire bir tutuyor. Sorun olması imkansız.
Little endian olduğunu dikkate alarak, ters çevirme işlemini yaptıysan sıkıntı olmaması lazım.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: mesmert - 18 Ağustos 2015, 01:11:27
Merhaba Gokhan Hocam
PCB tasarimi konusunu ben yaparim ve hatta numunenin ilk dizgisinide yaparim. Siz projeye SD karttan ses kaydetme ve calma seklinde olursa cok iyi olur. Sistemi Low Power olarak tasarlariz.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 18 Ağustos 2015, 01:16:10
hocam bende bilemedim. o yuzden istedim ya. birileri daha deney yapsin ve beni yanlislasin.

sizin wav to hex yaziliminizla wav file in volume unu 1/8 ine cekince. puruzsuz dinleyebiliyoruz. herseyi defalarca control ettik sorun yok gozukuyordu.

simdi fatih6761 hocamdan gelen file in volume u yuksek ve cizirti yok. sorun olmadigini buradan anlayabildim.

fatih6761 hocam. sizin wav file i. buraya yukleme sansiniz varmi?

bu saatten sonra. bizim array imizde sorun olup olmadigini kanitlayacak tek deney var ki. microsd card a wav lari atip. teker teker calacagiz. oradan okunan degerler. herhangi bir yazilimla array e cevirilmis yada icerisiyle oynanmis olmayacagindan. bize en dogru cevabi verecektir.
Başlık: Ynt: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 18 Ağustos 2015, 01:32:59
Sayın @mesmert hocam, teşekkür ederim. Forum'a katkısı olacak.

mesaj birleştirme:: 18 Ağustos 2015, 01:47:00

Karamel, Fatih'in gönderdiği arrayı notepad++ ile aç, ctrl+h kısayoluna bas, boşlukları ve 0x'leri ve virgülleri sil, her byte'ın arasında bir boşluk olsun.

örneğin: FF A1 B5 DD diye gitsin
sonra ctrl+a ile hepsini seçip, hex editöre at, kaydet. bunları benim programa yolla, tekrar array oluştur. Eğer ses hala bozuk çıkıyorsa, benim programın ürettiği array sorunlu demektir.

bu arada benim programı indirmek isteyen varsa link: https://github.com/gokhanBeken/BinaryFileToTextArray (https://github.com/gokhanBeken/BinaryFileToTextArray)
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: fatih6761 - 18 Ağustos 2015, 01:52:13
Alıntı yapılan: Karamel - 18 Ağustos 2015, 01:16:10
hocam bende bilemedim. o yuzden istedim ya. birileri daha deney yapsin ve beni yanlislasin.

sizin wav to hex yaziliminizla wav file in volume unu 1/8 ine cekince. puruzsuz dinleyebiliyoruz. herseyi defalarca control ettik sorun yok gozukuyordu.

simdi fatih6761 hocamdan gelen file in volume u yuksek ve cizirti yok. sorun olmadigini buradan anlayabildim.

fatih6761 hocam. sizin wav file i. buraya yukleme sansiniz varmi?

bu saatten sonra. bizim array imizde sorun olup olmadigini kanitlayacak tek deney var ki. microsd card a wav lari atip. teker teker calacagiz. oradan okunan degerler. herhangi bir yazilimla array e cevirilmis yada icerisiyle oynanmis olmayacagindan. bize en dogru cevabi verecektir.

@Karamel ÖM den istemiştin ama madem lazım oluyor böyle buradan atayım. Yalnız dikkatini çekti mi bilmem ama ben wav dosyanın başındaki header bölümünü silerek dönüştürüyorum hex koda.
Bence sizin wav dosyalarda da bundan kaynaklanan bir indeks kayması olabilir. Hex Editörler wav dosyasını açıp "data" kısmını buluyorum. datadan sonraki 4 bayta kadar olan yeri komple silip hex koduna dönüştürüyorum.

https://drive.google.com/file/d/0ByIscC6i2OS-M0NoSHZHZUF1OFU/view?usp=sharing (https://drive.google.com/file/d/0ByIscC6i2OS-M0NoSHZHZUF1OFU/view?usp=sharing)
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 18 Ağustos 2015, 02:05:13
Alıntı yapılan: fatih6761 - 18 Ağustos 2015, 01:52:13
@Karamel ÖM den istemiştin ama madem lazım oluyor böyle buradan atayım. Yalnız dikkatini çekti mi bilmem ama ben wav dosyanın başındaki header bölümünü silerek dönüştürüyorum hex koda.
Bence sizin wav dosyalarda da bundan kaynaklanan bir indeks kayması olabilir. Hex Editörler wav dosyasını açıp "data" kısmını buluyorum. datadan sonraki 4 bayta kadar olan yeri komple silip hex koduna dönüştürüyorum.

https://drive.google.com/file/d/0ByIscC6i2OS-M0NoSHZHZUF1OFU/view?usp=sharing (https://drive.google.com/file/d/0ByIscC6i2OS-M0NoSHZHZUF1OFU/view?usp=sharing)

tamamdir. dinledigimiz gibi caliyoruz. bu code lari olusturuken file in formatinda vs bir degisiklik yaptiniz mi? eger hic birsey degistirmeyip. sadece hex output aldiysaniz. sorun bir bizim wav file imizde imis.

diyelim ki data kismini bulmadan deneyler yaptim. max. 3 yanilgi payimiz var. onlar sunlar.

diyelim file 50. byte ta basliyor. ben 48 ten baslatirsam R ve L output yer degistir. ses normal cikar ve biz %98 oranda deney yaparken ortada sorun olmadigini sanariz.
diyelim ki 49 dan baslattik. butun hersey ters duz olur. bozuk ses cikar. (tamamen anlamsiz gurultu seklinde oluyor)
diyelimki 50 den baslattim. hersey okay olur.
diyelimki 51 den baslattim. hersey istedigimiz gibi olur.

burada sorun cikaracak 2 deger var. wav filei 0-1-2-3 ten baslatsamda yukaridaki sonuclari alirim. frequance cok yuksek oldugundan ilk 50 byte i duyamayiz bile.

onceki file ile yukaridaki deneylerin hepsini yapmistim. siz 46. byte tan basliyor demistiniz. oradan da baslatip deney yapmistik. (ben 44 ten baslatiyordum. R ve L outputlar yer degistiriyordu ama ben bunu duyarken anlamiyordum bile)

Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: fatih6761 - 18 Ağustos 2015, 02:22:06
Alıntı yapılan: Karamel - 18 Ağustos 2015, 02:05:13
tamamdir. dinledigimiz gibi caliyoruz. bu code lari olusturuken file in formatinda vs bir degisiklik yaptiniz mi? eger hic birsey degistirmeyip. sadece hex output aldiysaniz. sorun bir bizim wav file imizde imis.

diyelim ki data kismini bulmadan deneyler yaptim. max. 3 yanilgi payimiz var. onlar sunlar.

diyelim file 50. byte ta basliyor. ben 48 ten baslatirsam R ve L output yer degistir. ses normal cikar ve biz %98 oranda deney yaparken ortada sorun olmadigini sanariz.
diyelim ki 49 dan baslattik. butun hersey ters duz olur. bozuk ses cikar. (tamamen anlamsiz gurultu seklinde oluyor)
diyelimki 50 den baslattim. hersey okay olur.
diyelimki 51 den baslattim. hersey istedigimiz gibi olur.

burada sorun cikaracak 2 deger var. wav filei 0-1-2-3 ten baslatsamda yukaridaki sonuclari alirim. frequance cok yuksek oldugundan ilk 50 byte i duyamayiz bile.

onceki file ile yukaridaki deneylerin hepsini yapmistim. siz 46. byte tan basliyor demistiniz. oradan da baslatip deney yapmistik. (ben 44 ten baslatiyordum. R ve L outputlar yer degistiriyordu ama ben bunu duyarken anlamiyordum bile)

İşin güzel tarafı tüm bu ihtimalleri tek kalemde yok etmek mümkün. Program başında Wav dizinden "data" stringini ararız, bulduğumuz indise 4 ekleyerek offset değerini elde ederiz. Bundan sonra ses verisini okurken indis+offset şeklinde okuruz.
Wav dosyasını gizli bilgi gömme projemde bu yöntemi kullandım ve onlarca Wav dosyasında (farklı farklı türlerden) hiç sorun çıkartmadı.
İlk 100-200 baytı ele alıyoruz. 0. bayttan başlayarak 'd' harfini arıyoruz. Peşinden gelen 'a' değilse sonraki 'd' ye gidiyoruz. Eğer peşinden gelen 'a' ise onun ardından 't' ye bakıyoruz vs.. Tam olarak data'yı bulduğumuzda 4 byte ileri gidiyoruz ve ses verisi geliyor.
Ayrıca formatta hiç bir değişiklik yok. Offsetten sonraki ses verisini olduğu gibi (dosyadan okuduğum gibi) diğer dosyaya yazıyorum. Sonra hex koda dönüştüren fonksiyonu çağırıp kaydediyorum.
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: OG - 18 Ağustos 2015, 09:42:30
Alıntı yapılan: Karamel - 17 Ağustos 2015, 17:50:32
B350 hex icin. 45904 ondalik sayisina denk geliyor? burada bir yanlislik var.bu sayi icin - 19632 demissiniz? bunu nasil buluyoruz? sorun bu kisimda.


50 B3 yani B3 50 'nin MSB si (işaret biti) 1 dir.
50 B3 => B3 50 => (45904) => 1011001101010000 (Unsigned gibi düşünülseydi)
Bunun Signed değeri kuvvet ifade etmez, yanlızca 0 noktasının altında olduğunu gösterir, işaret bitini atarsak => 0011001101010000  => (13136)
İşareti de unutmazsak -13136 dır.

Anlamı  şudur, bu değerin işaret biti - yi gösterdiğine göre sinyalin 0 hattından 13136 değer kadar daha aşağıdadır.
Veya en alttaki -32767 den 19631 değer daha yukarıdadır.

Yani;

İŞARETLİ DEĞER => MUTLAK KUVVET
+32767              => 65534 (Mutlak kuvvet)  => 0111111111111111
.
.
0 (SIFIR HATTI)   => 32767 (Mutlak kuvvet)  => 0000000000000000
.
.
-13136                => 19631 (0 hattına göre kuvvet ise 13136) => 50 B3 byte dizilimini düzeltelim, yani B3 50, işaret bitini görmezsek kuvvet değeri 13136
.
.
-32767                => 0 (Mutlak kuvvet)        => 1111111111111111

Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Gökhan BEKEN - 25 Ağustos 2015, 10:29:07
Karamel benim programda ufak bir problem varmış,
input=fopen(dosyaAdi, "rw+"); olarak açmışım dosyayı, windows'ta böyle yapınca 0x0A'ları 0x00 olarak çeviriyor,
input=fopen(dosyaAdi, "rwb+"); olarak açınca düzeldi. Yani sorun 0x0A'lardanmış, böyle olması gerektiğini biliyordum ama dalgınlıkla yazmışım.
Hatta bu sorun ile ilgili, eskiden bir konu açmıştım ve çözmüştük: https://www.picproje.org/index.php/topic,57712.msg444719.html#msg444719 (https://www.picproje.org/index.php/topic,57712.msg444719.html#msg444719)
Başlık: Ynt: stm32 microcontroller ve wav file
Gönderen: Karamel - 25 Ağustos 2015, 10:41:49
Olsun hocam. Saglik olsun ::) sorunlar ciktikca ogrenme oluyor. Kolayca yapilan seyler egitici olmuyor. 16 bit wav file i calabilmek icin bu konu hakkinda birsuru yazi okumustum. Pat diye calaydik. Belki bir iki tane okuyup bu konuyu gececektim. Kotu degil. Aslinda egitim icin iyi oldu bizim icin ::)