| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Някой правил ли е FFT с PIC18 :) http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=3896 |
Страница 1 от 1 |
| Автор: | emil_v_k [ Пет Мар 16, 2007 5:47 pm ] |
| Заглавие: | Някой правил ли е FFT с PIC18 :) |
Опитвам се да направя спектрален анализатор (с не много висока точност) и алгоритмите за FFT, които намерих из интернет като че ли не са много подходящи за целта и затова моля някой да сподели своят опит. 10х |
|
| Автор: | nickich [ Пет Мар 16, 2007 6:43 pm ] |
| Заглавие: | |
по-добре постни кода, та да може да се коментира, и кажи с какъв компилатор го компилираш... |
|
| Автор: | zaphod [ Пет Мар 16, 2007 7:29 pm ] |
| Заглавие: | |
не разбрах какво те тревожи. ако искаш да намериш алгоритъм за ФФТ в който няма обръщане на число, забрави. всъщност, алгоритъма за ФФТ е един, не виждам защо е множественото число. |
|
| Автор: | emil_v_k [ Пет Мар 16, 2007 11:48 pm ] | |||||||||
| Заглавие: | ||||||||||
Множественото число е, защото алгориъмът има няколко разновидности както и различни оптимизации. |
||||||||||
| Автор: | Vilo [ Пон Мар 19, 2007 12:59 pm ] |
| Заглавие: | |
Някяде из архивите application notes на Мicrochip имаше FFT за PIC17. |
|
| Автор: | MYXATA [ Вто Мар 20, 2007 3:35 pm ] |
| Заглавие: | |
emil_v_k, трябва да почнеш с това: 1. какво точно искаш да правиш с бързо преобразувание на фурие 2. от кой ред 3. величината която ще анализираш колко бързо се изменя във времето 4. с каква честота дискретизираш и тогава идват въпросите с оптимизация на кода щото както ти се каза алгоритъма е един, а вече как ще го напишеш си зависи от теб, ако ползваш готов код трябва да го разбереш а оптимизация се пише за конкретен процесор! и трябва да си готов за асемблерско писане |
|
| Автор: | emil_v_k [ Пон Апр 09, 2007 11:40 am ] |
| Заглавие: | :) |
FFT-то го направих, но за съжаление за 128 точки ми отнема 80ms при положение, че работя с PIC18F452 на 40Mhz. Дайте идея как да го оптимизирам inline sint16 fix_mpy(sint16 a, sint16 b) { sint32 c; if(!a) return 0; if(!b) return 0; c = ((sint32) a * (sint32) b) >> 14; b = c & 0x01; a = (c >> 1) + b; return (sint16) a; } void fix_fft(sint16 fr[], sint16 fi[], sint16 m) { uint16 i_counter, j_counter, mr, nn, l, k, istep, n; sint16 qr, qi, tr, ti, wr, wi; n = 1 << m; mr = 0; nn = n - 1; for(m = 1; m <= nn; ++m) { l = n; do { l >>= 1; } while(mr + l > nn); mr = (mr & (l-1)) + l; if(mr <= m) continue; tr = fr[m]; fr[m] = fr[mr]; fr[mr] = tr; } l = 1; k = LOG2_N_WAVE-1; while(l < n) { istep = l << 1; for(m = 0; m < l; ++m) { j_counter = m << k; wr = signed_shift(Sinewave[j_counter + signed_shift(N_WAVE, 2)], 1); wi = signed_shift(-Sinewave[j_counter], 1); for(i_counter = m; i_counter < n; i_counter += istep) { j_counter = i_counter + l; tr = fix_mpy(wr, fr[j_counter]) - fix_mpy(wi, fi[j_counter]); ti = fix_mpy(wr, fi[j_counter]) + fix_mpy(wi, fr[j_counter]); qr = signed_shift(fr[i_counter], 1); qi = signed_shift(fi[i_counter], 1); fr[j_counter] = qr - tr; fi[j_counter] = qi - ti; fr[i_counter] = qr + tr; fi[i_counter] = qi + ti; } } --k; l = istep; } } |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|