Wave table ve DDS ile ilgili yardım.
  • Herkese merhaba...
    Arduio IDE üzerinden Teensy kullanmaktayım. Esasında Teensy kendi sitesinde ses üzerine gereken herşey var ama benim bazı konuları kafamda yerine oturtmam gerekiyor. O yüzden bir kaç sorum olacak bu konuda. Yardımcı olursanız sevinirim.

    Bir sinus dalgası üretmeye çalısıyorum. 20 hz ile 4800 hz arasında frekansı kontrol edebilmem gerekiyor.
    Önümde iki seçenek var birinci seçenek bana da mantıklı gelen ancak bir türlü kafamda oturtamadığım wavetable seçeneği. Bir sinusun 16 bit olarak örnekleyip index artırarak elde edilmesi. Wavetable da kafamı kurcalayan Table daki örnek sayısını neye göre belirliyoruz. Yani örnekler 512 ,1024 ,2048 ya da sample rate kadarmı olmalı yani 44100 durumu biraz PCM le de karıştırıyor olabilirim. Örnek bir kod paylaşmam gerekirse.


    -----------------------------------------------------
    float samplerate = 45.3514739;
    IntervalTimer myTimer;

    void setup() {

    analogWriteResolution(16);
    myTimer.begin(sinus, samplerate);
    }
    const PROGMEM uint16_t data[2048] = {2048 adet 16 bit Sinus verisi}
    void sinus() {

    Count = Count + 1;
    if( Count >=2048){Count = 0;}
    displayInt = pgm_read_word(data + Count)

    }
    ----------------------------------------------
    Şimdi wavetable daki örnek sayısı neye göre değişmekte ? Frekansı değiştirme için timerın zaman aralığı ile oynacağım yoksa indexi artışını katlayarakmı yapacağım ?

    Wavetable olarak değilde direkt formule ederek yapmak bana basit geldi. sin(2*PI*Faz*.Frekans) Bu formül zaten direkt olarak bir sinus üretiyor ve bunu dac yazıncada güzel bir sinus oluyor ama kesinlikle bu yöntem önerilmiyor. İşlemciyi kullanma açısından.

    Teşekkürler.
  • Atladığım bir konu dikkatimi çekti... Maximum frekans 4800 ise örneklemem 9600 altında olmamalı. Nyquist'in dediği bu. Yani 9600 örnekleme bu frekans aralığı için yetiyorsa 44100 gibi örneklemeye ihtiyaç yok burada sanıyorum.
  • Konu hakkında çok bilgim yok ancak ses verisini sabit olarak flash'a yazmak garip geldi. 2048 adet örnek 2048 hz örnekleme hızı ile 1 saniyede tüketilir zaten.

    Formülle dinamik olarak oluşturmak çok daha mantıklı geldi.
  • Benim örnekleme oranımın kullanmak istediğim frekansla ilişkisi 4800*2 değilmi? Yani 9600 de örneklemek zorundayımki 4800 hz kadar çıkabileyim. 9600 sample rate de ozaman benim 4800 fazda örnek almak gerekki 4800 e geldiğimde sinyal 2 veriylede olsa devam etsin. Şimdi burası tamam ama frekansı değiştirmek istersem index mi artırıcam yoksa sample rate sağlayan saatlemi oynıcam... ?
  • Tabiki timer frekansını arttıracaksın.
  • Konu ile alakalı bilgileri buradan edindim. Tabi burada olaya farklı fakılmış.. İndexin artırımın dan bahsedilmiş. 2048/5/44100 gibi basit bir formülle elde edceğimiz frekansıda söylemişler.

    https://en.wikibooks.org/wiki/Sound_Synthesis_Theory/Oscillators_and_Wavetables

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.