Proton FFT örneğini kullanan oldumu

Başlatan Mucit23, 18 Mart 2012, 22:59:57

GreeN

Alıntı yapılan: Mucit23 - 19 Mart 2012, 12:11:42
Anladım şimdi demek istediğinizi.
Yukarıda En sonda Power isimli bir değişken var. Bu değişken Goertzel in sonucu olsa gerek. Biz hangi frekansı istiyorsak o frekansa göre verdiğiniz işlemleri tekrarlamamız gerekiyor. Ve bu işlemlerin sonucunda Power değişkeni sinyalimizin baskınlık değerini veriyor. Peki Bu değer Hangi aralıkta değişiyor. Daha doğrusu 0 ile XX arasında değişen bir değermi?

Mesela 10*sin(2*PI*1000*t) sinyalinden 10K örnekleme frekansı ile 500 örnek alalım ,

F=1000;
N=500;
a=Goertzel(samples,F,N);  //F = hedef frekans , N = örek sayısı , samples[500] = örneklerimiz

sonuç ;
a=9,99997520446777   
yani dönen değer genlik oluyor.



Terörü Lanetliyoruz.

Mucit23

Burada 18F4550 İle güzel bir devre yapılmış.
http://www.waitingforfriday.com/index.php/Real-Time_Audio_Spectrum_Analyser
Bende bunun gibi birşey yapmak istiyorum. Adam 18F de bunu FFT ile yaptığına göre bende aynı işlemi goertzel ile rahatlık ile yapabilirim. Araştırmaya devam edeyim

Mucit23

Arkadaşlar Protonda bazı değişkenler aşağıdaki gibi tanımlanıyor
Dim Temp as Word SYSTEM

Bu değişkenin En sonuna Eklenen SYSTEM ne anlama geliyor. Değişkene ne gibi özellikler katıyor?

burak ozturk

#18
http://elm-chan.org/works/akilcd/report_e.html

burdada eleman atmel le yapmıs gerçi dil proton değil ama fikir verebilir.Bir aralar bende heves etmiştim ama 8 bitliklerle(kendi namıma konusuyorum:) ) bu işi yapabilen yok sanırım.
happy coding.

berat23

#19
Alıntı yapılan: Mucit23 - 19 Mart 2012, 13:05:54
Burada 18F4550 İle güzel bir devre yapılmış.
http://www.waitingforfriday.com/index.php/Real-Time_Audio_Spectrum_Analyser
Bende bunun gibi birşey yapmak istiyorum. Adam 18F de bunu FFT ile yaptığına göre bende aynı işlemi goertzel ile rahatlık ile yapabilirim. Araştırmaya devam edeyim

o örnekte real time demiş ama bence real time değil,nerdeyse 6 frame de 1i ni gösterebiliyor.20ksps değilde daha yavaş örneklenirse real time olur.


ekleme:dspic kullanırsan fft algoritmasında epey hızlanırsın.8*8 multipiler bu işe pek uygun değil.

Mucit23

Arkadaşlar Proton ile bu konuda bir uygulama yapmak istiyorum İşin mantığını çözdüm fakat anlamadığım birkaç nokta var.Belki 18F serisi pek uygun değil ama olsun ben yine demenek sonucu gözlemlemek istiyorum.
İşlemlere başlanmadan önce kolaylık açısından bazı sabitlerin belirlenmesi gerekiyor.
Bunlardan birisi örnekleme Frekansı belirlemek.
İşlemci olarak Kendime 18F4620 yi seçtim. 40Mhz de çalıştırıyorum. ADC ayarlarında ise 10 bit çevrim için ADC çevrim clock sayısını 12 Tad olarak ayarladım. Min Çevrim için böyle olması gerekiyor anladığım kadarıyla. Ayrıca ADC clock Kaynağınıda FOSC/32 Yaptım. Yaptığım ayarlar uygun olmayabilir.

Ben çevrim süresi, örnekleme frekansı nasıl hesaplanır veya ayarlanır hiç bilmiyorum. 40Mhz için bir komut kaç ns de işlenir. ADC çevrimi kaç ne kadar sürer. Bu konularda çok eksiğim var. Aslında temel bilinmesi gereken konular. Benim daha önce hiç ihtiyacım olmamıştı.

Bu konuda yardımcı olursanız sevinirim.


berat23

adc çevriminin ne kadar süreceği basit,20khz ile örneklersen bir örnek alman için 1/20khz=50us sürer.bir frame (örnektekini anlatıyorum) 64 veriden oluşur,yani 32ms de bir aldığın verilerin fftsini alıp,ekrana bastıracaksın.bu fft ve görüntüleme işlemini diğer frame gelmeden yani 32ms de yaparsan real time olur kabaca.adcden gelen verileri interrupt'larla ram'e yazarsın,hatta dma olursa daha mantıklı.ana programda fft ve lcd de görüntü gösterme çalışır.burada ram yeter mi bakmak lazım,ama yapıldığına göre yetiyor demekki,sadece saklanan veriler 256kb tutuyor,aradaki ve diğer işlemleri bilemiyorum,kabaca bu.

proton hakkında bilgim yok ama real time çalışmak için böyle hazır fonksiyonlu yüksek seviyeli diller uygun değil.C de bile yazsan bir komutun tam olarak ne kadar zamanda işletildiğini bilemezsin,onun için asm'de yazman lazım ki yazdığın programın kaç saniyede çalıştığını bilesin.bunu c veya protonda ölçmen için basit bir benchmark yapman lazım.debud yapıp,PC'yi okuyarak kac cycle'da bitmiş bakabilirsin.anlatımımda yanlışlar olabilir,kabaca seri biçimde anlatmaya çalıştım.

bunlar aslında temel konular.proton da kod yazarsanız öğrenemezsiniz elbette.tavsiyem fft 32 falan değil de 8 band goertzel'le uğraşın,daha basit ve öğretici olur.

Mucit23

hocam zaten benimde amacım odur. Kalkıpda Sesi birden Sesi 32 Banda ayıracak değilim yapamamda zaten.

Benim aklımda şöyle bir senaryo var.
ADC hardware kesmesini aktif ederim. Yani ADCçevrimi bittiğinde kesme oluşur.  Bende kesme alt programında örneklerimi alırım. (Buradada bilemediğim bir konudaha var Sonra döneceğim)
Örnek alma işlemim bittiğinde yani tüm örneklerimi aldığımda ana programda goertzel işlemlerini başlatmak için Bir biti set ederim ve ADC çevirimini kapatırım.
Daha sonra ana program ile Goertzel işlemlerimi yürütürüm. Sonuca ulaştığımda daha önce aldığım değerleri siler Tekrar ADC çevrimini başlatırım.
Kabaca Böyle bir senaryo oluştu aklımda.

Acaba Kesmeleri açıp hardware kesmelerinden ADC çevrim kesmesini açtığımda ADC okuma komutu verip ADC okuma işlemi bittiğindemi kesme oluşuyor Yoksa ADC çevrim kesmesini aktif ettiğimde sürekli okuma yapıp her bir çevrim işlemi bittiğinde kesmeyemi gidiyor.