FPGA İLE AKORT ALETİ

Başlatan cuneyt08, 14 Kasım 2012, 21:06:42

cuneyt08

Merhaba arkadaşlar... Üniversite 2. sınıf Elektronik öğrencisiyim. Digital Design Dönem sonu projemde FPGA ile akort cihazı yapmayı düşünüyorum ancak nereden başlayacağımı tam olarak bilmiyorum desem yeridir. Konuyu açma amacım bu proje hakkında ilgili olan ve nereden nasıl başlayabilirimin cevabını bana verebilecek olan arkadaşlar bulup konu hakkında yardım almaktır. vhdl de başlangıç seviyesinin biraz üstünde olduğumu belirtebilirim. Yani henüz çok fazla büyük bir uygulama yapmadım. Elimde BASYS 2 Board var, Digilent'in... Akort cihazı hakkında kafamda bir kaç bir şey var. Örneğin herhangi bir müzik aleti olmasa da signal generatoründen sesi almayı düşünüyorum. Her notanın da ayrı bir frekans değeri olduğunu düşünürsek bu frekansların istediğim değere yakınlık durumunu mu ölçmeliyim? Galiba bir de ADC (analog to digital converter) kullanmam gerekecek. Bunun yanında nasıl bir VHDL kod yazmalıyım? İletişime geçip yardımcı olursanız çok sevinirim özellikle bu konular hakkında... Şimdiden teşekkürler, herkese kolay gelsin...

sadogan

FPGA bilemem ama akort yapmak için frekans ölçmen yeterli olur kanatindeyim.
Her notanın beli bir frekansı var şonuçta.

kralsam

#2
Öncelikle Foruma hoş geldin. Sanırım ilk mesajın.

Bu işlem için senin de söylediğin gibi en başta ihtiyacın olan şey yeteri hızda ADC çevirici. Ondan sonrası FPGA üzerinde sinyal işleme.

Benim düşünceme göre özetle:

Bilgiğim kadarıyla müzik aletleri bir nota bastığında belirli aralıklarda birden fazla frekanslarda ses sinyali üretiyor. Eğer tek sinyal üretmiş olsaydı frekansmetre yaparak sorunu çözebilirdin ama bu şekilde olunca bu yöntem işe yaramaz.

Sinyalin frekans bileşenlerini bulmalısın. Bunu FFT ile yapabilirsin. Daha sonra bu işlem sonucu çıkan frekans genliklerine göre "istediğin frekanslar istediğin şiddettemi?" sorusunu arayarak sonuca ulaşırsın.

Bilmelisin ki FFT çok kolay bir işlem değil. (En azından bana göre. :) )

Kolay gelsin.

@ Düzeltme: Sanırım her nota sabit frekanslıymış ben yanlış biliyormuşum. :)

z

#3
İşin içinde FPGA oluşunu bir kenara bırakıp ana soruna bakarsak;

Gitar teli titretildiğinde ana bileşen aradığımız notanın kendisidir. Bunun harmonikleriyle falan işimiz yok.
O halde gitardan alınan elektronik sinyal basit bir komparatörden geçirilirse doğrudan dörtgen dalga formunda ve frekansı telin titreşim frekansında digital sinyal elde edilir.

Ancak, scop ile gitar sesine bakıp genliği yüksek harmonikler olup olmadığına bakmak gerekir. (Varmi bilmiyorum)
Eğer varsa elde edilen digital sinyalin frekansı ana telin frekansından farklı olur. (Yüksek genlikli harmonik ilave sıfır geçişleri yapabilir)

Eğer yoksa;

Artık dörtgen sinyalin frekansının referans alınacak frekansdan büyükmü yoksa küçükmü olduğuna bakma işi kalır.
Bunu da lojik olarak basitçe gerçeklersin.

Gitar sinyalinin Low to High geçişinde referans sinyal üreten blok tetiklenir. Birazdan bahsedeceğim sayıcı sıfırlanır.
Gitar sinyali (yada referans sinyal) ikinci kez low to high geçişi yaptığında yüksek frekansda sayan sayıcı baslatılır. Peşi sıra gelen referans sinyal (yada Gitar sinyali) sayıcıyı durdurur.

Bu durumda sayıcı, gitar sinyali peryodu ile referans sinyal peryodu arasındaki hata ile orantılı değer tutar. Bu değer ne kadar yüksekse o frekans için hata da o kadar yüksek demektir.

Bu değeri tüm teller için normalize edebilir ya da her bir tel için  ayrı değer kabul edebilirsin.  (Sayac degerini frekansla orantılarsın % hata bulursun)

Aklıma gelen bu yöntemde ADC ile FFT ile işin olmaz. Basit bir deneme yapman da çok zaman almaz. İhtiyacın scop, mikrofon + amplifikatör yada varsa gitarın kristal çıkışlarına bağlayacağın minik bir amplifikatör.

2. sınıf öğrencisi için bu yöntem daha mantıklı. FFT vs en azından 3 hatta 4. sınıf derslerini almayı gerektirir.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

berat23

yapılmaz değil ama bana 2.sınıf için biraz fazla gibi geldi bu proje. onun yerine daha isabetli bir seçim yapabilirsin bence. bunu yapmak için dersini görmediğin birçok konuyu kullanman gerekecek,öğrenirsin bir şekilde yaparsın ama ya eksik bilgi olur,ya da ezbere hazır yaparsın.neyse..

öncelikle dediğin gibi analog sinyali adc ile sayısala çevirmen lazım. adc ile haberleşmen için bir core yazman lazım.

sonra aldığın verileri zamandan frekans ortamına taşıman lazım. bunun yegane metodu fft değil. müzik enstrumanlarında notaları temel harmoniklerine göre sınıflandıracaksın.diyelim 6 akor var,aslında senin ihtiyacın bu 6 frekanstaki güçler.o yüzden fft gibi geniş spektrumda değilde goertzel gibi belirli bandlarda çalışan transformlar işine yarar.projedeki 2. birim bu transform olacak.bilinen 6 frekans için gelen sinyalin gücüne bakacaksın.bunun yanında correlation veya 6 fir filtre ile de yapabilirisn.fftden kolay,mantıklı seçimler.

3.birim ise bu güçleri belirli bir eşikle sınıflandıracak.eşiğin amacı başka sinyallerin istenilen frekanstaki etkisini azaltmak.bu sayede sadece cihazın dibindeki enstrumanın baskın sesi dikkate alınacak(eşik şart değil ama şık olur).sonra en büyük olan hangisiyse o akoru seçecek.

son kısım kullanıcı arayüzü.neticede kararın kullanıcıya bildirilmesi gerekiyor.macera arama,kartın üzerinde seven segment display var,oraya akoru yazarsın 1-6 diye.en kolay kısım bu.böyle ufak parçalara bölüp çalışman iyi olur.

ama ben vazgeç derim:)

kralsam

Hocanın isteklerini bilmiyorum ama bence ikinci sınıf için biraz ağır gelir. Onun yerine 7Seg displayler ile kalite bir Frekansmetre yapabilirisin mesela. Ondan sonra duruma göre projeyi bu uygulamaya taşırsın. Hem ödevin tamamlanmış olur fazlasını da yaparsan daha iyi olur.

cuneyt08

#6
Öncelikle evet forumda yeniyim yani hoşbulduk. Verdiğiniz çok değerli yanıtlar için hepinize teşekkürlerimi sunarım arkadaşlar. Biraz ağır bir proje olduğunu ben de biliyorum ama fikir düşünme işi son günlere kalınca asistanla biraz da zoraki olarak buna karar verebildik. Öncelikle en azından bu işi bir şekilde kıvırmak zorundayım artık. Sadece biraz daha detaylı bilgiye ihtiyacım var, seven segment display olayını biliyorum, frekans değerleri için bunu kullanmak mantıklı geldi ama özellikle ADC kısmı ve VHDL kısmı hakkında biraz daha bilgiye ihtiyacım var. En azından herhangi bir müzik aleti olmasa bile signal generatorunden gelen sinyali işleyecek ve onun üzerinden akortlama gibi bir uygulama yapamaz mıyım, bu kadar zor olmasa gerek, bu benim temennim tabi ki... Şu an için bir hafta içinde projenin Part 1 diye tabir edilen bir kısmını tamamlamam gerekiyor, bu partta nereye kadar geleceğimi kendim belirleyeceğim yani zorlama bir sınır yok. Yani başlangıç olarak şu bir haftada ne kadar yol kat edebilirim o da önemli. Daha önce bu tip bir uygulama yapan varsa daha iyi olabilir aslında, örnek kod açısından falan, hatta yüz yüze bile bir görüşme yapabiliriz tabi uygun olursa... Şimdiden hepinize çok teşekkürler ve iyi çalışmalar...
.

Ersin

Eskiden mızıkıa nın küçük parçası gibi ince boru şeklinde La sesini üreten düdük vardı, o şekilde kulaktan akort ediliyodu.Hocaya sorabilirsin bu sesleri ( hepsini 1 veya 2 oktav ) sadece üretsen proje kabul görür mü.

kralsam

Alıntı yapılan: cuneyt08 - 16 Kasım 2012, 01:16:49
Öncelikle evet forumda yeniyim yani hoşbulduk. Verdiğiniz çok değerli yanıtlar için hepinize teşekkürlerimi sunarım arkadaşlar. Biraz ağır bir proje olduğunu ben de biliyorum ama fikir düşünme işi son günlere kalınca asistanla biraz da zoraki olarak buna karar verebildik. Öncelikle en azından bu işi bir şekilde kıvırmak zorundayım artık. Sadece biraz daha detaylı bilgiye ihtiyacım var, seven segment display olayını biliyorum, frekans değerleri için bunu kullanmak mantıklı geldi ama özellikle ADC kısmı ve VHDL kısmı hakkında biraz daha bilgiye ihtiyacım var. En azından herhangi bir müzik aleti olmasa bile signal generatorunden gelen sinyali işleyecek ve onun üzerinden akortlama gibi bir uygulama yapamaz mıyım, bu kadar zor olmasa gerek, bu benim temennim tabi ki... Şu an için bir hafta içinde projenin Part 1 diye tabir edilen bir kısmını tamamlamam gerekiyor, bu partta nereye kadar geleceğimi kendim belirleyeceğim yani zorlama bir sınır yok. Yani başlangıç olarak şu bir haftada ne kadar yol kat edebilirim o da önemli. Daha önce bu tip bir uygulama yapan varsa daha iyi olabilir aslında, örnek kod açısından falan, hatta yüz yüze bile bir görüşme yapabiliriz tabi uygun olursa... Şimdiden hepinize çok teşekkürler ve iyi çalışmalar...
.

Merhaba,
Eğer sinyal jeneratörü kullanacaksan yapacağın yine dediğin gibi frekans sayma işlemi olacak. Sinyal jeneratörleri kalitesine de bağlı ama genel amaç olarak tek frekans çıkış verir. Sonuç olarak bu kısım için yapman gereken ADC modüle sahip bir FPGA modülü ile gelen analog verinin frekansını ölçmek olabilir. Ama bu işlem için ADC'ye ihtiycaın yok aslında. Sinyalin sıfır noktalarını kare dalgaya çevirecek bir karşılaştırıcı yaparak daha kolay saydırabilirsin.

VHDL kısmını yazarken de problemi biraz daha parçalara böl. Mesela 7Seg display sürücüsünü önce yap. Sonra binary olarak frekans sayma işlemini yap. Sonra bunları bir başka modülde birleştir. gibi..

cuneyt08

#9
Merhabalar...
ADC'nin çıkışından alacağımız dijital datayı yani sinyali FPGA'ya aktararak Basys2 üzerindeki LEDlerde göstermek için ne yapmamız lazım? Yani outputlardan gelen digital data BASYS'e ne olarak geliyor, frekans olarak mı voltaj büyüklüğü olarak mı? Bu datayı FPGA'da göstermek için ne yapmak lazım, nasıl bir kod ve ucf file yazabiliriz? Ayrıca benim bu projede ilerleyen safhalarda breadboarda mikrofon mu kurmam lazım herhangi bir enstrümandan ses almak ve onu digitale çevirmek için?

Şimdiden teşekkürler, herkese kolay gelsin...

cuneyt08

Tekrar merhaba arkadaşlar...

Son gönderime bir cevap alamadım ama... Bi el atsanız, yorumlarınızı bekliyorum...

Şimdiden teşekkürler...