Як ефективно обчислити лише низькі коефіцієнти FFT з нульовим навантаженням


14

У мене є алгоритм, що нуль прошиває послідовність до 4N, робить FFT і використовує лише N найнижчих частот N точок із створених 4N.

Це здається великою кількістю марної роботи, будь-які ідеї, як це можна зробити швидше?


@Dilip. Я буду використовувати бібліотеки FFTW або IMKL. Я, звичайно, міг би використати свою бібліотеку киссффтів, але вона починається зі швидкістю, що втрачає швидкість порівняно з іншими
Марк Боргердінг

2
Я видалив коментар, на який ви відповіли, оскільки мав намір сказати частоту децимації, але натомість написав децимацію. Але дивіться на схему метеликів тут. Якщо ви запишете якийсь код на перших двох етапах для -FFT, щоб врахувати велику кількість нулів і пропустити відповідні множення, ви можете 4 рази викликати підпрограму бібліотеки FFT для N -FFT, в якій вводяться вектори є "повними". Звичайно, вам потрібно лише N / 4 виходів з кожного виклику підпрограми. 4N4NN/4
Діліп Сарват

Відповіді:


2

Якщо у вас є лише кілька бункерів, то наступне може бути для вас дуже ефективним:
1. Просто робіть DFT на кожній необхідній вам частоті.
2. Використовуйте алгоритм Ґерцеля для кожної розглянутої частоти.


Марк сказав, що йому потрібно бункерів з 4 N , тому 1), здається, не є розумним варіантом. Алгоритм Ґерцеля має такі переваги, як он-лайн обчислення при отриманні даних, невелике зберігання тощо, але потребує 2 N + 4 множення на бін, тоді як кожен бін, обчислений як поліномальна оцінка за правилом Горнера, потребує лише N множення. Таким чином, 2) теж не є особливо розумним варіантом. N4N2N+4N
Діліп Сарват

Ви маєте рацію, читаючи питання, я якось пропустив деталі. Поки я відповідав, я думав: "Боже, було б непогано знати, скільки баків він хоче ..." Здогадайтесь, я повинен перечитати питання, перш ніж відповісти.
Яків

2

Нульова прокладка до 4X довжини, обчислення більш тривалого FFT, а потім використання лише нижньої 1/4 бункера дає майже однакові результати віконної інтерполяції Sinc вихідної довжини FFT.

Тому просто використовуйте оригінальну довжину FFT та інтерполюйте за допомогою 3-фазного ядра інтерполяції Sinc з відповідною шириною вікна.


0

Нульова підкладка у часовій області дає вам рішення високої частоти, але не надає нової інформації, тому вона забезпечує по суті інтерполяцію в частотній області. Залежно від характеру ваших сигналів та необхідної точності, ви зможете отримати додаткові точки частоти за допомогою регулярного FFT з N точок та зробити відповідну інтерполяцію (лінійна, сплайн, pchip, sinc тощо).


Нехай - поліном (можливо, зі складними коефіцієнтами x i ) ступеня N - 1 . Оцінюємо його в N точках α n , 0 n N - 1, де α = exp ( - j 2 π / N ) - N Nx(z)=i=0N1xizixiN1Nαn,0nN1α=exp(j2π/N)N-корінь єдності для отримання чисел X n = x ( α n ) . Це значення x ( z ) у N однаково розташованих точках одиничного кола. Ми дійсно хочемо - це значення x ( z ) при β n , 0 n N - 1, де β = exp ( - j 2 π / 4 N ) , якіNXn=x(αn)x(z)Nx(z)βn,0nN1β=exp(j2π/4N) точок напершому квадратіодиничного кола. Я не бачу, як буде працювати лінійна, сплайнована тощо інтерполяція. Будь ласка, поясніть. N
Діліп Сарват

β4=αx(β4k)x(β4k)=x(αk)

Я підозрюю, що було б важко зробити гідну інтерполяцію швидше, ніж робити більш велику ЗПТ.
Марк Боргердінг

Скажімо, у вас є частота дискретизації 128 точок FFT та 12800 Гц. 128-бальні FFT дають значення в 0 Гц, 100 Гц, 200 Гц, 300 ГГц і т. Д. Те, що роблять нульові прокладки, - це збільшити роздільну здатність частоти до 0 Гц, 25 Гц, 50 Гц, 100 Гц і т.д. Це може розглядатися як проблема інтерполяції. Мені, точно математично, потрібно зробити кругову синхронну інперполяцію 128-го порядку. Це, звичайно, не варто турбуватися, але залежно від застосування та точності вимагає значно меншої інтерполяції порядку
Гільмар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.