2016-04-01 44 views
1

'da çakışan sonuçlar Bir STM32L4 mikroişlemcisini kullanarak bir FFT hesaplamaya çalışıyorum ama garip sonuçlar alıyorum. Bir SD karttan .wav dosyasında okurum, dolguyu kaldırın ve bir dizide 1024 bayt veri depolayın. Bu verinin, bilgisayardaki bir hex editöründe aynı wav dosyasını açarak doğru olduğunu onaylıyorum. Matlab'da FFT'yi hesapladığımda ve büyüklüğünü alırken, giriş sinüs dalgasının frekansına karşılık gelen frekans kutusu eşleşiyor. Bu benim C kodumda geçerli değil (kullandığım Keil hata ayıklayıcısında görüldüğü gibi). ARM DSP kütüphaneleri tarafından verilen değerler ile MatLab'da üretilen değerler arasında, bir exmaple için, MatLab = 5.2'de bin [0], C = 131246'da bin [0] arasında bir korelasyon yoktur. Ben FFT iki farklı versiyonunu denedim (... düzenleme bakınız) ve aşağıda ikisi de ekleriz:ARM DSP kitaplıklarını kullanarak bir FFT hesaplarken ve MatLab

/* Carry out an FFT on the (correctly formatted) input data */ 
arm_cfft_f32(&arm_cfft_sR_f32_len1024, inputBuffer, IFFTFLAG, BRFLAG); 
/* Calculate the complex magnitude of the FFT */ 
arm_cmplx_mag_f32(inputBuffer, outputBuffer, FFTSIZE); 

kaldırılmış kodu:

arm_cfft_radix4_instance_f32 S; 
arm_cfft_radix4_init_f32(&S, FFTSIZE, IFFTFLAG, BITREVERSEFLAG); 
arm_cfft_radix4_f32(&S, inputBuffer); 
arm_cmplx_mag_f32(inputBuffer, outputBuffer, FFTSIZE); 

yılında İkisi sonuç aynı (yanlış) değerler. C 'de yapılan tüm ön işlemlerin doğru olması, Re [0], Im [0], Re [1], Im [1], ..., Re [1023 şeklinde düzenlenmiş FFTSIZE * 2 dizisi oluşturdum. ], Im [1023].

Herhangi bir fikir veya yardım çok takdir edilecektir! :)

DÜZENLEME: DC bin dışında, iki hesaplama arasındaki değerlerin aslında birbiriyle ilişkili olduğunu fark ettim. , yani her iki hesaplama için de bin 47 en büyük değere sahiptir (bu, 22.05kHz'de örneklenmiş bir 1kHz sinüs dalgasından dolayı anlamlıdır). ARM DSP kitaplıklarının, kutuların çıkışlarını neden bu kadar çok ölçeklendirdiği konusunda bir fikriniz var mı?

+0

Ne tür bir hata? –

+0

@OliverCharlesworth C dilinde oluşturulan tüm değerler matlab komut dosyamdan daha büyük. Örnek olarak ilk 10 tane kutuyu listeleyeceğim. C: çöp kutusu [0] - 131486, hazne [1] - 413.7, hazne [2] - 410, hazne [3] - 415, hazne [4] - 408. Matlab: hazne [0] - 5.2, hazne [1] - 5.2, çöp kutusu [2] - 5.3, çöp kutusu [3] - 5.2, çöp kutusu [4] - 5.3. –

+0

@OliverCharlesworth Değerlerin birbiriyle ilişkili olduğunu fark ettim (örn. Her iki hesaplama için bin 48 en büyük değerdir), sadece C'nin tüm sonuçları büyük ölçüde ölçeklenir. Buna neden olabilecek bir fikrin var mı? –

cevap

0

arm_cfft_f32, 32 bit float örnek verileri gerektirir. Oysa bir .wav dosyası genellikle 16 bit küçük endian işaretli tamsayı örnekleri içerir.

+0

Düşünceleriniz oradaki dönüşümlerle dinamik aralığı kaybediyor mu? – rts1

+0

@ rts1 Sanırım, int16 arabellekleri float işlevlerine geçtiğinde veri tipinin punned olduğunu söylüyor. – user3528438

+0

@ hotpaw2 Doğru olabileceğini düşünüyorum. Aslında .wav'mdaki veriler 8-bit. Her bir örneği float32_t dosyasına döktüğüm ve verileri gereken formata biçimlendirdiğimi düşündüğüm bir fonksiyon yarattım ama belki de düşündüğüm gibi davranmıyor olabilir. [Kodumu buraya koymaya teşebbüs etmek için gidiyorum.] (Http://pastebin.com/176BEJF2) Bu işleve bir göz atabilir misiniz ve düşündüğüm gibi davranıyorsa bana haber ver (8-bit girişini alarak) veri ve yüzer bir dizi sıfırlar ile arayarak)? Teşekkürler. –