реклама на сайте
подробности

 
 
> Масштаб FFT
ivan219
сообщение Nov 10 2009, 21:19
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 350
Регистрация: 16-11-08
Пользователь №: 41 680



В разных книгах написанно по разному где 1 / N, 2 / N. Если зделать FFT потом вычислить амплитуду путём MAG = Sqrt(Sqr(Re) + Sqr(Im)) то у нас получится какоето значение зависящее от N. Но если предположем возмём синтезируем сигнал Sin(fn) т.е. апплитуда получается от -1 до 1 т.е. 2 так вот если зделать FFT то унас получится не 2 но если поделить MAG / N то унас получится постоянное значение не зависимое от N но не то.

Вот и возникает вопрос на какой коэффициент K нужно умножать (MAG / N) * K, деление на N это факт но вот каким должно быть K ???

Ну вот если К = 1 то апплитуда равно 0.707 что явоно не верно. Если К = 2 то 1.4241 среднеквадратическое от 2 ближе к истине если К= 2 * Sqrt(2) то амплитуда равно 2 т.е. ее реальный размах от -1 до 1


Что является истиной К = 2, К = 2 * Sqrt(2)????

Сообщение отредактировал ivan219 - Nov 10 2009, 21:24
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Nov 13 2009, 13:11
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Полагаю, что нужно разбираться с конкретным алгоритмом FFT, а не рассматривать вопрос о масштабном множителе в отрыве от этой информации. В зависимости от применяемой модифицикации алгоритма масштабный множитель действительно может отличаться в два раза.

Дело тут в том, что FFT-преобразование по своей природе комплексное, однако чаще всего наши исходные данные являются строго действительными и не содержат в себе мнимой части (например, данные от АЦП). Из-за этого могут существовать "тупой" и "умный" алгоритмы FFT, отличающиеся между собой возможностью учета того, что исходные данные действительные.

"Тупой алгоритм" попросту приписывает к массиву данных еще массив такой же длины, заполненный нулями, который будет выполнять роль нулевой мнимой части. После чего на этих двух массивах запускается алгоритм комплексного FFT. В результате его получаем "бабочку": в действительной части результата (cos-части) имеем строго зеркальную картину - в первой половине (до N/2) расположены cos-коэффициенты, а во второй половине они же в обратном порядке; во мнимой части результата (sin-части) таже самая история, только зеркальные коэффициенты имеют противоположный знак. Когда таким результатом пользуются, то используют коэффициенты до N/2, а на остальное внимания не обращают, считая это мусором.

"Умный алгоритм" экономит память, но более трудоемок в реализации. В отличие от "тупого" алгоритма он не заводит дополнительный массив под мнимую часть, а также не оставляет после себя зеркальный мусор. Поэтому его чаще используют в МК, где память в дефиците. "Умный алгоритм" поступает иначе. Он не создает отсутствующую мнимую часть, а просто использует первую половину исходных данных, как действительную часть, а вторую половину - как мнимую. Первичный результат такого FFT-преобразования получается, конечно же, неправильным, но из него можно извлечь правильный результат хитрым способом. В этом случае половинки получаются уже не зеркальными, а правильный результат из них можно выделить, если вычислять полусуммы и полуразности между отражениями. На двойку тут обычно не делят для скорости, из-за чего получают масштаб вдвое больший, чем при использовании "тупого алгоритма".

Чтобы не заниматься анализом алгоритма (тем более, если не вы сами его составляли), проще всего заполнить массив исходных данных тестовой кривой - например чистой синусоидой с амплитудой 1000:

for( int i=0; i < N; i++) data[i] = 1000 * sin(2*M_PI/N*i);

А потом применить к этому массиву данных ваш алгорим FFT и посмотреть, какую амплитуду он выдаст для 1-ой гармоники. Отсюда и вопрос о масштабе сразу прояснится.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ivan219   Масштаб FFT   Nov 10 2009, 21:19
- - bahurin   Цитата(ivan219 @ Nov 11 2009, 00:19) В ра...   Nov 11 2009, 04:59
- - ivan219   Значит 1 / N * Sqrt(Sqr(Re) + Sqr(Im)) а в некотор...   Nov 11 2009, 15:04
|- - bahurin   Цитата(ivan219 @ Nov 11 2009, 18:04) Знач...   Nov 11 2009, 15:08
- - RobFPGA   Приветствую! Еще нужно учитывать коэффициент ...   Nov 11 2009, 20:03
|- - bahurin   Цитата(RobFPGA @ Nov 11 2009, 23:03) Прив...   Nov 12 2009, 08:11
- - ivan219   Блин всё равно не понятно ведь если одна полуволна...   Nov 12 2009, 12:25
- - anton   О как все запушено 2 Это скорее пик то пик знач...   Nov 12 2009, 19:37
- - АНТОН КОЗЛОВ   Частотных отсчетов в в 2 раза меньше, чем временн...   Nov 13 2009, 06:14
- - D.I.M.A   Доброго всем дня. Думаю, что вопрос в следующем. Е...   Nov 13 2009, 06:46
|- - bahurin   Цитата(D.I.M.A @ Nov 13 2009, 09:46) Добр...   Nov 13 2009, 08:30
- - thermit   Дискретный аналог теоремы парсеваля. Сумма квадрат...   Nov 13 2009, 08:49
|- - АНТОН КОЗЛОВ   Цитата(thermit @ Nov 13 2009, 11:49) Диск...   Nov 14 2009, 06:34
- - анатолий   Проще всего - подаем на вход синусоиду с действующ...   Nov 13 2009, 09:43
- - thermit   Для наглядности: Имеем последовательность периода ...   Nov 13 2009, 10:25
- - ivan219   for( int i=0; i < N; i++) data[i] = 1000 * sin(...   Nov 13 2009, 18:24
- - Xenia   Цитата(ivan219 @ Nov 13 2009, 21:24) for(...   Nov 14 2009, 17:12


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 05:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01359 секунд с 7
ELECTRONIX ©2004-2016