|
Масштаб FFT |
|
|
|
Nov 13 2009, 13:11
|

Гуру
     
Группа: Модератор 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-ой гармоники. Отсюда и вопрос о масштабе сразу прояснится.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|