FFT dönüşümü hakkında

Başlatan Mucit23, 31 Ocak 2014, 00:08:32

Mucit23

Hocam ben o dediginiz problemi yaşamamak icin iki adet buffer kullandım.  Dma işini bitirince FFT islemine başlamam için start sinyali geliyor. Bende hemen bufferdeki degerleri ikinci buffere taşıyıp fft işlemine giriyorum.

Dediginiz gibi kodlar cok fazla optimize edilmiş.  Bahsettiğiniz problem şuanda bende de var.Bu yuzden dsp library kullanmam gerekiyor. En sağlamı böyle.

Bir iki makale buldum. Bakalım yarın bu konularda biraz çalışmayı düşünüyorum.

OptimusPrime

Mucit23

son eklediğin video da en soldaki değer dc bileşen mi???
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 ||

Mucit23

Evet hocam, 0. değer DC bileşen olması lazım.

OptimusPrime

kulaklık çıkışında dc bileşen yoktur dolayısı ile ya örnekleri pencerelemeden fft alıyorsun yada fft yi yanlış olıyorsun yada ikisinde de sorun var...
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 ||

Mucit23

Hocam, ADC değerini olduğu gibi FFT rutinine yolluyorum. Pencereleme dediğiniz olay nedir?

OptimusPrime

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 ||

Mucit23

#66
Desene işimiz var...  :o :o
Başa gelen çekilir... Devam  :-X

mesaj birleştirme:: 20 Şubat 2014, 00:13:06

Proje Dosyamda CMSIS içerisinde DSP_Lib bulunmakta.
DSP Lib içerisinde birçok kütüphane var. Ben Target Optinous, C++ Sekmesinde derlenmesi için DSP_Lib klasörünü keile tanıttım.

Bundan sonra istediğim fonksiyonları kullanabilmem için ne yapmam gerekir. Burada tıkanıyorum.
Mesela burada bir kod parçacığı buldum
https://github.com/nabilt/STM32F4-Discovery-Firmware/blob/master/Libraries/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/arm_fft_bin_example_f32.c

Kulanılan fonksiyonlar sırasıyla arm_cfft_radix4_init_f32(), arm_cfft_radix4_f32(), arm_cmplx_mag_f32(), arm_max_f32()

Bu kodları bende denemek istiyorum. Kendi projemde kullanabilmem için ne yapmam gerekiyor? Özellikle proje ağacına nasıl bir ekleme yapmam gerekiyor bunu merak ediyorum.
Yardım ederseniz sevinirim..

berat23

real time fft o kadar basit birşey değil, gördüğüm kadarıyla temeliniz de yok. bence önce biraz işin teorisini çalışın, window function vs., kodlama kolay işler.

window function olarakta normal bufferlasanız veriyi rectangle window olur, frekans tepkisi sizin için önemli olmadığından rectangle durumu kurtarır, hatta bu aslında stft olur ye neyse, dediğim gibi biraz teorisine bakın(hatta baya bakın).

Mucit23

Doğrudur Hocam Temelim zayıf, Ama ilk çalışmalarımı matlabda yaptım. Burada FFT fonksiyonu nedir, Nasıl çalışır gibi soruların cevabını buldum. Yani temel seviyede bilgim var.
Matlabdaki kodları olduğu gibi STM32'ye taşıyınca çok ağır çalıştığını gördüm.  Sqrt, Sin, Cos ve Log gibi fonksiyonlardan dolayı. Bu yüzden Hazır kütüphane kovalamaya başladım.

Aslında şuan kullandığım kodlar 10bit ADC de çok iyi çalışıyor. 12 bit ADC'de ise giriş hassasiyetleştiği için okunana değerler çok oynak oluyor. Ben okunun değerleri direk FFT'ye tabi tuttuğum için sonuçta epeyce hareketli oluyor. Bence Overflow durumları olmuyor. FFT fonksiyonun içindeki bütün değişkenler 16 bit işaretli tam sayı.

Bu sorun @OptimusPrime'nın söylediği pencereleme meselesi olabilir.

ADC çözünürlüğünü 10Bit yaptığımda DC bileşende görünmüyor. Sanırım hassasiyet düşüyor ondan.

Ben dediğiniz gibi Şu Window_Function konularını araştırayım şimdilik ama bu sırada keil'deki DSP_Lib problemimi çözmem gerekiyor. DSP_Lib'de istediğim fonksiyonları mainde kulanabilmem için ne yapmam gerekir. Birisi kısaca anlatsa çok güzel olur.

Mucit23


Mucit23

İki gündür şu DSP'library konusunda araştırma yapıyorum. Birşey öğrendim deneme yapmam lazım ama Keil yine önüme taş koydu.

aşağıdaki hatayı alıyorum.

.\Output\Discovery.axf: Error: L6218E: Undefined symbol arm_cfft_radix4_init_q31 (referred from main.o).


Kütüphaneleri kullanmak için main programıma #include "arm_math.h" tanımalamasını yaptım. Derlemede problem yok. Fakat arm_cfft_radix4_init_q31 Fonksiyonunu kullandığımda yukarıdaki gibi bir hata alıyorum.

Bu hata ile daha önce karşılaşmıştım. Yanlışım yoksa eğer "Kullanılacak olan kütüphane dosyalarının Proje ağacına eklenmemesinden kaynaklanıyor" diye biliyorum. Sorunum burada bunu çözersem yani kodu derleyebilirsem gerisini hallederim.

DSP_Lib'de kulandığım proje dosyalarını, Proje ağacına nasıl eklemem gerekiyor? Proje ağacında Yeni bir grup ekleyip içerisine DSP_library'de kullandığım proje dosyalarını eklersem eğer çok fazla hata alıyorum..

Bu problemi nasıl çözerim? 

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?
İmajiner kısımları dikkate almasak ne olur?

Diğer sorumda Twiddle faktörünün dışarıda hesaplanımasıyla ilgili. Twiddle değerlerini kod içerisinde hesaplatmaktansa dışarıda nasıl hesaplatabiliriz? Bazı kodlamalarda bu değeri doğrudan reel sayısal bir değer olarak hesaplamışlar ama nasıl hesapladıklarını anlayamadım.