Автор
|
Тема: БПФ
|
Valery |
опубликован 03-12-2001 14:08 MSK
Вот балуюсь с БПФ с помощью библиотеки FFTN (http://www.fftw.org/) делаю простейшую вещь (только начал эксперименты, поэтому сильно ногами не пинайте), как написано в примере. Срабатывает вроде все нормально, меня немного результат обескураживает. Делаю так: 1. заполняю входной массив в цикле in[i].re = 1000.0*sin(i*2*pi/N) + 800.0*sin(i*8*pi/N + 1); in[i].im = 0.0;2. получаю выходной, вывожу его тоже в цикле :) complex<double> o(out[i].re, out[i].im); if (abs(o) > 0.1) printf ("=== %16lf %16lf\n", abs(o), arg(o)); А вот и результат: #гар. амплитуда сдвиг фаз 1 500000.002298 -1.570796 4 400000.001161 -0.570797 (Беру данные только из первой половины выходного массива, поскольку спектр во второй половине зеркален по отношению к первой половине.) Сдвиг фаз между этими двумя гармониками похож на правду - 1 радиан. Соотношение между амплитудами тоже похоже, непонятно вот что: 1. я вроде бы ожидал что величина гармоник должна быть 1000 и 800. 2. почему сдвиг первой гармоники не нулевой? Потыкайте носом чего я забыл из математики (давно это было).
|
DmitryRyvkin
|
опубликован 04-12-2001 11:48 MSK
Я вообще-то тоже не спец по БПФ, хоть и занимался не очень давно. Что касается сдвига на -1.57 так кажется традиционно Re часть имеется ввиду с косинусом, а у вас синус. Что касается амплитуд, хм. Так а какой объем входных данных вы заполняли ? Ведь это же зависит от этого. PS если не очень большая киньте мне плиз на dmitry_rv@mail.ru я использую другую, может ваша лучше
|
rodion
|
опубликован 04-12-2001 19:22 MSK
Все правильно ты же не учитываеш вторую половину, поэтому и получаещ в два раза меньше. |
DmitryRyvkin
|
опубликован 04-12-2001 20:14 MSK
:-O А где видно , что в два ? |
DmitryRyvkin
|
опубликован 04-12-2001 20:20 MSK
Пардон, въехал. Только все равно не два :) |
Valery
|
опубликован 04-12-2001 20:47 MSK
2DmitryRyvkin: Если небольшая - что? библиотека? так я написал вроде, что использую FFTN. Если сама программулька - то конечно маленькая, могу прислать. Она такая маленькая , что половину ее я наверное уже привел. :) Заполнял массив из N чисел - входной, получил такой же по размеру выходной массив гармоник. Непонятно все-таки с амплитудами - разница в самом деле не в два раза. 2rodion: Может ли быть проверкой если я по полученным основным гармоникам вновь попытаюсь построить сигнал? Естественно используя все 4 гармоники. Попробую на досуге. |
rodion
|
опубликован 05-12-2001 11:27 MSK
Насчет проверки мысль правильная. 1 500000.002298 -1.570796 4 400000.001161 -0.570797 По моему в полне допустимая погрешность.
|
rodion
|
опубликован 07-12-2001 14:33 MSK
Я тут пригляделся к количеству нулей... Существует прямое и обратное преобразование Фурье. Короче говоря при ДПФ или БПФ произвоидится нормировка. |
Valery
|
опубликован 07-12-2001 22:50 MSK
Вот с этого пунктика чуть поподробнее, плиз. Чем БПФ отличается от ДПФ? И что такое нормировка? (без приколов) |
rodion
|
опубликован 10-12-2001 11:59 MSK
БПФ это быстрое преобразование ДПФ -это дискретное. БПФ рабоает только если размер массива 2^n. ДПФ с любым. БПФ это быстрая реализация ДПФ. Если смотреть на преобразование Фурье аналогое то перед интегралом стоит 1/Т, где Т период итегрирования. То же самое и в дисктреном виде. |
Valery
|
опубликован 10-12-2001 18:24 MSK
Так, с этим понятно. Осталось узнать что такое нормировка. |
rodion
|
опубликован 13-12-2001 11:41 MSK
Приведу формулы для ДПФ и ОДПФ N-1 ДПФ X(k)=E x(n)*Wn^(nk), 0<=k<=N-1 n=0 N-1 ОДПФ x(n)=1/N*E X(k)*Wn^(nk), 0<=n<=N-1 n=0 где Wn=exp(-j2PI/N), x(n)- сигнал, X(k)-спектр БПФ это реализация ДПФ зачет количества уменьшения умножений с помощью "бабочки". По этому амплитуды гармоник не должны быть равны амплитудам синусоид. Но ты можешь перенести нормировку из ОДПФ в ДПФ. К статии по моему у тебя не БПФ а ДПФ (размер массива 100?) |
lamo
|
опубликован 13-12-2001 19:05 MSK
я почему отвечаю ... чето знакомое в заголовке. БПФ. это которая серия что мне там в оттрочестве приснилас ? это я за нее рад. т.е. бес*(звоздачка епт)изды рад. т.е. оченна рад. зы. или я рогнал ...
|
DmitryRyvkin
|
опубликован 14-12-2001 05:22 MSK
Может я конечно и не прав.. Но БПФ можно и не на степенях 2-ки делать, обычно остаток нулями заливают. Быстрей выходит все равно чем ДПФ в лоб |
Valery
|
опубликован 14-12-2001 23:14 MSK
2rodion: сенькаю, появлюсь на работе, поразбираюсь, а пока в отпуске я. :) интересно, кстати, а сама эта библиотека разбирается когда она может именно _БПФ_ применить, исходя из размера, надо будет в доке на нее почитать. 2lamo: ни фига не понял. обознались, вы, барин, не торговец я, извозом занимаюсь.... (с) ну помните, небось :) |