Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: z - 09 Eylül 2015, 17:11:55

Başlık: Cordic Algoritması Hakkında
Gönderen: z - 09 Eylül 2015, 17:11:55
Alıntı yapılan: alicavuslu - 09 Eylül 2015, 15:49:48
VHDL ile Cordic (sin & cos) Tasarımı...
http://www.alicavuslu.gen.tr/2014/12/23/vhdl-ile-cordic-tasarimi/ (http://www.alicavuslu.gen.tr/2014/12/23/vhdl-ile-cordic-tasarimi/)

@Aliçavuşlu.

Cordic algoritması ile sin cos işleminin prensibini anlatabilirmisin?

Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 09 Eylül 2015, 17:38:10
Cordic genellikle trigonometrik ve hiperbolik fonksiyonların değerlerinin hesaplanmasında kullanılan bir yöntem. Her yöntemde uygulayacağınız matematiksel yaklaşım değerleri farklılıklar gösterecektir. Sinüs ve cosinüs değerlerini elde edebilmek için uygulayacağınız döngü değerleri kadar sabit parametre değerlerini elde ediyoruz. 20 iterasyon için angles = atan(2.^-(0:19)); ve Kvalues adlandırdığımız 20 adet sabit değeri elde ediyoruz. Döngü sayısının artırılması daha iyi sonuç elde etmemizi sağlar.

Daha sonraki işlemlerde adım adım bulunması istenen açı değerine yaklaşım yapılmaktadır. İterasyon bitiminde ise algoritma açı değerleri sonuçlarını döndürmektedir. Daha öncede dediğim gibi iyi sonuç elde etmek için döngü sayısının fazla olmasını öneririm.

Detaylı bilgiyi aşağıdaki linkten elde edebilirsiniz. Umarım ifade edebilmişimdir.

https://en.wikipedia.org/wiki/CORDIC
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 09 Eylül 2015, 17:56:14
Cordic konusuna defalarca baktım fakat anlayamadım. O yüzden sordum. Müsait bir zamanınızda algoritmayı sözel olarak açıklarsanız çok memnun olurum.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 10 Eylül 2015, 10:29:41
Cordic algoritması, X-Y eksenlerindeki mevcut olan iki vektörün arasındaki açının vektörlerin koordinat sistemlerinde kaydırılması metodu olarak ifade edilebilir. Açı değeri X-Y eksenlerinde kaydırma ve toplama işlemleri ile hesaplanır. Cordic Algoritması gerçeklenmesi aşağıdaki şekilde gösterilmiştir.

(http://i.hizliresim.com/WZvj4q.png) (https://hizliresim.com/WZvj4q)

Bir sonraki vektör pozisyonlarının hesaplama işlemleri aşağıda verilen matematiksel ifadedeki gibidir.

(http://i.hizliresim.com/po3ORL.png) (https://hizliresim.com/po3ORL)

Yukarıda da bahsedildiği gibi eksenler arasında kaydırma işlemlerin yapılması için kullanılan Ө açı değerinin her iterasyonda hesaplama işlemi aşağıdaki gibi hesaplanmaktadır.

(http://i.hizliresim.com/ylakMa.png) (https://hizliresim.com/ylakMa)

Cordic algoritmasının çalışma prensibini biraz da sayı tahmini uygulamasına benzetmekteyim. Başlangıç koşulundan başlayıp kontroller ile varmak istediğiniz sayıyı tahmin ediyorsunuz. Aşağıda bunu tanımlayan bir örnek mevcuttur.

(http://i.hizliresim.com/Xo1ZJR.png) (https://hizliresim.com/Xo1ZJR)
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 10 Eylül 2015, 12:36:34
AliÇavuşlu hocam ellerine sağlık. Teşekkürler.

Cordic algoritmasından ilk kez 90 lı yıllarda haberdar oldum. Okuduğumda hiç bir şey anlamadım. Bugüne kadar nerede Cordic görsem muhakkak okurum ama gene anlamam.

Şimdi de anlamadım. Bu Cordic'i  okuyarak değil ancak birinden dinleyerek anlayabilirim diyordum ki seni buldum.

Acelem yok. Soru cevap şeklinde gidebilirmiyiz?

(http://i.hizliresim.com/WZvj4q.png)

Mesela 52 derecenin sinüsünü bulalım dendiğinde 52 derece grafikteki hangi açıya karşılık geliyor?

Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 10 Eylül 2015, 13:44:37
Hocam tabloyu verirken eksik bilgi verdim. Kusura bakmayın. Tabloda 37.38 derece açıya yaklaşık değeri bulmaya çalışılmaktadır. 0-100 aralığında bir sayıyı programımıza tahmin ettirmek istediğimiz yazılımda ilk değerimiz 50 olur. Yukarı veya aşağı komuta göre sayıya 25 eklenir ya da çıkarılır. Benzer şekilde bir sonraki adımda 12.5 eklenir çıkarılır (Bu kısmı tam ifade edememiş olabilirim.).

Tabloyu incelediğimizde referans açı değerimiz 0'dır. -90 ve +90 derece aralığında tahmin etmemiz gerekmektedir. Tabloda bu kısım eksik gibi. 37.38 derecenin referans olarak bulunması istenmiş. Biz ilk olarak  45 dereceyi ekleme yapıyoruz. Daha sonra ise yukarıda 2. olarak verdiğimiz formülden hesaplanmış olan açı değerini çıkarıyoruz. Buda 26.6 derecedir. Yeni değerimiz 18.4 derece oldu. 3. adımda ise tekrar 2. formülde hesaplanan yeni 3. açı değeri 14, 18.4 dereceye eklenmektedir. Yeni değer 32.4 olamktadır. Yani algoritma o anki iterasyonda size 32.4 derecenin sonuçlarını vermektedir. İterasyon sayısının artması ile elde edeceğiniz açı değeri referans değerine çok fazla yaklaşacaktır. 7. iterasyonda 0.58 derecelik fark elde edilmiş. Örneğin 28 iterasyonda bu fark daha da azalacaktır.

Grafikte Y olarak ifade edilen değer sinüs, X olarak ifade edilen değer cosinüse karşılık gelmektedir.

Anlaşılmayan yerler varsa dilim döndüğünce ifade etmeye çalışırım...
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 10 Eylül 2015, 14:20:12
Anlamaya başladım.

Öncelikle  1, 1/2,  1/4, 1/8, 1/16, 1/32, 1/64, 1/128 .... şeklinde yani

1, 0.5,  0.25, 0.125, 0.0625, ..... şeklinde değerlere ait ArcTan tablosu hazırlıyoruz.

ArcTan(1) ile 45 dereceyi
ArcTan(0.5) ile 26.565 dereceyi
ArcTan(0.25) ile 14.036 dereceyi
ArcTan(0.125)=7.125 dereceyi
.....

Tablomuzda saklıyoruz.

Böyle bir tablomuz var.

37.38 derecenin sinüsü hesaplanmak istensin.

1) İşleme 0 derece ile başlıyoruz.

45 derece eklersek yeni açımız 45 derecedir ve 45>37.38  olduğundan bu kez

1) 45-26.565=18.435 işlemini yapıyoruz.

18.435 < 37.38 bu durumda

18.435 + 14.036 = 32.471

32.471<37.38 bu durumda

32.471 + 7.125 = 39.596

39.596 > 37.38 bu durumda bir sonraki tablo değerini bu açıdan çıkartacağız.

Çok sağolasın.

Bundan sonra anlaşılması gereken kısım trigonometrik bağıntı kısmı. Yani yukarıdaki şekilde açıya tablodaki sıralanmış değerlerrle toplam yada fark alarak yaklaşırken
aranan sinüs değerinin nasıl hesaplandığı.

Gerçekten çok teşekkürler.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 10 Eylül 2015, 14:28:34
Hocam açı hesaplama işlemlerini de 1. denklemdeki gibi yapıyoruz. Bu denklemde ise bir önceki adımdaki hesaplanan X ve Y vektör değerlerini hesaplanan fark açı deperi kadar kaydırma işlemi yapiyoruz. Yani şekle baktığımızda beta olan ilk açı değeri teta kadar artıyor ve yeni açı değeri alfa oluyor. Biz 1. denklem ile beta açısı ile konumlanmış vektörleri teta kadar kaydırarak alfa değerindeki değerlerde konumlandırıyoruz. Başlangıç değerleri burada X için 1 Y için de 0 değeri alınarak kaydırılıyor.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 10 Eylül 2015, 15:22:17
(http://i.hizliresim.com/N4BaRa.png) (http://hizliresim.com/N4BaRa)

Qn acısını bılıyoruz ve deltateta kadar ilerleyip Qn+1 açısına ulaşıyoruz.

Aşağıdaki işlemlerle sonuca ulaştım. Ancak verdiğiniz bağıntıdan biraz farklı.

(http://i.hizliresim.com/Xo1Vr3.jpg) (http://hizliresim.com/Xo1Vr3)

Yaptığım işlemlerde ve sonuçta bir terslik varmı?

Fakat Cordicde  çarpma vs olmaz sadece toplama ve kaydırma var deniyordu.

Benim bulduğumen son ifadeye göre

Xn+1 ve yn+1 değerelerini Xn, Yn ve Tan Delta teta dan hesaplayabiliyoruz.

TanDelta Theta tablosu zaten hazırlanmıştı yani aşağıdaki gibi mevcut.

(http://i.hizliresim.com/Xo1ZJR.png)

En son asamada

Sinüs değerimizi   yn+1 / (Karekok( Yn+1^2 + Xn+1^2)) den mi hesaplayacağız?


!!!!!!!! Yoksa bir dakika Yn+1 doğrudan bizim sinüs değerimiz mi? !!!!!!!!!!!!



mesaj birleştirme:: 10 Eylül 2015, 14:11:54

Evet yahu burada çarpma yapmıyoruz. Tan Delta Theta değerleri 2^n-1 değerlerinden ibaret. Dolayısı ile sağa kaydırma yapmak yetiyor.

Topla kaydır, topla kaydır yada çıkart kaydır.

Ne yalan söyleyeyeyim 2003 yılından beri forma üyeyim. 

Forum bugün bana bu konu ile en büyük katkıyı sağladı.

Sağolasın Aliçavuşlu.

Fotosunu verdiğim elişlemlerinde hata yamış olsam bile artık gerisini hallederim.

Cordic'i kim ortaya attıysa gerçekten zeki bir adammış.

Pratikteki uygulamaları sanırım yaygın olarak ilk kez HP yapmış ve hesap makinelerinde kullanmıştı.

Diğer firmalar seri açılım yaparken HP cordic kullanmıştı.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 10 Eylül 2015, 16:15:10
Hocam yaptığınız işlem ile matris çarpımının sonucu aynı.

(http://i.hizliresim.com/4ky2j7.jpg) (https://hizliresim.com/4ky2j7)

Dediğiniz gibi Yn+1 bizim sünüs, Xn+1 de cosinüs değerimizi vermektedir. Sadece işlem sonunda bu değerleri sabit bir katsayı ile çarpmamız gerekmektedir. Bu sayıda itersayonu çok fazla almanız durumunda  0.607252935 olmaktadır.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 10 Eylül 2015, 16:20:31
Bu  0.607252935 nerden geldi şimdi?

Neden çarpıyoruz?

Birde fazla üzerinde durmadım ama aşağıdaki matrisin önündeki cos terimi nerden çıktı?

(http://i.hizliresim.com/po3ORL.png)

Yukarıdaki ifadeye göre

Xn+1=Xn CosQ - Yn SinQ
Yn+1=Xn SinQ  + Yn CosQ

çıkmıyormu?

Halbuki ben

Xn+1=Xn - Yn tanQ
Yn+1=Yn + Xn tanQ

Buldum.

Edit: Galiba ben Delta Thetayı kullanıyorum. Senin verdiğin ifade bir önceki açı değeri Thetayı kullanıyor.

Sorun yok galiba.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 10 Eylül 2015, 16:36:08
Cos teta her iterasyonda da kullanılabilir fakat genel kullanılmıyabiliyor. Aslında o ifadenin karşılığı aşağıda eşitliğin ilk tarafında gösterilen kısım. Bu eşitlik cos tetaya karşılık geliyor mu açıkçası hesaplayamadım. İkisi farklı çalışmadaki gösterim. Müsait bir zamanda onunda kontrolünü yaparım.

(http://i.hizliresim.com/vLWd0z.png) (https://hizliresim.com/vLWd0z)

Fakat algoritma koşturulurken bu parametre kullanılmıyor. Bunu ayarlama parametresi gibi düşünebilirsiniz. Çıkışta sizi olmanız gereken eksene yaklaştırıyor. Bu sayıda aşağıdaki denklemdeki gibi hesaplanıyor. Açıkçası çokta üzerinde durmamızı gerektirecek bir nokta değil.

(http://i.hizliresim.com/gAMl5Z.png) (https://hizliresim.com/gAMl5Z)

Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 10 Eylül 2015, 16:39:57
Neyse kafa yorarım.

Şimdi can alıcı bir konuya geliyoruz.

Sin fonksiyonunu noktadan sonra 10 digit doğrulukla hesaplamak istiyorsak

Ara işlemleri yaparken sabit bit uzunluğu ile çalışıyor olalım.

ikili sistem aritmetiğinde kullanmamız gereken bit uzunluğu en az ne olmalıdır?

Bu soru hep kafamı karıştıran bir soru olmuştur.

Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 10 Eylül 2015, 16:56:23
Hocam VHDL kodları aslinda tam da bu sorunuza cevap olacak şekilde kodlandı. Generic kısımda tanımlanmış  MUL_COEFF ve DATA_SIZE sabitleri ile ayarlamalar yapabilirsiniz. Burada  MUL_COEFF örneklenmiş sinyalin bit uzunluğunu göstermektedir. Yani simülasyon sonuçlarını size yorumladığımda 20 bitlik bir uzunluktaki sonuç işleminde yaklaşık on binde birden daha az hata oranı elde etmektesiniz. Buda sizin için göz ardı edilebilecek bir hata oranı olmaktadır.16 bit için yaptığım simülasyonda da on binde 5 civarı hata çıkıyor. Ki buda göz ardı edilebilir. 12 bit için hata binde bir civarında. Göz ardı etmek pekte mantıklı olmayabilir. Geri beslemeli bir sistem için büyük sorun teşkil edebilir.

Bu değerler daha detaylı analiz edilip ifade edilmeli. Ben şimdlik sizin aklınızdaki soruları gidermek için cevaplamaya çalıştım.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 10 Eylül 2015, 17:05:38
Aslında sorumun cevabına nasıl matematiksel olarak yaklaşılacağını merak ediyorum.

Ve bu tartışma bana göre düşüncemi haklı çıkartttı.

Düşüncem, bu tip algoritma tartışmalarını;

ya donanım tasarımcıları ile yapacaksın (ki burada, VHDL tasarımcısı olarak sen oluyorsun),
ya da asm programlama yapanlarla,

tartışacaksın.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 10 Eylül 2015, 17:10:57
Açıkçası Hocam sayı formatı analizlerinin belirlenmesi işlemini VHDL yerine Matlab'da yapıyorum. Ama VHDL kodlamalarını yaparken generic olarak yazıyoruzki değişikliklerimiz kolay olsun.

FFT, Filtre, matris işlemleri vb uygulamalarda sayıların duyarlılıklarını Matlab ile ayarlıyorum. Donanıma yakın olması için fix komutu ile sayı yuvarlama işlemlerini yapıyorum ki bunu özellikle belirttim. round komutu ile tam olarak donanımsal işlem karşılığı olmuyor. Daha sonra floatin point formatında sonuçlarla karşılaştırıp ortalama karesel hata değerine bakıyoruz. Burada elde edilen hata oranı doğrultusunda sayı formatına karar verip generip parametresinde ilgili yerine yazıyoruz.

Cordic için böyle bir Matlab kodu olmadığından direk  simülasyon sonuçlarını verdim :)
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 10 Eylül 2015, 17:34:51
Bende bu amaçla visual dillerle test programı yazıyorum.

real yada extended vs tanımlı değişkenlere atadığım sayıları 2^n ile çarpıp ardından round ile yuvarlıyorum.

Algoritmayı bu int değerlerle integer aritmetik yaparak işletiyorum. En son aşamada 2^-n ile sonucu elde edip bir de real değerlerle hesapladığım değer arasındaki farka bakıyorum.

N için 8, 16, 24, 32, 40, 48, 56, 64 ..... gibi değişik değerler için aradaki fark seçmiş olduğum bit sayısının yeterli olup olmadığını deneysel olarak elde etmemi sağlıyor.

Fakat bu çözümün matematiksel hiç bir özelliği yok.

Zaten sayısal sinyal işlemenin en can alıcı noktası burası. Burası yanlış kurulursa  inşa edilen yapı kesin çökecektir.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 10 Eylül 2015, 17:40:45
Bu iş için açıkçası matematiksel bir yöntem var mı bilmiyorum. Ama daha önce hiç karşılaşmadım. Çünkü her sistem için farklı hata oranları sonuca olumsuz etkileyebilmekte. Bu yüzden sistem modelinin de haricen çıkarılıp analizler yapılması gerekebilir.

Mesela filtre çıkışına fft uygulayacaksanız mormalde binde birlik hata oranı filtre çıkışını çok etkilemez iken fft sonuçlarında hatalara neden olabiliyor. Dediğinzi gibi bunlarda yanlış yapıldığında yaptığınız işin bir önemi kalmıyor.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 10 Eylül 2015, 17:43:53
Bu bit sayısına deneysel yollardan ulaşıldığını düşünmüyorum kesinlikle bunun bir matematiği vardır.

Matematikçilerle anlaşamıyorum çünkü derdimi anlatamıyorum. Kendilerini vermiyorlar can kulağıyla sorumu dinlemiyorlar.

(http://i.hizliresim.com/vLWd0z.png) (https://hizliresim.com/vLWd0z)

------------

1/(karekök(1+tan^2(x)))=cos(x) oluyor.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 10 Eylül 2015, 17:46:56
Hocam analiziniz için teşekkür ederim.

Daha önce matematiksel yaklaşım olacağını hiç düşünmemiştim. Bit sayısının hesabı ile alakallı literatür taraması yapıp edindiğim bilgileri sizinle paylaşırım.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 10 Eylül 2015, 17:52:47
FIR sistemlerde bu belki çok fazla sorun değil ama IIR sistemlerde olmazsa olmaz.

Cevap bulursan sevinirim.

Aslında konuya bayağı kafa yormuşluğum var ama sonuca ulaşamadım. Kağıt kalemi kolay fırlatan tiplerdenim.



mesaj birleştirme:: 10 Eylül 2015, 17:27:09

Cordic algoritmasında eksik bir kısım kalmasın

(http://i.hizliresim.com/Xo1Vr3.jpg)

Bu işlemlerde

Xn+1= Xn - Yn * Tan(DeltaTeta)
Yn+1= Yn + Xn * Tan(DeltaTeta)

Burada

Xn+1=sin Teta
Yn+1=cos Teta

Diyemiyoruz.

Diyebilmemiz için Bu değerleri 1/Xn ile çarpmamız gerekiyor.

Neden çarpmamız gerektiğini yukarıdaki işlemlerden görebilirsiniz.

Yn+1/Xn+1 oranında 1/Xn leri sadeleştirmiştik. Bu sadeleştirme tanjant değerini değiştirmez. Ancak bu pay ve payda daki değerlere sin ve cos dememize engel olur.

Her iterasyonda bir önceki iterasyonda sadeleştirilen 1/xn leri Xn  ile çarpmayı gerektirdiğinden

Cos(45) * cos(26.6) * cos(14) * cos(7.1) .... = 0.607252935 ye gidiyor.

yani cos(Atan(1))*cos(Atan(1/2))*cos(Atan(1/4))*cos(Atan(1/8))*........
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 21 Ekim 2015, 17:02:18
Aliçavuşlu bir gün buluşalım sana kebap ısmarlıyayım.

Cordic algoritması (http://www.cncdesigner.com/wordpress/?p=5198)
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: JOKERAS - 21 Ekim 2015, 17:51:07
z ve aliçavuşlu ustalar,

Hazır lafı geçmişken Şu filitreleri incelesek Fır,Iır,Ma vs.
Kaç çeşit filitre var,ne işe yararlar,nerelerde kullanlırlar vs.

Mesela bir ara CVD(Capasitive Voltage Divide) okumasıyla Capasitif matrix buton yapmak istemiştim.
Yaptım aslında ama tam istediğim gibi olmadı.
Bir kaç çeşit filitre algoritması yaptım yemedi,haddi leen dedi:)
Bu Adc okumalarında veya frekans değişim algılamalarında gürültü en büyük problem.

Şu filitre konusunu matematiksel olarak değilde C dili üzerinden tane tane mantığını anlatan biri olsa
Kebap ne kelime,Bursa İskender,buz gibi kola üstünede kaymaklı tel kadayıfı ısmarlarım:)
Varmısınız?Vaaarım diyooor:)

Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 21 Ekim 2015, 18:07:24
Digital filitreler

y(n)=K0x(n)+K1x(n-1)+K2x(n-2)+K3x(n-3)+.... şeklinde yazılırsa FIR filitre diye anılr.

Çıkış sadece girişin o anki ve geçmiş değerlerine bağlıdır.

Yok eğer

y(n)=K0x(n)+K1x(n-1)+K2x(n-2)+K3x(n-3)+.... + A0y(n)+A1y(n-1)+A2y(n-2)+A3y(n-3)+....şeklinde yazılırsa IIR filitre diye anılr.

Burada x(n) giriş sinyalinden alınan n. sample değeri anlamına gelirken y(n) n. sampledaki çıkış değeridir.

Digital filitre denen olay bundan ibaret.

Peki An ve Kn değerleri nasıl hesaplanacak.

Ben bu kısmı beceremiyorum. Bu yüzden Analog filtre tasarlayıp ardından bunu sayısallaştırıyorum.

n. dereceden bir filitre tasarımında, Matlab ya da özel filitre tasarım programları kullanmadan katsayıların hesaplanmasını anlatacak olan varsa ben de dinlemek isterim.

Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: JOKERAS - 21 Ekim 2015, 18:30:53
Eyvallah z usta sağolasın.

Şimdi elimde sinüs 50Hz veya 100Hz daha yüksek frekanslardada olabilir böyle  bir sinyal var,bu sinyal temiz değil.
Sinyalin üzerinde bir sürü gürültü var,bu gürültüleri yok edip temiz bir sinüs elde etmek istiyorum.

Veya elimde 100KHz kare dalga bir sinyal var,bu sinyalin pulse'lerinde gürültü var ayrıca bu sinyal çevresel etkilerle
genel olarakta rastgele bir şekilde dalgalanıyor bunu nasıl filitre ederiz?

Yada Analog Audio sinyalide olabilir bunu dijitale dönüştürmek vs.


C dilinde örnek olursa süper olur.


Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: fatih6761 - 21 Ekim 2015, 20:33:56
Alıntı yapılan: z - 21 Ekim 2015, 18:07:24
Digital filitreler

y(n)=K0x(n)+K1x(n-1)+K2x(n-2)+K3x(n-3)+.... şeklinde yazılırsa FIR filitre diye anılr.

Çıkış sadece girişin o anki ve geçmiş değerlerine bağlıdır.

Yok eğer

y(n)=K0x(n)+K1x(n-1)+K2x(n-2)+K3x(n-3)+.... + A0y(n)+A1y(n-1)+A2y(n-2)+A3y(n-3)+....şeklinde yazılırsa IIR filitre diye anılr.

Burada x(n) giriş sinyalinden alınan n. sample değeri anlamına gelirken y(n) n. sampledaki çıkış değeridir.

Digital filitre denen olay bundan ibaret.

Peki An ve Kn değerleri nasıl hesaplanacak.

Ben bu kısmı beceremiyorum. Bu yüzden Analog filtre tasarlayıp ardından bunu sayısallaştırıyorum.

n. dereceden bir filitre tasarımında, Matlab ya da özel filitre tasarım programları kullanmadan katsayıların hesaplanmasını anlatacak olan varsa ben de dinlemek isterim.

Hocam FIR tasarımında özel bir şey yok diye biliyorum ben. Hatırladığım kadarıyla şöyle:

Bir filtre tasarlarken aslında freq. domain'de belirli bir alanı korurken diğer kısımları atmak istiyoruz. Bunu istediğimiz kısımları 1 ile diğerlerini 0 ile çarparak elde edebiliriz.
Freq. domainde bu çarpım fonksiyonunu plot ettiğimizde çift taraflı bir unit-step fonksiyonu oluyor. Yani parçalı fonksiyon olarak frekans;
-w0 dan küçükse 0
-w0 ile w0 arasında ise 1
w0 dan büyükse 0 dersek 0->w0 aralığını geçiren bir low pass filtre elde etmiş oluruz.
Bu fonksiyona ters fourier operatörünü uygularsak:
h(t) = integral(1*e^(-jwt)dw, from -inf, to +inf) olur. 0 olan kısımları integrale hiç dahil etmeye gerek yok.
İntegrali çözdüğümüzde;
h(t) = 2*sin(w0 * t) / t elde ederiz.

Freq. domainde (s-domainde olduğu gibi) çarpma işlemi time-domainde konvolüsyona karşılık gelir.
Time domain giriş sinyalimizi yani x(t) yi h(t) ile konvolüsyon işlemine tabii tutarsak sinyali teorik olarak filtrelemiş oluruz.
Peki discrete time da konvolüsyon nasıl olacak?
Bunun için filtre derecesini seçmemiz gerek. Mesela 7. dereceden olsun.
Bu 7 bize t için -3 ten 3 e kadar değerleri verir. Ayrık katsayılar
k[0] = h(-3)
k[1] = h(-2)
...
k[6] = h(3)
olacak şekilde 7 tane katsayı verir.
Giriş verimizin en güncel 7 değeri x[n] ... x[n-6] olsun.
Çıkış değerimiz konvolüsyona göre;
y[n] = x[n] * k[0] + x[n-1] * k[1] + x[n-2]*k[2] + ... + x[n-6]*k[6] olur.
Tabi burada continuous olan h fonksiyonunu discrete k'ya çevirirken oluşan veri kaybı filtrenin kazancında frekansa bağlı istenmeyen jump'lar oluşturur. Bunları azaltmak için windowing olayı uygulanır.
k değerleri hesaplanırken bir window functionın (triangle, hamming, kaiser vs..)  değerleriyle çarpılarak daha yumuşak geçişli bir katsayı listesi oluşturulur.

Bildiğim kadarıyla fir bu şekilde hocam. IIR yi hatırlamıyorum tam.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 21 Ekim 2015, 23:25:54
Şimdi anlayamadığım iki konu var.

1) Sen universiteye bu sene başlamış birisi olarak bunları nasıl bilebilirsin?

2)
Alıntı YapBunun için filtre derecesini seçmemiz gerek. Mesela 7. dereceden olsun.
Bu 7 bize t için -3 ten 3 e kadar değerleri verir. Ayrık katsayılar
k[0] = h(-3)
k[1] = h(-2)
...
k[6] = h(3)
olacak şekilde 7 tane katsayı verir.
Giriş verimizin en güncel 7 değeri x[n] ... x[n-6] olsun.
Çıkış değerimiz konvolüsyona göre;
y[n] = x[n] * k[0] + x[n-1] * k[1] + x[n-2]*k[2] + ... + x[n-6]*k[6] olur.

Bu kısmı biraz daha açabilirmisin?

Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: fatih6761 - 22 Ekim 2015, 00:04:22
Alıntı yapılan: z - 21 Ekim 2015, 23:25:54
Şimdi anlayamadığım iki konu var.

1) Sen universiteye bu sene başlamış birisi olarak bunları nasıl bilebilirsin?

2)
Bu kısmı biraz daha açabilirmisin?
1) özel ilgi diyelim hocam :)
2) Hocam asıl sorunuz filtre derecesiyle ilgili anladığım kadarıyla. Orada 0'ı ortaya almak için yapılıyor.
Aşağıda konvolüsyonu açıkladım, aslında sonsuz elemanla çarpma yapılması gerektiğinden ne kadar çok eleman kullanırsanız
o kadar iyi ama sonlu bir sayı olacak şekilde N. dereceden filtrede N (impulse response adım sayısına göre N) bir miktar hata olacak.
sinx/x fonksiyonu y eksenine göre simetrik olduğundan ve x=0 da en büyük değere sahip olduğundan göreli hatayı minimize etmek için 0'ı ortaya alacak şekilde soldan ve sağdan (N-1)/2 eleman alınıyor.
Yoksa 0..N veya -N..0 da alsak olur ama hata çok büyük çıkar. Burada hatadan kasıt freq. domeninde olduğundan filtre işlevini yitirecektir.

================================================================

Konvolüsyon teoremi: https://en.wikipedia.org/wiki/Convolution_theorem (https://en.wikipedia.org/wiki/Convolution_theorem)
Özellikle bizi ilgilendiren şu denklik:
(https://upload.wikimedia.org/math/4/a/6/4a6b091608e53abcb729d21f918203fb.png)
Burada diyor ki;
"Frekans domeninde iki fonksiyonun çarpımı = Zaman domeninde o iki fonksiyonun konvolüsyonu"
Biz ne yapmak istiyoruz? Frekans domeninde bir fonksiyona belirli katsayılar uygulamak istiyoruz.
Freq. domeninde iki fonksiyonu çarpmak için normalde yöntem şu şekilde:
1) freq. domeninde katsayıları hesapla.
2) sinyali t. d. den freq. d. ye çevir.
3) fonksiyonları çarp
4) sonucu f.d. den t.d. ye geri dönüştür. Bu teoremi bulan da demişki bu kadar ara işleme gerek yok bu 4 basamak direkt time domain'de halledilebilir.
Teoremin ispatı konumuz kapsamında değil sanırım (wiki de verilmiş).

Peki konvolüsyon konvolüsyon diyoruz ne bu konvolüsyon? Convolution kelime anlamı olarak sarılma/sarmalanma demek yanılmıyorsam.
Genel tanım itibariyle cont. iki fonksiyonun konvolüsyonu (sarmalanması) şöyle hesaplanıyor:
(https://upload.wikimedia.org/math/1/8/5/185ff6a342b3ec1719643396613151e2.png)(https://upload.wikimedia.org/math/e/e/1/ee1f7dc17b6ce1f5dab35384e54c22d8.png)

Bizim durumumuzda sürekli olmayan ayrık (discrete) fonksiyonlar için bu integral Riemann toplamına dönüştürülebilir.

conv(f, g) =  sum ( f(n)*g(T-n) for n from 0 to N )

Olay bundan ibaret hocam.
Tabi kodlarken loop olarak yazıyoruz duruma göre. SSE AVX SIMD tarzı imkanlar varsa elle optimize ederiz ya da akıllı derleyiciler tree-loop-vectorizing denen bu işlemi bizim için yapar.

EDIT: Wiki'de de konvolüsyon güzel anlatılmış. Linki bulunsun:
https://en.wikipedia.org/wiki/Convolution (https://en.wikipedia.org/wiki/Convolution)
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: z - 22 Ekim 2015, 00:14:23
7 dereceden filitrenin katsayıları şunlarmı?

w0=1000 olsun.

h(t) = 2*sin(1000 * t) / t den

h(0)=2
h(1)=2sin(pi/3000)/3
h(2)=2sin(pi/3000)/2
h(3)=2sin(pi/3000)/1
diğer 3'ü de - işaretlileri.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: fatih6761 - 22 Ekim 2015, 00:55:14
Alıntı yapılan: z - 22 Ekim 2015, 00:14:23
7 dereceden filitrenin katsayıları şunlarmı?

w0=1000 olsun.

h(t) = 2*sin(1000 * t) / t den

h(0)=2
h(1)=2sin(pi/3000)/3
h(2)=2sin(pi/3000)/2
h(3)=2sin(pi/3000)/1
diğer 3'ü de - işaretlileri.

Direkt olarak değil hocam iki fark var:
Birincisi ifade tam olarak şu şekilde :
  h(t) = 2 * sinc(w0 * t) = 2 * ( sin (w0 * t) ) / t

Diğeri de frekans olarak normalized frequency kullanmamız gerekiyor. Yani w = 2*pi*f derken
f_norm = f_reel / f_sampling şeklinde. Yani sampling rate'e oranı şeklinde.
Sonra oradan w yı hesaplıyoruz.

Ekstra not olarak hocam hedeflenen gain'lere göre de katsayılar değişecektir logaritmik olarak.
Kağıt kalem olmadan kafamdakileri yazdığım için yanlış bi integrasyon bi katsayıyı atlama gibi hatalar olabilir.

He bir de bu arada şimdi farkettim filtrenin order'ı ile uzunluğu aynı şey değil. Yani 7 elemandan bahsediyorsak filter length= 7 oluyor.
Order = length - 1 yani 6.derece oluyor.

Evet kafadan integral almaya çalışınca hata oluyormuş gerçekten :)
w yerine fourier transorm için daha uygun olan 2*pi*f biçiminde ifade ederek integralini aldım: (wolframalpha)
http://www.wolframalpha.com/input/?i=integrate+e%5E%282*pi*i*f*t%29df+from+-f_0+to+f_0 (http://www.wolframalpha.com/input/?i=integrate+e%5E%282*pi*i*f*t%29df+from+-f_0+to+f_0)

(https://dl.pushbulletusercontent.com/wIYXovuvGT5EZtySm5cwmdvuMJnnoR6G/Definite%20integral_1.gif)
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 22 Ekim 2015, 11:06:35
Alıntı yapılan: z - 21 Ekim 2015, 17:02:18
Aliçavuşlu bir gün buluşalım sana kebap ısmarlıyayım.

@z Hocam mesajı arkadaşımın uyarısı ile yeni gördüm. Gecikme için kusura bakmayın. Uygun olduğunuz bir zaman diliminde görüşmek isterim.
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: JOKERAS - 22 Ekim 2015, 11:15:59
Hayırlı işler ağalar.

İyiki matematik biliyorsunuz,ben bilmiyorum ne olcek şimdi?
Yani siz şunumu demek istiyorsunuz?
Matematik bilmiyorsan senin söylediklerini kaale almıyoruz.
Çık dışarı!..Seni gidi kara cahal seniii mi diyorsunuz?
Yaktınız beni,ee ben sizi çıkışta yakalarım elbet:)

Kendimi şu videodaki Şortlu adam gibi hissetim:)
https://www.youtube.com/watch?v=11wmaOWWzNM (https://www.youtube.com/watch?v=11wmaOWWzNM)

Şu filitreleri bir kaç örnek verip tane tane anlatacak babayiğit yokmu?
Sinyal şöyle ise şurasına bakıyoruz,haa bunun burası bu ise bunu temp edip şununla çarpıyoruz,topluyoruz,bölüyoruz,çıkartıyoruz vs.
Bu şu filitredir şu gibi sorunlar için kullanılır falan filan.
Proflar bir kaç örnek C kodu ile anlatsa güzel olmazmı?

Elbet ben bunları bir gün öğrenirim,o zaman size  kendimi öğrenci yerine koyup ne nedir ne değildir anlatırım:)
Vay be,bu kadar gaz verdik yine bir şey çıkmazsa pes yani:)






Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: alicavuslu - 22 Ekim 2015, 11:19:12
Hocam en kısa zamanda bir anlatım hazırlamaya çalışırım. Fakat kodlar Matlab ile olur. Bilginiz olsun :)
Başlık: Ynt: Cordic Algoritması Hakkında
Gönderen: JOKERAS - 22 Ekim 2015, 11:27:52
Alıntı yapılan: alicavuslu - 22 Ekim 2015, 11:19:12
Hocam sizin için en kısa zamanda bir anlatım hazırlamaya çalışırım. Fakat kodlar Matlab ile olur. Bilginiz olsun :)
Valla aliçavuşlu usta çok makbule geçer.Sağolun varolun.
Bu konuyu öğrenmemiz lazım,yoksa led yak söndürden öte gidemeyeceğim:)