C ile FFT kodlama

Başlatan Kaanx, 20 Eylül 2013, 23:51:34

berat23

elindeki verilerden ne yapacaksın ?

Kaanx

#31
bunlarla spektrum analizini yapabilir miyim hocam öyle sorayım, güc analizii frekans analizi ve ya desibel analizi mesela andoid telefonunuz vrsa buradaki uygulamaya bakabilirsiniz hocam https://play.google.com/store/apps/details?id=com.digiphd.prospeclite&hl=tr böyle bişi kafamdaki adım adım ilerlemeyi beceremediğimden takılıyorum farkındayım :)

berat23

oradaki uygulama gördüğüm kadarıyla bildiğin fft almış, aslında basit birşey. hocam önce de söylemiştim, matlab tam bu işler için var. madem dsp aldınız, o zaman dft görmüşsünüzdür. veya görmediysenizde zor değil eğer sinyal sistem bilginiz varsa. ilk etapta matlab ile dft lana kod yazın. c ile kendiniz yazmaya, işlemciye gömmeye birde real time yapmaya kalkarsanız çok uğraşır, bence pek birşeyde öğrenemzsiniz. dft aldıktan sonra girdi ve çıktıları inceleyin, mesela birkaç harmonikli sinüs oluşturun, ft'sini alın düşündüğünüz gibi mi çıktı? veya analog gibi bir sinyal oluşturun, sonra örnekleyin örnekleme etkisini görün. matlab çok kolayca bunları yapmanızı sağlar. sonra fft algoritmasına bakarsınız, basit bir implementasyonunu da yapın. bunları anlayıp özümserseniz işe yarar, yoksa amacınız şekilli birşeyler yapmaksa hazır kod arayın, hatta arduino falan kesin vardır, böyle kendinizi tatmin edersiniz. gerçekten öğrnmek istiyorsanız ilk dediklerimi yapın.

eğer dsp dersi almadıysanız şimdiden kasmayın ki ders alırken konsantrasyonunuz bozumasın, bu anlattıklarımı o zaman yaparsınız. kolay gelsin.

Kaanx

Alıntı yapılan: berat23 - 23 Eylül 2013, 21:00:15
oradaki uygulama gördüğüm kadarıyla bildiğin fft almış, aslında basit birşey. hocam önce de söylemiştim, matlab tam bu işler için var. madem dsp aldınız, o zaman dft görmüşsünüzdür. veya görmediysenizde zor değil eğer sinyal sistem bilginiz varsa. ilk etapta matlab ile dft lana kod yazın. c ile kendiniz yazmaya, işlemciye gömmeye birde real time yapmaya kalkarsanız çok uğraşır, bence pek birşeyde öğrenemzsiniz. dft aldıktan sonra girdi ve çıktıları inceleyin, mesela birkaç harmonikli sinüs oluşturun, ft'sini alın düşündüğünüz gibi mi çıktı? veya analog gibi bir sinyal oluşturun, sonra örnekleyin örnekleme etkisini görün. matlab çok kolayca bunları yapmanızı sağlar. sonra fft algoritmasına bakarsınız, basit bir implementasyonunu da yapın. bunları anlayıp özümserseniz işe yarar, yoksa amacınız şekilli birşeyler yapmaksa hazır kod arayın, hatta arduino falan kesin vardır, böyle kendinizi tatmin edersiniz. gerçekten öğrnmek istiyorsanız ilk dediklerimi yapın.

eğer dsp dersi almadıysanız şimdiden kasmayın ki ders alırken konsantrasyonunuz bozumasın, bu anlattıklarımı o zaman yaparsınız. kolay gelsin.

Hocam tavsiyeleriniz için çok teşekkür ederim DSP dersi aldım ama okulda dersler ciddiyetli değildi courseradan alıyorum şimdi tekrar. amç kendimi tatmin etmek değil hocam gerçekten ögrenmek istiyorum. dediklerinizi yapıcam o zaman artık buradan matlabla devam edicez sanırım :)

OptimusPrime

Kaanx
ayrıca aldığın örnekleri pencereleme fonksiyonuna da tabi tutmalısın doğrudan ft alamazsın...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

RaMu

#35
Bende ft fft dft  vs. bitirdikten sonra paylaşmak için konu açmayı düşünüyordum,
madem konu açılmış ben şu anda bu işle ilgileniyorum,
belli bir aşamayada geldi,
yaptıklarımı paylaşmaya çalışayım ki
benim amacımda kendi dft fonksiyonumu yazmak, bu işi anlamak öğrenmek,
amacımız aynı olduğundan destek olabiliriz,
hem takıldığımız noktada sağolsun forumdaşlar yardımcı oluyorlar,
benimde takıldığım biryer var şu anda,
şunu baştan belirteyim aslında ahım şahım birşey istemiyorsak dft radix2 yöntemiyle anlaşılabilir ve uygulanabilir birşey,
şimdi ben neler yapmışım toparlamaya çalışayım,
biraz dağınık olabilir şimdiden kusura bakmayın:


Biraz tersden başlayacağım,
en basit haliyle hemen 1 Hz lik bir kare dalgayı fourier dönüşümüne tabi tutalım,
bu yöntem 8 örnekli radix2 algoritması ile DFT (discrete fourier transform)
daha sonra bu işlemlerin neden bu adımlarla yapıldığına bakarız;



Evet ilk foto fft işlemi aslında bu kadar, aşama3 bize fft sonuçlarını veriyor,
görüldüğü gibi sadece 1 Hz de sinyal var.

Bunlarda aşamalardaki misal x0+x4 neden bunlar toplanıyor,
hangisi hangisiyle ne zaman nasıl toplanacak nereden bulunuyor kısmı,
burada 16 örnek alma durumu var;


Buda 8 örnek alınsa işlem nasıl yapılıyora örnek,
tabiki işlem aynı;



Buda benim toparladıklarım (53 mb)
https://www.dropbox.com/s/7wymlmc4gw0l6r9/FFT%20EMBEDDED.rar
(dropboxda yer kalmazsa kaldırabilirim,
hepsi netten toparlanmış şeyler zaten herkes bulabilir,
ayrıca picprojedeki daha önce fft nin bahsedildiği bazı konularıda html veya mht olarak kopyalamıştım
onlarda dosyada mevcut )

eklediğim dosyada netten bulduğum kaynaklar mevcut,
kendi çalışmalarım var denemelerim daha doğrusu,
içlerinden pratik uygulamaya yönelik kullandığım  "itü den dft_ifft" diye adlandırdığım pdf.


Buda  devc++ da ilk deneme programım,
eklediğim dosyada den fft c++ olarak geçiyor, örnek4 olarak devc++ halide mevcut;

//den fft c++

#include<stdio.h>
#include<stdlib.h>
int main( void )
{
	int x0,x1,x2,x3,x4,x5,x6,x7; 
int x0a,x1a,x2a,x3a,x4a,x5a,x6a,x7a;

int w0=1,w1=1,w2=0,w3=1,w4=-1,w5=1,w6=1,w7=1;

    printf("8 noktali fft programı %\n"); 

	printf("x0 giriniz  ");
	scanf("%d",&x0);
	printf("x1 giriniz  ");
	scanf("%d",&x1);
    	printf("x2 giriniz  ");
	scanf("%d",&x2);
    	printf("x3 giriniz  ");
	scanf("%d",&x3);
    	printf("x4 giriniz  ");
	scanf("%d",&x4);
    	printf("x5 giriniz  ");
	scanf("%df",&x5);
    	printf("x6 giriniz  ");
	scanf("%d",&x6);
    	printf("x7 giriniz  ");
	scanf("%d",&x7);	

//aşama 1	
x0a=x0+x4;	
x1a=x1+x5;
x2a=x2+x6;
x3a=x3+x7;

x4a=(x0-x4)*w0;
x5a=(x1-x5)*w1;
x6a=(x2-x6)*w2;
x7a=(x3-x7)*w3;

//aşama2
	
//x0b ler hesaplanıyor fakat değişken kullanmamamk için x0 lar kullanılacak

x0=x0a+x2a;
x1=x1a+x3a;
x4=x4a+x6a;
x5=x5a+x7a;	
	
x2=(x0a-x2a)*w0;
x3=(x1a-x3a)*w1;
x6=(x4a-x6a)*w0;
x7=(x5a-x7a)*w1;

//aşama 3
//yeni değişken kullanmamak için sonuçlar için x0a lar kullanılacak

x0a=x0+x1;
x4a=x0-x1;
x2a=x2+x3;
x6a=x2-x3;

x1a=x4+x5;
x5a=x4-x5;
x3a=x6+x7;
x7a=x6-x7;

    printf("fft sonuclari x0 dan x7 ye %\n");      
    printf("%d %d %d %d %d %d %d %d ",x0a,x1a,x2a,x3a,x4a,x5a,x6a,x7a);
    system("pause");
    return 0;
}



Kodda pek iş yok tamam ama örnek işte idare edin artık :)

Şimdi kısaca özetlersek,
fourier transformu ne işe yarıyor zaten biliyor olmamız lazım,
neye kullanıldığı hakkında hiçbirşey söylemeye gerek yok,
herşeye kullanılabilir, görüntü-ses (sinyal) işleme tanıma diyelim örnek olsun.
benim kullandığım yöntemde işler şöyle,
bu tek boyutlu bir sinyal işliyor,
yöntem 8-16-32-....-512.... gibi 2 nin katları sayıda
örnek alınmış bir sinyali işlemek için kullanılıyor,
sinyali bildiğimiz adc ile örnekliyoruz,
örnekleme frekansimız nyquist amcanın dediği gibi en az 2fs
yani ben baktığım sinyal içinde eğer misal en az 1 Hz frekansında bileşen varmı diye bakmak istiyorsam
sinyali en az 2 Hz ile örneklemek zorundayım,
örnek sayısı bana kalmış ama örnek sayısı arttıkça sonucun doğruluğu artar,
bunların detayları verdiğim kaynaklarda mevcut,
ben misal 8 tane örnek alıyorsam,
bu örnekleri 3 aşamaya tabi tutmak zorundayım niye
çünkü 2 üzeri 3 = 8 demi,
bu nereden geliyor,
8 örneği alıp iki tane 4 erli örnekmiş gibi düşünüyorum,
sonra bu 4erlileride bir aşamadan daha geçirip 2li örnekleröiş gibi düşünüyorum,
birinci aşamada 2li fft uyguluyorum ve elimde 4 tane 2li fft oluyor,
sonra bunları yine kendi aralarında 2 li fft ye tabi tutuyorum, elimde 2 tane 4lü ft oluyor,
son yani 3. aşamada bu iki tane 4lü fft yi birleştiriyorum ve hop başta istediğim 8 li fft hazır oluyor.

Bakalım zamanla dahada fazla paylaşmaya çalışırım,
bunu program haline getiririz umarım,
şimdi daha hiç bahsetmediğim bu işin formülü nereden geldiği nereye gittiği kısımları var,
örneklerde kullanılan twiddle faktörleri hesaplaması var,
hangi denetleyiciyi kullnamak lazımı var,
işlem yükü nediri var bakalım zamanla buluruz çaresini diye düşünüyorum,
bu sıralar fft ile uğraşımada hafifden ara verdim zaten.

RaMu
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Kaanx

#36
Alıntı yapılan: OptimusPrime - 24 Eylül 2013, 16:09:25
Kaanx
ayrıca aldığın örnekleri pencereleme fonksiyonuna da tabi tutmalısın doğrudan ft alamazsın...

Pencereleme fonksiyonu nedir hocam özür dilerim anlayamadım

mesaj birleştirme:: 25 Eylül 2013, 03:39:18

Alıntı yapılan: RaMu - 24 Eylül 2013, 18:06:07
Bende ft fft dft  vs. bitirdikten sonra paylaşmak için konu açmayı düşünüyordum,
madem konu açılmış ben şu anda bu işle ilgileniyorum,
belli bir aşamayada geldi,
yaptıklarımı paylaşmaya çalışayım ki
benim amacımda kendi dft fonksiyonumu yazmak, bu işi anlamak öğrenmek,
amacımız aynı olduğundan destek olabiliriz,
hem takıldığımız noktada sağolsun forumdaşlar yardımcı oluyorlar,
benimde takıldığım biryer var şu anda,
şunu baştan belirteyim aslında ahım şahım birşey istemiyorsak dft radix2 yöntemiyle anlaşılabilir ve uygulanabilir birşey,
şimdi ben neler yapmışım toparlamaya çalışayım,
biraz dağınık olabilir şimdiden kusura bakmayın:


Biraz tersden başlayacağım,
en basit haliyle hemen 1 Hz lik bir kare dalgayı fourier dönüşümüne tabi tutalım,
bu yöntem 8 örnekli radix2 algoritması ile DFT (discrete fourier transform)
daha sonra bu işlemlerin neden bu adımlarla yapıldığına bakarız;

(Resim gizlendi görmek için tıklayın.)

Evet ilk foto fft işlemi aslında bu kadar, aşama3 bize fft sonuçlarını veriyor,
görüldüğü gibi sadece 1 Hz de sinyal var.

Bunlarda aşamalardaki misal x0+x4 neden bunlar toplanıyor,
hangisi hangisiyle ne zaman nasıl toplanacak nereden bulunuyor kısmı,
burada 16 örnek alma durumu var;
(Resim gizlendi görmek için tıklayın.)

Buda 8 örnek alınsa işlem nasıl yapılıyora örnek,
tabiki işlem aynı;
(Resim gizlendi görmek için tıklayın.)


Buda benim toparladıklarım (53 mb)
https://www.dropbox.com/s/7wymlmc4gw0l6r9/FFT%20EMBEDDED.rar
(dropboxda yer kalmazsa kaldırabilirim,
hepsi netten toparlanmış şeyler zaten herkes bulabilir,
ayrıca picprojedeki daha önce fft nin bahsedildiği bazı konularıda html veya mht olarak kopyalamıştım
onlarda dosyada mevcut )

eklediğim dosyada netten bulduğum kaynaklar mevcut,
kendi çalışmalarım var denemelerim daha doğrusu,
içlerinden pratik uygulamaya yönelik kullandığım  "itü den dft_ifft" diye adlandırdığım pdf.


Buda  devc++ da ilk deneme programım,
eklediğim dosyada den fft c++ olarak geçiyor, örnek4 olarak devc++ halide mevcut;

//den fft c++

#include<stdio.h>
#include<stdlib.h>
int main( void )
{
	int x0,x1,x2,x3,x4,x5,x6,x7; 
int x0a,x1a,x2a,x3a,x4a,x5a,x6a,x7a;

int w0=1,w1=1,w2=0,w3=1,w4=-1,w5=1,w6=1,w7=1;

    printf("8 noktali fft programı %\n"); 

	printf("x0 giriniz  ");
	scanf("%d",&x0);
	printf("x1 giriniz  ");
	scanf("%d",&x1);
    	printf("x2 giriniz  ");
	scanf("%d",&x2);
    	printf("x3 giriniz  ");
	scanf("%d",&x3);
    	printf("x4 giriniz  ");
	scanf("%d",&x4);
    	printf("x5 giriniz  ");
	scanf("%df",&x5);
    	printf("x6 giriniz  ");
	scanf("%d",&x6);
    	printf("x7 giriniz  ");
	scanf("%d",&x7);	

//aşama 1	
x0a=x0+x4;	
x1a=x1+x5;
x2a=x2+x6;
x3a=x3+x7;

x4a=(x0-x4)*w0;
x5a=(x1-x5)*w1;
x6a=(x2-x6)*w2;
x7a=(x3-x7)*w3;

//aşama2
	
//x0b ler hesaplanıyor fakat değişken kullanmamamk için x0 lar kullanılacak

x0=x0a+x2a;
x1=x1a+x3a;
x4=x4a+x6a;
x5=x5a+x7a;	
	
x2=(x0a-x2a)*w0;
x3=(x1a-x3a)*w1;
x6=(x4a-x6a)*w0;
x7=(x5a-x7a)*w1;

//aşama 3
//yeni değişken kullanmamak için sonuçlar için x0a lar kullanılacak

x0a=x0+x1;
x4a=x0-x1;
x2a=x2+x3;
x6a=x2-x3;

x1a=x4+x5;
x5a=x4-x5;
x3a=x6+x7;
x7a=x6-x7;

    printf("fft sonuclari x0 dan x7 ye %\n");      
    printf("%d %d %d %d %d %d %d %d ",x0a,x1a,x2a,x3a,x4a,x5a,x6a,x7a);
    system("pause");
    return 0;
}



Kodda pek iş yok tamam ama örnek işte idare edin artık :)

Şimdi kısaca özetlersek,
fourier transformu ne işe yarıyor zaten biliyor olmamız lazım,
neye kullanıldığı hakkında hiçbirşey söylemeye gerek yok,
herşeye kullanılabilir, görüntü-ses (sinyal) işleme tanıma diyelim örnek olsun.
benim kullandığım yöntemde işler şöyle,
bu tek boyutlu bir sinyal işliyor,
yöntem 8-16-32-....-512.... gibi 2 nin katları sayıda
örnek alınmış bir sinyali işlemek için kullanılıyor,
sinyali bildiğimiz adc ile örnekliyoruz,
örnekleme frekansimız nyquist amcanın dediği gibi en az 2fs
yani ben baktığım sinyal içinde eğer misal en az 1 Hz frekansında bileşen varmı diye bakmak istiyorsam
sinyali en az 2 Hz ile örneklemek zorundayım,
örnek sayısı bana kalmış ama örnek sayısı arttıkça sonucun doğruluğu artar,
bunların detayları verdiğim kaynaklarda mevcut,
ben misal 8 tane örnek alıyorsam,
bu örnekleri 3 aşamaya tabi tutmak zorundayım niye
çünkü 2 üzeri 3 = 8 demi,
bu nereden geliyor,
8 örneği alıp iki tane 4 erli örnekmiş gibi düşünüyorum,
sonra bu 4erlileride bir aşamadan daha geçirip 2li örnekleröiş gibi düşünüyorum,
birinci aşamada 2li fft uyguluyorum ve elimde 4 tane 2li fft oluyor,
sonra bunları yine kendi aralarında 2 li fft ye tabi tutuyorum, elimde 2 tane 4lü ft oluyor,
son yani 3. aşamada bu iki tane 4lü fft yi birleştiriyorum ve hop başta istediğim 8 li fft hazır oluyor.

Bakalım zamanla dahada fazla paylaşmaya çalışırım,
bunu program haline getiririz umarım,
şimdi daha hiç bahsetmediğim bu işin formülü nereden geldiği nereye gittiği kısımları var,
örneklerde kullanılan twiddle faktörleri hesaplaması var,
hangi denetleyiciyi kullnamak lazımı var,
işlem yükü nediri var bakalım zamanla buluruz çaresini diye düşünüyorum,
bu sıralar fft ile uğraşımada hafifden ara verdim zaten.

RaMu

Hocam  öncelikle ben anlatımınız için cok tesekkur ederim. Ben bu zaman kadar DFT ve ya FFT görmedim kendi çalısmalarımla biliyorum ve FFT içerisineki algoritmaları tanımıyorum sanırım radix2 bunlardan birisi bu algoritmalardan seçerken neye göre seçmeliyim ?

berat23

hocam o c kodu radix2 fft8 alıyor. bence şimdilik buna gerek yok. çok tekrar ettim ama ısrarla matlab diyorum. c, bu tip işlerde sizi konudan uzaklaştırır, matlab kodlama işini kolaylaştırdığı için daha uygun. gerçekten dsp öğrenmek isterseniz temelden gidin, uygulamadan değil. mesela windowing nedir,nasıl yapılır değil, neye yarar ona bakın. uygulaması zor değil, zaten N uzunlukta veriyi bufferlayıp fft alsanız rectangle window olur. ama önemli olan neye yaradığını anlamak. hazır kütüphanelerle vs.uygulamak sadece fft() gibi bir komuta bakıyor. mesela window functionlarının frekans spektrumu size ne anlatıyor, neye yarıyor burdan anlayabilirsiniz, bence biraz bakın.

bu radix2 algoritması aslında ft'nin simetri ve periyodiklik gibi özelliklerini kullanan, bir tür civide and conquer algoritması. radix2 kabaca şöyle, 0 dan 7 ye kadar(8 uzunluk için) gelen verileri indizlerine göre tek ve çifler olarak ayırın. yani;
x0
x2
x4
x6

x1
x3
x5
x7

sonra
x0
x4

x2
x6

x1
x5

x3
x7

yani en sonda 2 veri kalacak şekilde dağıtıyoruz(radix2, bkz:radix4). sonrasında dönüşümün özelliklerini kullanarak her ikilinin dönüşümünü ala ala ilerliyoruz başa doğru. x0 ile x4 ün dönüşüme alımasının sebebi bu.

http://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm

OptimusPrime

Kaanx
windowing veya window function olarak geçiyor. araştırırken hanning, hamming rectengular gibi şeyler görürsen doğru yoldasın demektir.

arkadaşın dediği gibi kod yazmak için öğrenmeye çalışma. bir matlab edin kim ne işe yarıyor ne sonuç veriyor tecrübe et. ft nedir dft nedir fft nedir bunlara hakim olduktan sonra matlab de c gibi yine kendi kodunu yazabilirsin ayrıca matlabın hazır fonksiyonları ile karşılaştırarak yazdığın kodun doğruluğunu da test edebilirsin.

birkaç kitap tavsiyesi:

Digital Signal Processing Everything you need to know to get started
Michael Parker
bu kitap mümkün olduğu kadar işin matematiğine inmeden olayın mantığını anlatmaya çalışıyor. tamda senin aradığın diye düşünüyorum. sorduğun soruların cevapları bu kitapta var.

DSP Applications Using C and the TMS320C6x DSK
Rulph Chassaing
bu kitap ise matematiksel olarak olayı anlatıp (çok basit bir dilde) örnek sayısal uygulamalar ve örnek c kodları veriyor.

kitapların hepsini baştan sona okumana gerek yok. kitaplardaki bir çok konu birbiri ile ilişkili dolayısıyla okuduğun yerde anlamadığın bir konuyu mutlaka önceki başlıklardan birinde bulabilirsin...




https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

RaMu

Arkadaşlarda bende link-linkler paylaşıyoruz,
sorularının cevabı aslında bu linklerde mevcut,
hangi algoritmayı kullanacağın ihtiyaçlara ve donanımına bağlı temel olarak,
misal matlab 3-4 farklı algoritmayı kullanıp sonucu hepsine göre veriyormuş diye okumuştum,
yani sen bu işi 16 bitlik, gömülü donanımsal çarpma donanımı bulunan(misal 8*8 hardware multiplier),
10 mibs lik bir mikrodenetleyici üzerinde gerçekleştireceksen ayrı,
yok ben pc üzerinde programı işletecem diyorsan ayrı bir algoritmayı kullanırsın,
bu algoritmaların birbirine göre avantaj dezavantajları platforma göre değişir doğal olarak.

FFT DFT bende görmemiştim,
herşeyi birilerinin anlatması gerekmiyor,
bir mühendis olarak bence en önemli işimiz kendimizi geliştirebilmek eğitebilmek,
kendi kendimize öğrenebilmek,
bende sadece fourier transform  u gördüm hatta nasıl birşey diye uzun zaman anlamadım ezberledim geçtim,
şimdi görüyorumki herişde kullanabileceğim birşey,
bu yüzden iyice anlamaya çalışıyorum.

Arkadaşlarada katılıyorum ama
ben hazır kütüphaneleri kullanarak md. üzerinde program yazamadım
ben birşeyin temelini bilmezsem zorlanıyorum bazen böyle
bu yüzden fonksiyonların naasıl çalıştıklarını ne yaptıklarını tam anlamak için
kendim fonksiyonları yazmak istedim ve yazıyorum ufaktan.

Biri çıksa al şuraya giriş değişkenlerini ver,
şuralardan kaçlı fft dft yapacaksın değiştiriyorsun seçiyorsun,
şununla windowing aç kapa yapaniliyorsun,
şu denetleyicilerle çalışabilirsin desin
bende elimle sağlam örnekle çalışayım isterim ama
ft konusunda ben tam aradığım gibi bir örnek bulamadım,
yani 2*16 lcd yi sürmeyi anlatır gibi kimse anlatamamış bu işi
bende biraz çalışayım bu şekilde bir anlatımı kendim çıkarırım diye düşündüm birazda ondan uğraşıyorum aslında,
picprojedede defaten açılmış ama tam olarak anlatılamamış bir konu olmasıda bunda etkili oldu biraz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

OptimusPrime

RaMu
peki kendi yazdığın fonksiyonların doğru olup olmadığını neyle kıyaslayıp anlıyorsun???
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

RaMu

Tabiki daha önce yazılmış olanlarla, doğruluğunu kontrol edeiyorum,
ki ben daha fonksiyon yazabilmiş değilim,
yani yanlış anlaşılma varsa düzeltelim
ben söylenenlere katılıyorum dedim zaten,
halihazırda mevcut olanları bir kenara bırakalım kendimiz sıfırdan yapalım durumu sözkonusu değil,
zaten bende anlatılan kaynaklardan öğrendiklerimi uygulamaya dökmeye çalışıyorum,
şimdilik isis simulasyondaki fourier transform özelliğini kullanarak deneme yaptım,
birde bir java uygulama bulmuştum biraz onunla denedim ama o hoşuma gitmedi,
dilim varmıyor söylemeye pc de matlab yüklü değil,
matlabla uğraşmayalıda 5 sene olmuş biran önce matlab ile tekrar buluşmam gerek :)

Şuana kadarki çalışmalarımı dropbox linki olarak paylaşmıştım,
linkde dspic için düzenlemeye çalıştığım ccs c nin ex_fft örneği >denemeler >dspic ccs c d klasöründe
proteus8 simulasyonuyla beraber var,
misal burada aldığım bir hata var nedenini tam çözebilmiş değilim,
anladığım kadarıyla kullandığım denetleyicinin memory si ile ilgili bir durum,
ya alınan değişkenleri bitwise yapıp dft öncesi sıralamasını ayarlarken
yada çarpma işlemi yaparken değişkenleri yazmada memory sıkıntısı yaşanıyor,
tabi gerçekten sıkıntı olup olmadığınıda bilmiyorum,
çünkü hatayı isis veriyor elimde sadece dspic30f2010 olduğu için gerçekte deneme yapmadım,
proteus üzerinde dDSPIC 33FJ 32MC 202 ile deniyorum




Buda deneyip üzerinde oynadığım kod;

//#include <main.h>
//#opt compress
/*
void main()
{

      output_high(pin_a0);
      output_low(pin_a1); 

   //Example blinking LED program
   while(true)
   {
      output_toggle(pin_a0);
      output_toggle(pin_a1);      
      delay_ms(500);
      output_toggle(pin_a0);
      output_toggle(pin_a1); 
      delay_ms(500);
      
              
   }

}
*/








//#opt compress
/////////////////////////////////////////////////////////////////////////
////                             EX_FFT.C                            ////
////                                                                 ////
////  Perform an FFT on a set of samples, and displays the results.  ////
////                                                                 ////
////  This example will work only with the PCD Compiler.             ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2009 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////

// optional
// generally this isn't needed when dealing with only one sinewave.
//#define __DO_WINDOW__

#if !defined(__PCD__)
   #error This example works only for PCD. Please select the PCD Compiler
#endif

#if 0
   //ccs dsp audio development kit rev 1
//   #include <33FJ32MC202.h>
   #include <30f3010.h>
   #use delay(crystal=20M, clock=20M)

   #use rs232(UART2, baud=9600, errors)
#endif

#if 1
   //ccs dsp audio development kit rev 2
   #include <33FJ32MC202.h>
      //#include <30f3010.h>
   #use delay(crystal=20MHz, clock=20MHz)
//dspic33fj32mc202
   #pin_select U1TX = PIN_b0
   #pin_select U1RX = PIN_b1
  
   
   #use rs232(UART1, baud=9600, errors)
#endif

// bin/slot size result of FFT is SampeRate/FFT_LENGTH.
// must be power of 2.
#define FFT_LENGTH 32

// sine windowing algorithms
#if defined(__DO_WINDOW__)
   #include <dsp_data_util.c>
   #include <sine_window.h>
#endif

// primary FFT algorithms
#include <fft.h>

//e
#fuses nowdt
//e


// populate samples[] for example.
// basically creates a sinewave (cos) of freqency 'f' with amplitude of 'amp'.
// 'dc' is the dc offset of the frequency.
// when you perform fft of this sample set, bin 'f' should be 'amp'/2 and
// bin 'f'+FFT_LEN/2 should also be 'amp'/2.
// DC bin (bin 0) should be 'dc'.
void populate_samples_for_example(unsigned int f, int amp, int dc, Complex *p)
{
   int i;
   float rad;

   printf("\r\nCreating f=%u, amplitude=%d and dc=%d", f, amp, dc);
   
   printf("\r\nSamples in:\r\n");

   for(i=0; i<FFT_LENGTH; i++)
   {
      rad = 2.0*PI*(float)i*(float)f/(float)FFT_LENGTH;
      p->re = (fft_int_t)(cos(rad) * (fft_int_t)amp);
      p->re += dc;
      printf("%ld ", p->re);
      p->im = 0;
      p++;
   }

   printf("\r\n");
}

void main(void)
{
   int i;
   #bankx   //if you want to use the Windowing library, then samples[] must be in BankX
   Complex samples[FFT_LENGTH];
   Complex * fft_result, *p;

   printf("\r\n\nCCS ex_fft.c example\r\n");

   populate_samples_for_example(2, 100, 100, samples);

   fft_init(FFT_LENGTH);
 
 /* 
  #if defined(__DO_WINDOW__)
   windowwc(sine_window, samples, samples, FFT_LENGTH);
  #endif
*/
   fft_result = fft(samples, FFT_LENGTH);

   printf("\r\nFFT Result:\r\n");
 //ek1 b 
   printf("\r\n neden\r\n");
 //ek1 s 
   p = fft_result;
   for(i=0; i<FFT_LENGTH; i++)
   {
      printf("%u: %u (%d, %d)\r\n", i, cplx_magnitude(p), p->re, p->im);
      p++;
   }

   while(1);
 //ek1 b 
   printf("\r\n ne rede\r\n");
 //ek1 s 
}


proteus simulasyonuyla beraber proje dosyaları;
https://www.dropbox.com/s/tpzmqbvsiqks14p/dspic%20ccs%20d.rar

Şimdi ccs c nin fft fonksiyonunu nelere dikkat ederek çalıştırabilirim bilen varsa söylesin,
ccs c nin örneğini EX_FFT.c olarak geçiyor, proteusda bulunan dspic lerle çalıştırabilir miyiz?

Bu arada mikroc pro for dspic /pic /pic32 /arm veya mplabx yine herhangibiri için veya ccs c hiçfarketmez
herhangibirinde m.d. için kendi çalıştırdığınız bir örneği anlatsanızda olur,
hepsinde denemelere yapıyorum şu anda,
ama önceliğim isisde deneyebileceğim ve pic ile olan bir örnek şuanda.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

jabbathehutt

FFT'yi incelerken aklıma bir soru takıldı. Twiddle faktöründe euler katsayısını kullanırken ortaya reel ve imajiner kısımlar çıkıyor. Biz bu imajiner kısımları nasıl hesaplayacağız?
Mesela  "cos (x)+i sin(x)" değerinin aldığımız örneklerle çarpılması gerektiğinde bu işlemi nasıl gerçekleştireceğiz? Radix  diyagramının sonunda ortaya çıkacak olan imajiner kısım bir değişken içerisine nasıl aktarlıacak?

jabbathehutt

FFT'yi incelerken aklıma bir soru takıldı. Twiddle faktöründe euler katsayısını kullanırken ortaya reel ve imajiner kısımlar çıkıyor. Biz bu imajiner kısımları nasıl hesaplayacağız?
Mesela  "cos (x)+i sin(x)" değerinin aldığımız örneklerle çarpılması gerektiğinde bu işlemi nasıl gerçekleştireceğiz? Radix diyagramının sonunda ortaya çıkacak olan imajiner kısım bir değişken içerisine nasıl aktarlıacak?

jabbathehutt

İmajiner kısımları dikkate almasak ne olur?