Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Масштаб FFT
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
ivan219
В разных книгах написанно по разному где 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)????
bahurin
Цитата(ivan219 @ Nov 11 2009, 00:19) *
В разных книгах написанно по разному где 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)????


cranky.gif Есть сигнал s(t) = A*cos(f*t). Его амплитуда равна А. Т.е. Если сигнал меняется от -1 до 1 то его амплитуда равна 1 laughing.gif а не 2. После вычисления амплитудного спектра путём MAG = Sqrt(Sqr(Re) + Sqr(Im)) получите пик на частоте f значением N*A. Делите весь спектр на N и получаете реальную амплитуду равную 1. что такое K я вообще не понял. Могу лишь предположить что вы хотите получить действующее значение напряжения а не амплитуду.Если да то поделите еще на корень из двух и получите 0.707.
ivan219
Значит 1 / N * Sqrt(Sqr(Re) + Sqr(Im)) а в некоторых книгах я встречал что 2 / N * Sqrt(Sqr(Re) + Sqr(Im))
bahurin
Цитата(ivan219 @ Nov 11 2009, 18:04) *
Значит 1 / N * Sqrt(Sqr(Re) + Sqr(Im)) а в некоторых книгах я встречал что 2 / N * Sqrt(Sqr(Re) + Sqr(Im))

И где же это было написано? Автора и название в студию!
RobFPGA
Приветствую!

Еще нужно учитывать коэффициент окна Kw которое используется при FFT.

Для Hann окна Kw=0.4950 поэтому для нормировки и берут 2/N


Успехов! Rob.
bahurin
Цитата(RobFPGA @ Nov 11 2009, 23:03) *
Приветствую!

Еще нужно учитывать коэффициент окна Kw которое используется при FFT.

Для Hann окна Kw=0.4950 поэтому для нормировки и берут 2/N


Успехов! Rob.

не пудрите людям мозги! А если я возьму окно Хемминга или Блэкмана? Причем тут это? мы говорим о ДПФ а не окнах сглаживания.
ivan219
Блин всё равно не понятно ведь если одна полуволна равно -1 другая 1 то амплитуда равна двум почуму вы говорите что 1????
anton
О как все запушено sad.gif

2 Это скорее пик то пик значение.
АНТОН КОЗЛОВ
Частотных отсчетов в в 2 раза меньше, чем временных, отсюда двойка.
D.I.M.A
Доброго всем дня. Думаю, что вопрос в следующем. Если нет, прошу прощения.

В качестве примера:
DFT над действительным гармоническим колебанием даст "амплитуду" A*N/2. DFT над комплексным гармоническим колебанием даст "амплитуду" A*N.
bahurin
Цитата(D.I.M.A @ Nov 13 2009, 09:46) *
Доброго всем дня. Думаю, что вопрос в следующем. Если нет, прошу прощения.

В качестве примера:
DFT над действительным гармоническим колебанием даст "амплитуду" A*N/2. DFT над комплексным гармоническим колебанием даст "амплитуду" A*N.


Не совсем правильно. A*N бдует если сигнал не просто комплексный а ТОЛЬКО если комплексный сигнал является АНАЛИТИЧЕСКИМ, т.е. не содержит составляющих в отрицательной области частот (правой половине DFT) .
thermit
Дискретный аналог теоремы парсеваля. Сумма квадратов входов дпф и сумма квадратов выходов дпф относятся как 1/N. N - размер дпф. Двойка появляется, если нужна половина дпф (если входной сигнал вещественный половина мощности распределяется по отрицательным частотам и амплитудный спектр является четным).
анатолий
Проще всего - подаем на вход синусоиду с действующим значением 1 Вольт.
Измеряем эту синусоиду на выходе ДПФ.
Нормируем результаты, чтобы было среднеквадратичное значение 1 Вольт.
Это учитывает и ДПФ, и окно на входе.
А для вычислений безотносительно Вольт, это все равно - лишь бы после ДПФ и ОДПФ результаты совпадали с исходными данными.
Поэтому попадается в первоисточниках деление ДПФ на корень из N.
thermit
Для наглядности:
Имеем последовательность периода синусоиды амплитудой 1 из N точек.


сумма квадратов будет 0.5 *N
Согласно теореме парсеваля, сумма квадратов выхода дпф будет 0.5*N*N. Мощность одной гармоники 0.25*N*N
Амплитуда одной гармоники sqrt(0.25*N*N) = 0.5*N
Xenia
Полагаю, что нужно разбираться с конкретным алгоритмом 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-ой гармоники. Отсюда и вопрос о масштабе сразу прояснится.
ivan219
for( int i=0; i < N; i++) data[i] = 1000 * sin(2*M_PI/N*i); выдает 1414.21
АНТОН КОЗЛОВ
Цитата(thermit @ Nov 13 2009, 11:49) *
Дискретный аналог теоремы парсеваля. Сумма квадратов входов дпф и сумма квадратов выходов дпф относятся как 1/N. N - размер дпф. Двойка появляется, если нужна половина дпф (если входной сигнал вещественный половина мощности распределяется по отрицательным частотам и амплитудный спектр является четным).

О чем и речь. Кратко и внятно.
Xenia
Цитата(ivan219 @ Nov 13 2009, 21:24) *
for( int i=0; i < N; i++) data[i] = 1000 * sin(2*M_PI/N*i); выдает 1414.21


Это означает, что нужно еще поделить на корень из 2. Корень их двух как раз равен 1.41421356237309505, что, с учетом погрешности вычислений, дает все цифры вашего числа. А когда поделите, то получите точно 1000, как и должно быть.
Для полной уверенности поверьте на другом N.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.