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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Масштаб 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
bahurin
сообщение Nov 11 2009, 04:59
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347



Цитата(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.
Go to the top of the page
 
+Quote Post
ivan219
сообщение Nov 11 2009, 15:04
Сообщение #3


Местный
***

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



Значит 1 / N * Sqrt(Sqr(Re) + Sqr(Im)) а в некоторых книгах я встречал что 2 / N * Sqrt(Sqr(Re) + Sqr(Im))
Go to the top of the page
 
+Quote Post
bahurin
сообщение Nov 11 2009, 15:08
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347



Цитата(ivan219 @ Nov 11 2009, 18:04) *
Значит 1 / N * Sqrt(Sqr(Re) + Sqr(Im)) а в некоторых книгах я встречал что 2 / N * Sqrt(Sqr(Re) + Sqr(Im))

И где же это было написано? Автора и название в студию!
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Nov 11 2009, 20:03
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

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

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


Успехов! Rob.
Go to the top of the page
 
+Quote Post
bahurin
сообщение Nov 12 2009, 08:11
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347



Цитата(RobFPGA @ Nov 11 2009, 23:03) *
Приветствую!

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

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


Успехов! Rob.

не пудрите людям мозги! А если я возьму окно Хемминга или Блэкмана? Причем тут это? мы говорим о ДПФ а не окнах сглаживания.
Go to the top of the page
 
+Quote Post
ivan219
сообщение Nov 12 2009, 12:25
Сообщение #7


Местный
***

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



Блин всё равно не понятно ведь если одна полуволна равно -1 другая 1 то амплитуда равна двум почуму вы говорите что 1????

Сообщение отредактировал ivan219 - Nov 12 2009, 12:26
Go to the top of the page
 
+Quote Post
anton
сообщение Nov 12 2009, 19:37
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 622
Регистрация: 31-07-04
Пользователь №: 422



О как все запушено sad.gif

2 Это скорее пик то пик значение.
Go to the top of the page
 
+Quote Post
АНТОН КОЗЛОВ
сообщение Nov 13 2009, 06:14
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 344
Регистрация: 3-01-09
Из: УФА
Пользователь №: 42 894



Частотных отсчетов в в 2 раза меньше, чем временных, отсюда двойка.
Go to the top of the page
 
+Quote Post
D.I.M.A
сообщение Nov 13 2009, 06:46
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 26-08-08
Из: Москва
Пользователь №: 39 824



Доброго всем дня. Думаю, что вопрос в следующем. Если нет, прошу прощения.

В качестве примера:
DFT над действительным гармоническим колебанием даст "амплитуду" A*N/2. DFT над комплексным гармоническим колебанием даст "амплитуду" A*N.
Go to the top of the page
 
+Quote Post
bahurin
сообщение Nov 13 2009, 08:30
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347



Цитата(D.I.M.A @ Nov 13 2009, 09:46) *
Доброго всем дня. Думаю, что вопрос в следующем. Если нет, прошу прощения.

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


Не совсем правильно. A*N бдует если сигнал не просто комплексный а ТОЛЬКО если комплексный сигнал является АНАЛИТИЧЕСКИМ, т.е. не содержит составляющих в отрицательной области частот (правой половине DFT) .
Go to the top of the page
 
+Quote Post
thermit
сообщение Nov 13 2009, 08:49
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Дискретный аналог теоремы парсеваля. Сумма квадратов входов дпф и сумма квадратов выходов дпф относятся как 1/N. N - размер дпф. Двойка появляется, если нужна половина дпф (если входной сигнал вещественный половина мощности распределяется по отрицательным частотам и амплитудный спектр является четным).
Go to the top of the page
 
+Quote Post
анатолий
сообщение Nov 13 2009, 09:43
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 10-12-05
Из: Украина
Пользователь №: 12 052



Проще всего - подаем на вход синусоиду с действующим значением 1 Вольт.
Измеряем эту синусоиду на выходе ДПФ.
Нормируем результаты, чтобы было среднеквадратичное значение 1 Вольт.
Это учитывает и ДПФ, и окно на входе.
А для вычислений безотносительно Вольт, это все равно - лишь бы после ДПФ и ОДПФ результаты совпадали с исходными данными.
Поэтому попадается в первоисточниках деление ДПФ на корень из N.
Go to the top of the page
 
+Quote Post
thermit
сообщение Nov 13 2009, 10:25
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Для наглядности:
Имеем последовательность периода синусоиды амплитудой 1 из N точек.


сумма квадратов будет 0.5 *N
Согласно теореме парсеваля, сумма квадратов выхода дпф будет 0.5*N*N. Мощность одной гармоники 0.25*N*N
Амплитуда одной гармоники sqrt(0.25*N*N) = 0.5*N
Go to the top of the page
 
+Quote Post
Xenia
сообщение Nov 13 2009, 13:11
Сообщение #15


Гуру
******

Группа: Модератор 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

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

 


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


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