Picproje Elektronik Sitesi

DİJİTAL & ANALOG ELEKTRONİK => Ses Frekansı => Konuyu başlatan: Kaanx - 20 Eylül 2013, 23:51:34

Başlık: C ile FFT kodlama
Gönderen: Kaanx - 20 Eylül 2013, 23:51:34
Merhabalar GNU üzerinde ve ya herhangi bir C compiler üzerinde Fast Fourier transform kodlayan var mı ? hazır olarak mevcut fakat mantıgını iyice kavramak için adım adım ilerleyip bizler türkçe olarak yazabilir miyiz ?
Başlık: Ynt: C ile FFT kodlama
Gönderen: fatih6761 - 20 Eylül 2013, 23:58:10
Hocam FFT'den kastınız Radix-2 FFT ise şurada DFT'den FFT'ye kadar açıklamalı anlatan bir sayfa mevcut ancak ingilizce:
http://en.literateprograms.org/Cooley-Tukey_FFT_algorithm_%28C%29 (http://en.literateprograms.org/Cooley-Tukey_FFT_algorithm_%28C%29)
Not : Algoritma fixed-point değil double türü içindir. Son koddaki rekürsif yaklaşımı while döngüsüyle iterative çevirebilirsiniz.
Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 21 Eylül 2013, 00:25:40
Teşekkürler umarım işime yarıcak bunlar sanırım ben bunu kendim yazamıcam :)
Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 21 Eylül 2013, 14:06:04
 Real time olarak FFT spectrum analyzer hakkında bilgisi olan var mı ? Elimde Stm32f4 discovery , Tİ stellaris lmf120hq , Tİ msp430 var şuan kullanabileceğim
Başlık: Ynt: C ile FFT kodlama
Gönderen: kantirici - 21 Eylül 2013, 14:51:52
Bir ses sinyali için girişi adc ile fft örnekleme sayısı kadar örnekleyip (nyquist frekansına göre) gerekli matematiksel işlemleri yapıp sonucu çıkışta gösterdikten sonra tekrar örnek alıp bunu sürekli yapacak bir algoritma ile yapılır. 
İşin teorik kısmı böyle, bende pratik uygulama yapmadım.
Başlık: Ynt: C ile FFT kodlama
Gönderen: fatih6761 - 21 Eylül 2013, 15:23:23
Real time spectrum için STFT (short time fourier transform) daha kullanışlı olur. STFT aslında normal FFT'nin circular buffer tarzında olanı. Her seferinde 16-sample (veya daha fazla/az) overlap yapılarak önceki sinyal de spektruma katılmış oluyor.
Başlık: Ynt: C ile FFT kodlama
Gönderen: Icarus - 21 Eylül 2013, 15:29:25
Alıntı yapılan: Kaanx - 21 Eylül 2013, 14:06:04
Real time olarak FFT spectrum analyzer hakkında bilgisi olan var mı ? Elimde Stm32f4 discovery , Tİ stellaris lmf120hq , Tİ msp430 var şuan kullanabileceğim
Real time olarak olmaz. (Yada çok düşük frekanslar için olur ki, bu da olmaz ile aynı şey)
Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 21 Eylül 2013, 16:14:26
Söyle bir kaç örnekle karsılaşmıstım ben buradada FFT tekniği kullanılmıyor mu ?

audio analyzer stm32f4 (http://www.youtube.com/watch?v=3bVExpNmpuo#)

Başlık: Ynt: C ile FFT kodlama
Gönderen: Icarus - 21 Eylül 2013, 16:24:59
Real time değil, olay şu: Max band genişliğinden en az 10 kat hızlı ve sabit gecikme(delay) ile yapabiliyorsan real time'dır. Değilse değildir...

mesaj birleştirme:: 21 Eylül 2013, 16:37:07

Örneğin FFT özelliği olan osiloskopların gösterdiği bilgi, real time değildir. LCD güncellenme zamanına, total aqusation time, vb..... bağlıdır. Her sinyaldeki glitch FFT'de çıkmaz
Başlık: Ynt: C ile FFT kodlama
Gönderen: berat23 - 21 Eylül 2013, 17:51:29
@Icarus

ne dediğinizi anlamadım, daha doğrusu siz herşeyi birbirine katmışsınız.

mesela ;
Alıntı YapReal time olarak olmaz. (Yada çok düşük frekanslar için olur ki, bu da olmaz ile aynı şey)

demişsiniz. real time demek aynı anda olması demek değil. aslında bunun farkında gibisiniz fakat sonra şunu yazmışsınız;

Alıntı YapReal time değil, olay şu: Max band genişliğinden en az 10 kat hızlı ve sabit gecikme(delay) ile yapabiliyorsan real time'dır. Değilse değildir...
Örneğin FFT özelliği olan osiloskopların gösterdiği bilgi, real time değildir. LCD güncellenme zamanına, total aqusation time, vb..... bağlıdır. Her sinyaldeki glitch FFT'de çıkmaz

nereden başlasam bilemedim. real time fft demek şudur, diyelim 8 uzunluklu alacaksınız, 8 veri gelme süresinde fft'yi hesaplayıp sonucu ekrana göndermek demektir, öyle 10 katı falan değil. kısaca yeni veri gelene kadar eskisini hesaplamak demektir. pekala orada sayılan işlemciler bu işi yapabilir, nasıl yapıldığı önemli. gidipte msp430 ile 1024 uzunluklu fft alma, 8 al. çözünürlüğün düşer ama real time yapabilirsin pekala. bu işte muhtemelen ekran kısmı en sorunsuzu zira insan 50 hz ile güncellenen bir görüntüyü sabit görür, dolayısıyla 20ms gecikme olabilir. osiloskop örneğide yanlış bu sebepten dolayı, pekala real time çalışırlar osiloskoplar(ekran olarak ).

ayrıca anlamadığın nokta şu, gerçek zamanlı olması için zamanlama ne olmalı? mesela konu gözümüzse 20ms içinde diğer kare gelmelidir, gelmezse real time olmaz. 10us de 1 örnek alan bir sistemde 8 uzunluklu ft alınacaksa ilk hesaplama 80us sonra başlayıp, 80us den kısa zamanda biter ve bu süreç her 8er veri için devam ederse real time olur. bu saydığım gecikmeyi çok görüyorsanız siz toptan tüm dsp'yi çöpe atmışsınız gibi birşey oluyor, o zaman ne real time filtre olur ne diğer tüm dsp işleri.
Başlık: Ynt: C ile FFT kodlama
Gönderen: Bayramsumbul - 21 Eylül 2013, 23:27:26
Merhabalar.Konu Açılmışken Sorayım Bu Fft-dft İle Belli Frekansların Genliği İle Oynanabilirmi?Equalizer Gibi.
Başlık: Ynt: C ile FFT kodlama
Gönderen: z - 21 Eylül 2013, 23:58:30
100 Khz ile sample alan ADC var.
Ard arada 16 sample aliyorsunuz ve bu 16 "sample"i aldiktan  1 mili saniye sonra tum hesap kitap islemlerini bitiyorsunuz diyelim.

Bu sartlar altinda mercek altina alabileceginiz frekanslar hangi aralikta olabilir? Benim cihazim realtime anlamda hangi frekanslari izleyebilir?




mesaj birleştirme:: 22 Eylül 2013, 00:26:15

Most modern spectrum analyzers are now almost exclusively Hybrid Superheterodyne-FFT based giving a significant improvement in sweep time. However, even in such cases there is still processing time required to sample the spectrum and calculate the FFT. For this reason, both swept-tuned and FFT based analyser produce "blind time" meaning that while calculation of the spectrum is being performed, the instrument has gaps and misses information of the RF spectrum being applied to the RF front end.
A realtime spectrum analyser does not have any such blind time—up to some maximum span, often called the "realtime bandwidth". The analyser is able to sample the incoming RF spectrum in the time domain and convert the information to the frequency domain using the FFT process. FFT's are processed in parallel, gapless and overlapped so there are no gaps in the calculated RF spectrum and no information is missed.

http://en.wikipedia.org/wiki/Spectrum_analyzer (http://en.wikipedia.org/wiki/Spectrum_analyzer)
Başlık: Ynt: C ile FFT kodlama
Gönderen: Icarus - 22 Eylül 2013, 00:34:33
@berat23: Bazen en iyisi insanın kendisinin deneyip görmesidir, hem osiloskop'u hemde FFT'i pembe gürültü, veya benzeri bir gürültülye söylediğini teknikleri uygulayarak deneyin.

@z:
Öncelikle frekans çözünürlüğü 6.25kHz ediyor. Özetle sistem 1kHz ile 5kHz'i yada 13kHz ile 15kHz'i bir birinden ayırt edemiyor.
İkinci sorun ise yaklaşık 1ms'lik sinyalin sadece 160us'sini alıp bu kısmın periodik olarak tekrar ettiğini varsayıyoruz.
Bir noktada verileri bir window fonksiyonundan geçirmek bu problemi çözmeyecektir.

Bunları yok farz edelim, elde ettiğimiz spektrum'daki en yüksek frekans nedir ? Nyquist 50kHz olmalı der, fakat uygulamalar için rule-of-thumb 1/10 'nunu alın 10kHz

mesaj birleştirme:: 22 Eylül 2013, 00:36:49

@z: great explanation
Başlık: Ynt: C ile FFT kodlama
Gönderen: berat23 - 22 Eylül 2013, 13:10:18
deneyip görmelik bir durum yok, herşey açık. nyquist ne diyorsa doğrudur, nereden nasıl baktığın önemli. fourier açılımı malumunuz sinüslerin toplamı. sinyal saf sinüs olursa max. frekanslı sinüsün 2  katı olması doğru örnekleme için yeterli. sinyalin frekansı aslında içindeki sinüslerin frekansı değil. periyodiklik demek T zaman içinde sinyalin dalga biçiminin kendini tekrarlaması demek, bizim sinyalde frekans olarak tanımladığımız ise sinüsler. şimdi diyelim elimizde 1us içinde dalga biçimini tekrarlayan ama genlik formu kare dalga olan bir sinyal var. sinyalin frekansı 1mhz ama içindeki max. frekanslı sinüs bileşeni sonsuz frekansta . sonsuz diye birşey olamayacğı gibi ideal kare dalga da yok. o 10 kat meseleside bu max. frekanslı bileşenden geliyor, aslında 10 değil ne kadar yüksek olursa o kadar iyidir karemsi dalgalar için. yani nyquist ne diyorsa doğru, uygulamada da şaşmıyor. sadece yanlış yorumlanıyor/yorumluyorsunuz.
Başlık: Ynt: C ile FFT kodlama
Gönderen: Icarus - 22 Eylül 2013, 13:51:47
Alıntı yapılan: berat23 - 22 Eylül 2013, 13:10:18
o 10 kat meseleside bu max. frekanslı bileşenden geliyor, aslında 10 değil ne kadar yüksek olursa o kadar iyidir karemsi dalgalar için.
Sadece ilk mesajımı okusanız idda ettiğim şeyin bununla ilgisi olmadığını görürsünüz.
Olay kare dalga falan değil.

Alıntı yapılan: berat23 - 22 Eylül 2013, 13:10:18
deneyip görmelik bir durum yok,
Siz dizaynlarınızı 2fs olarak yaparsınız, zaten simulasyonlar varken prototip'lere gerek yok değil mi ?
Bir mühendis "denemeye gerek yok" diyorsa artık ne söylemek lazım bilemiyorum
Başlık: Ynt: C ile FFT kodlama
Gönderen: berat23 - 22 Eylül 2013, 14:16:30
@Icarus
ohm kanunu siz denediğinizde farklı mı çıkıyor ? ben bir mühendis olarak bildiğim yasaları denemem. bize mühendislik bilimsel metodlara dayanır diye öğrettiler, size ad-hoc dedilerse bilemiyorum.

kare dalga örneğimde harmoniklerin ne olduğunu çok iyi anlattım, kareden kastım içinde çokça harmonik olmasıydı. yoksa neredeyse tüm fiziksel sinyaller ideal değildir, sinüs bile olsa harmonikler vardır. 2fs de max. frekanslı sinüs için geçerlidir. cümlenin başını sonunu kesip kendinize uydurmayn. 10 kat muhabbetinin de bilimsel açıklamasını yaptım, orda nyquist sampling teorisine aykırı birşey yok, kalite-maliyet takasında varılmış bir kabullenme. 20fs ile örneklemek 10fsden iyidir desem illa 10 yeterlidir mi diyeceksiniz?

ayrıca diğer mesajlarınıza da baktım, sürekli insanlara o yanlış bu yanlış deyip birşey anlatmamışsınız. böyle devam edecekseniz tartışmayalım. bilginiz varsa, eğri doğru neyse söyleyin, bizde bilmiyorsak öğrenelim. derdiniz atışmaksa ben yokum.

Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 23 Eylül 2013, 01:54:40
Hocam bilgilendirmeleriniz için cok sağolun fakat burada sorun biz TÜRK ler olarak böyle birşeyi nasıl kendimiz yapabiliriz buna çözüm bulalım ben bir mühendis adayı olarak sizlerin yardımına ihtiyacm var
Başlık: Ynt: C ile FFT kodlama
Gönderen: z - 23 Eylül 2013, 02:09:36
Kendin yapmak istiyorsan temelini bileceksin.

Bu isin temeli nedir?

Isin icine elektronigi hic sokmadan matematiksel olarak kagit kalemle yapmayi becerebilirsen bunu digitale uyarliyabilirsin.

Soru: Farkli genlik ve frekansdaki sinusel sinyallerin toplamindan ibaret bir fonksiyonun zamanin degisimine karsin verdigi degerleri iceren numerik bir tablon var.

Sana diyorlarki al bu tabloyu ve bize fonksiyonu bul. (sinuslerin frekansini ve genliklerini bul)

Sen numerik verilerle ugrasmayacaksin. Sen matematik yontemi bulacaksin.

Bu soruna cevap getirebiliyorsan daha sonra bunu program haline getirmeyi denersin ve artik bilgisayar senin yerine numerik tabloyla ugrasir. Daha sonra da adamlar bu isi nasil hizlandirmanin yolunu bulmuslar onu ogrenirsin.

Ip ucu istersen

sin(a+b)=sin(a)cos(b)+sin(b)cos(a)
sin(a-b)=sin(a)cos(b)-sin(b)cos(a)

cos(a+b)=cos(a)cos(b)-sin(s)sin(b)
cos(a-b)=cos(a)cos(b)+sin(s)sin(b)

e^jx=cos(x)+jsin(x)

Başlık: Ynt: C ile FFT kodlama
Gönderen: berat23 - 23 Eylül 2013, 10:09:34
@Kaanx

hocam bence z'nin önerisine uyun, sizin yerinizde olsam uygulama yazmak yerine işin teorisini anlamaya bakardım.neyi bilip neyi bilmediğinizi bilmiyorum ama baştan örnekleme, fourier açılımı-transformu, fft diye kağıt kalem dener, sonra matlab gibi bir oramda fft uygulaması yazar, en son işlemciye atıp denerdim. o videolarda gördüklerin bence çok önemli değil, ne olduğunu anlamadıktan sonra ezbere yapmanın bir mantığı yok. sonra 10fs 20fs muhabbetine dönüyor. o yüzden zaman varken teoriye çalışmak daha iyi.
Başlık: Ynt: C ile FFT kodlama
Gönderen: Icarus - 23 Eylül 2013, 10:38:28
@Kaanx
Z'nin dediklerine uyun fakat unutmayın TextBook'lar size sadece bir fikri açıklamak için yazılmışlardır. Fiziksel dünya'nın matematiksel olarak modellenmesini anlatmazlar. Buna dikkat etmezsiniz ohm kanunun gerçek olduğunu ve çalıştığını düşünen mühendislere katılırsınız.

PS: Ohm gerçek mi değil mi tartışmalarına hiç girmeyeceğim. Eğer doğru olduğunu düşünüyorsanız bir fizikçiye veya bir RF Müh'e sorun.
Başlık: Ynt: C ile FFT kodlama
Gönderen: OptimusPrime - 23 Eylül 2013, 12:43:45
Icarus
elektronikte bir çok yerde lineer ve nonlineer kavramları var. mesela nonlineer bir sistemi lineer olarak modelleyip (smps gibi) buna bir kompanzatör (plant a) tasarlayabiliyoruz. bu bir yaklaşım şekli.

ohm kanunu da öyle. ohm deneysel yöntemlerle bir eşitlik buluyor fakat bulduğu şey aslında I-V nin lineer kabul edilmesi ile bulunan bir denklem. halbuki bu denklemin temelinde elektrik alanda mevcut ve ohm un denklemi elektrik alanın 2.59kV/cm yi geçmesinden sonra doğruluğunu yitiriyor ki mikro veya nano seviyelerdeki dirençlerin hesaplanamamasının temel nedeni de bu.

hal böyle olunca ohm kanunu tamamen gerçek dışıdır ve işe yaramaz diyemeyiz. ayrıca yerine kullanabileceğiz başka bir denklemde yok... :)


Başlık: Ynt: C ile FFT kodlama
Gönderen: berat23 - 23 Eylül 2013, 13:47:10
nasıl otomobillerin hareketi newton mekaniği ile modelleniyorsa burada bahsedilen devreler için ohm kanunu geçerlidir. ohm kanununun nonlineer yüklerde geçerli olmaması her kullanımının denenmesini gerektirmiyor. ayrıca bu yasalar uzaydan gelme dayatmalar değil, fenomenlere dayanıyor.

quantum mekaniği ile hareket ediyorsanız ona lafım yok.
Başlık: Ynt: C ile FFT kodlama
Gönderen: z - 23 Eylül 2013, 13:52:16
Bir direnç, içinden akım geçtiği için ısınır ve değer değiştirir. Bu durumda V=R*I bağıntısı karmaşık bir hal alır.

Bir direnç aynı zamanda endüktif ve kapasitif bileşenlere sahiptir. Bu da direncin yüksek frekansdaki davranışını ohm kanunu ile ifade edilemeyecek derecede zorlaştırır.

Fakat bunlar işin hikaye kısmı. Bizim meslekte pek çoğumuzun uğraştığı uygulamalarda toleranslar anormal derecede büyük. 1K da taksak çalışır 10K da taksak çalışır.

Nerede tolerans önemli nerede kapasitif, endüktif bileşenler önemli, nerede ısıl değişim önemli bunları bilmek lazım.
Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 23 Eylül 2013, 17:09:22
Alıntı yapılan: z - 23 Eylül 2013, 02:09:36
Kendin yapmak istiyorsan temelini bileceksin.

Bu isin temeli nedir?

Isin icine elektronigi hic sokmadan matematiksel olarak kagit kalemle yapmayi becerebilirsen bunu digitale uyarliyabilirsin.

Soru: Farkli genlik ve frekansdaki sinusel sinyallerin toplamindan ibaret bir fonksiyonun zamanin degisimine karsin verdigi degerleri iceren numerik bir tablon var.

Sana diyorlarki al bu tabloyu ve bize fonksiyonu bul. (sinuslerin frekansini ve genliklerini bul)

Sen numerik verilerle ugrasmayacaksin. Sen matematik yontemi bulacaksin.

Bu soruna cevap getirebiliyorsan daha sonra bunu program haline getirmeyi denersin ve artik bilgisayar senin yerine numerik tabloyla ugrasir. Daha sonra da adamlar bu isi nasil hizlandirmanin yolunu bulmuslar onu ogrenirsin.

Ip ucu istersen

sin(a+b)=sin(a)cos(b)+sin(b)cos(a)
sin(a-b)=sin(a)cos(b)-sin(b)cos(a)

cos(a+b)=cos(a)cos(b)-sin(s)sin(b)
cos(a-b)=cos(a)cos(b)+sin(s)sin(b)

e^jx=cos(x)+jsin(x)

Hocam DSP dersleri aldım DFT ve FFT görmedim kendi çalışmalarımda bunları aşmaya çalısıyorum teşekkür ederim bu dediklerniz sayesinde kafamda birkaç bişi oturdu. Genliği ve frekansı hesaplamayı oradan güce geçmeyi deneyebilirim. Fakat burada sorun şurada benim için gelen bir sesin nyquist hızında örneklenip Uygulamada 2.2 *Fö olarak alırsak bundan sonraki her bir örneğim benim için artık durağan bir süreç midir ? Ve bu aldıgım örneklerin mi Fourier dönüşümünü yapıcam ?
Başlık: Ynt: C ile FFT kodlama
Gönderen: mufitsozen - 23 Eylül 2013, 17:21:17
Alıntı yapılan: Kaanx - 23 Eylül 2013, 17:09:22
Hocam DSP dersleri aldım DFT ve FFT görmedim kendi çalışmalarımda bunları aşmaya çalısıyorum teşekkür ederim bu dediklerniz sayesinde kafamda birkaç bişi oturdu. Genliği ve frekansı hesaplamayı oradan güce geçmeyi deneyebilirim. Fakat burada sorun şurada benim için gelen bir sesin nyquist hızında örneklenip Uygulamada 2.2 *Fö olarak alırsak bundan sonraki her bir örneğim benim için artık durağan bir süreç midir ? Ve bu aldıgım örneklerin mi Fourier dönüşümünü yapıcam ?

nyquist teorik olarak ornekleme hizinin en az 2f olmasini soyler ama pratikte ornekleme frekansini cok daha fazla tutmak ihtiyatli olur.

resimde referans sinyal ve 1f, 2f, ve 3f ornekleme ile cikabilecek sonuclar gorulebilir

(http://www.eeworld.com.cn/uploadfile/Test_and_measurement/uploadfile/201203/20120326051436668.jpg)

Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 23 Eylül 2013, 17:38:27
Alıntı yapılan: mufitsozen - 23 Eylül 2013, 17:21:17
nyquist teorik olarak ornekleme hizinin en az 2f olmasini soyler ama pratikte ornekleme frekansini cok daha fazla tutmak ihtiyatli olur.

resimde referans sinyal ve 1f, 2f, ve 3f ornekleme ile cikabilecek sonuclar gorulebilir

(http://www.eeworld.com.cn/uploadfile/Test_and_measurement/uploadfile/201203/20120326051436668.jpg)

Yani en yakın değerleri Nyquist ile yakalamakta oldugumuzu kanıtladık hocam burada anladım. Peki size bir sorum olucak. Şimdi şekildeki resimde referans bir sinyalimiz mevcut zannerdersem ki zaman domeninde dogru muyum ? . Şimdi ben bu sinyalden atıyorum 256 örnek almak istedim. bu aldıgım örnekleri bir bufferda mı biriktiriyorum eger öyleyse aldıgım örnek sinyaller zaman domeninden cıkmıs olmuyor mu ?
Başlık: Ynt: C ile FFT kodlama
Gönderen: mufitsozen - 23 Eylül 2013, 17:50:19
Alıntı yapılan: Kaanx - 23 Eylül 2013, 17:38:27
Yani en yakın değerleri Nyquist ile yakalamakta oldugumuzu kanıtladık hocam burada anladım. Peki size bir sorum olucak. Şimdi şekildeki resimde referans bir sinyalimiz mevcut zannerdersem ki zaman domeninde dogru muyum ? . Şimdi ben bu sinyalden atıyorum 256 örnek almak istedim. bu aldıgım örnekleri bir bufferda mı biriktiriyorum eger öyleyse aldıgım örnek sinyaller zaman domeninden cıkmıs olmuyor mu ?

sayin @z hocam, imdakk! bilmedigim yerden soru soruyorlar!  :)

valla benim bu konularda bilgim cooook eskide kaldi, bunama durumlrida olabilir ama, samplelar belli bir zaman araliginda alindigina gore time domainden cikip, uzay domainnemi gidecek bunlar? isinlanacakmi ? :P
Başlık: Ynt: C ile FFT kodlama
Gönderen: berat23 - 23 Eylül 2013, 18:00:06
aldığın sample'lar aslında time domaininde oluyor. ft yaparsan frekans domainine geçersin.

fft ya da stft(aslında yapacağın)  almak istersen buffer'da tutacaksın ama bu konu şimdilik senin açından birşey ifade etmiyor.

Başlık: Ynt: C ile FFT kodlama
Gönderen: OptimusPrime - 23 Eylül 2013, 18:16:13
mufitsozen
pratikte ohm kanunu çatırdadı sıra nyquist te heralde  :D

pratik ile teori hiçbir zaman çelişmez. çelişiyorsa biz yanlış anlamışız veya uygulamışızdır.

nyquist teoreminde sinüsoidal bir işaretin örneklenmesinden bahsediyor ki ispatıda yapılmış bir teoremdir bu. basit olarak matlab ile de denenebilir. f freknasında bir sinüs alın 2f ile örnekleyin fourier dönüşümünü alın, işareti göreceksiniz hatta ters dönüşümle yeniden giriş işaretini elde edebilirsiniz.

yani nyquist kare dalgayı 2f ile örnekleyin örneklediğiniz noktaları cetvelle birleştirin aha size yine kare dalga oldu demiyor. ama bizim yeniden kare dalgayı cetvelle birleştirerek elde etme gibi bir düşüncemiz varsa, genelde 10f den fazla bir örnekleme frekansı tavsiye edilir....



Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 23 Eylül 2013, 19:21:50
Alıntı yapılan: berat23 - 23 Eylül 2013, 18:00:06
aldığın sample'lar aslında time domaininde oluyor. ft yaparsan frekans domainine geçersin.

fft ya da stft(aslında yapacağın)  almak istersen buffer'da tutacaksın ama bu konu şimdilik senin açından birşey ifade etmiyor.

Hocam atıyorum şuan ben kısaca bunu--> http://tr.wikipedia.org/wiki/Ses_sinyali (http://tr.wikipedia.org/wiki/Ses_sinyali) okudgumda insan sesinin frekansını görebiliyorum. atıyorum elimde 150 hz lik bir bir ses dalgam var bunu  2.2*150 hz = 310 hz de örnekledim Fö= 310 hz dedik
ben burada 12 bitlik bir adc var bende 12*310 hz = 3720 bps yapıyor dimi hocam buraya kadar dogru muyum ? :) Burdan sonra şunları ögrenıyorum kı saniye 310 tane örnek alıcam  ve 12 bitlik adc oldugu içinde SNR=6.02*n --> 6.02*12=72,24 dB bir gürültüm olucak dogru mudur hocam ?. şimdi ben bu elimdeki verileri nasıl kullanıcam ? bunlar bana ne sağlayacak
Başlık: Ynt: C ile FFT kodlama
Gönderen: berat23 - 23 Eylül 2013, 19:58:22
elindeki verilerden ne yapacaksın ?
Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 23 Eylül 2013, 19:59:24
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 :)
Başlık: Ynt: C ile FFT kodlama
Gönderen: 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.
Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 23 Eylül 2013, 23:04:57
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 :)
Başlık: Ynt: C ile FFT kodlama
Gönderen: 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...
Başlık: Ynt: C ile FFT kodlama
Gönderen: 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;

(https://lh6.googleusercontent.com/-e-eEpO5OUh4/UkGkpsqCAAI/AAAAAAAAANo/QO11Sv3poLU/w432-h576-no/fft_1.JPG)

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;
(https://lh3.googleusercontent.com/-0cr6Nk-zLfA/UkGlA2Nel4I/AAAAAAAAAOE/VIsq0Z7OIsY/w432-h576-no/fft_2.JPG)

Buda 8 örnek alınsa işlem nasıl yapılıyora örnek,
tabiki işlem aynı;
(https://lh4.googleusercontent.com/-eDgpj9E7Svk/UkGlfC7yjVI/AAAAAAAAAOk/XcHzvZY_FZg/w768-h576-no/fft_3.JPG)


Buda benim toparladıklarım (53 mb)
https://www.dropbox.com/s/7wymlmc4gw0l6r9/FFT%20EMBEDDED.rar (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
Başlık: Ynt: C ile FFT kodlama
Gönderen: Kaanx - 25 Eylül 2013, 03:32:31
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;

(https://lh6.googleusercontent.com/-e-eEpO5OUh4/UkGkpsqCAAI/AAAAAAAAANo/QO11Sv3poLU/w432-h576-no/fft_1.JPG)

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;
(https://lh3.googleusercontent.com/-0cr6Nk-zLfA/UkGlA2Nel4I/AAAAAAAAAOE/VIsq0Z7OIsY/w432-h576-no/fft_2.JPG)

Buda 8 örnek alınsa işlem nasıl yapılıyora örnek,
tabiki işlem aynı;
(https://lh4.googleusercontent.com/-eDgpj9E7Svk/UkGlfC7yjVI/AAAAAAAAAOk/XcHzvZY_FZg/w768-h576-no/fft_3.JPG)


Buda benim toparladıklarım (53 mb)
https://www.dropbox.com/s/7wymlmc4gw0l6r9/FFT%20EMBEDDED.rar (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 ?
Başlık: Ynt: C ile FFT kodlama
Gönderen: berat23 - 25 Eylül 2013, 10:00:59
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 (http://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm)
Başlık: Ynt: C ile FFT kodlama
Gönderen: OptimusPrime - 25 Eylül 2013, 10:41:05
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...




Başlık: Ynt: C ile FFT kodlama
Gönderen: RaMu - 25 Eylül 2013, 20:30:19
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.
Başlık: Ynt: C ile FFT kodlama
Gönderen: OptimusPrime - 26 Eylül 2013, 09:24:20
RaMu
peki kendi yazdığın fonksiyonların doğru olup olmadığını neyle kıyaslayıp anlıyorsun???
Başlık: Ynt: C ile FFT kodlama
Gönderen: RaMu - 26 Eylül 2013, 21:02:21
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

(https://lh3.googleusercontent.com/-oB-zaTcgfN8/UkR0Nq4xCeI/AAAAAAAAAPU/WJjrynfFxwc/w849-h454-no/p8+dspic+fft+simu.JPG)
(https://lh3.googleusercontent.com/-WZalNbEOCjA/UkR0g6aCmZI/AAAAAAAAAP4/QBrE4AcMkBk/w600-h576-no/p8+dspic+fft+hata+message.JPG)

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 (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.
Başlık: Ynt: C ile FFT kodlama
Gönderen: jabbathehutt - 16 Ocak 2016, 20:35:06
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?
Başlık: Ynt: C ile FFT kodlama
Gönderen: jabbathehutt - 16 Ocak 2016, 20:35:36
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?
Başlık: Ynt: C ile FFT kodlama
Gönderen: jabbathehutt - 17 Ocak 2016, 09:38:06
İmajiner kısımları dikkate almasak ne olur?
Başlık: Ynt: C ile FFT kodlama
Gönderen: z - 17 Ocak 2016, 19:22:57
imajiner kısımlar sinüs bileşenler. Sinüs bileşenleri almazsan orjinal sinyalden uzaklaşırsın.

Cos ve sin sinyalleri almaktaki amaç fazı tutturmak. Orjinal sinyal sin(wt+fi) gibi fazı kayık bir sinyalse bunu ancak cos ve sin ile ifade edebilirsin.
Başlık: Ynt: C ile FFT kodlama
Gönderen: jabbathehutt - 17 Ocak 2016, 19:48:42
Teşekkürler.
Peki twiddle faktöründe euler katsayısını kullanırken ortaya çıkan reel ve 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?