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

 
 
> Окна БПФ
ViKo
сообщение Oct 2 2013, 12:55
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Хочу задать несколько разных оконных функций при вычислении БПФ в своем устройстве. И уже на треугольном озадачился. Возьмем для простоты БПФ по 8 точкам. Трегольное окно спадает от 1 в середине до 0 на краях. Какой отсчет будет умножен на 1 - 3-й, 4-й, оба, никакой? Ведь вершина треугольника попадает между отсчетами - слева 4 и справа 4. Понятно, что при 1024 точках это почти не важно, но все равно напрягает. Тот же вопрос распространяется и на все остальные окна.
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 22)
ViKo
сообщение Oct 15 2013, 21:02
Сообщение #16


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Окна имеют коэффициент ослабления, показывающий, во сколько раз при БПФ будет отличаться постоянная составляющая, по сравнению с прямоугольным окном. Но при этом значения всех остальных спектральных составляющих тоже изменяются. Как можно верить этим окнам? И, вообще, ДПФ?
Я, правда, экспериментировал с 16-точечным БПФ. Подал точно рассчитанный по формуле сигнал, с частотами, точно укладывающимися в размер БПФ. Поэтому прямоугольное окно дает мне точные амплитуды спектральных составляющих. Остальные же окна выдают амплитуды, отличающиеся в несколько раз от поданных.
Может, при размере БПФ 1024 такого явления не будет? Сомневаюсь.
Go to the top of the page
 
+Quote Post
petrov
сообщение Oct 16 2013, 09:18
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Цитата(ViKo @ Oct 16 2013, 01:02) *
Окна имеют коэффициент ослабления, показывающий, во сколько раз при БПФ будет отличаться постоянная составляющая, по сравнению с прямоугольным окном. Но при этом значения всех остальных спектральных составляющих тоже изменяются. Как можно верить этим окнам? И, вообще, ДПФ?
Я, правда, экспериментировал с 16-точечным БПФ. Подал точно рассчитанный по формуле сигнал, с частотами, точно укладывающимися в размер БПФ. Поэтому прямоугольное окно дает мне точные амплитуды спектральных составляющих. Остальные же окна выдают амплитуды, отличающиеся в несколько раз от поданных.
Может, при размере БПФ 1024 такого явления не будет? Сомневаюсь.


FFT c окнами это всего лишь банк фильтров на картинке по ссылке
https://ccrma.stanford.edu/~jos/sasp/Downsa...ilter_Bank.html
Окно - ИХ КИХ ФНЧ. Хотите точно амплитуду синуса мерить, используйте фильтры с плоскими вершинами АЧХ перекрывающимися, так называемые flat top window, в общем обсуждалось уже на форуме.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 16 2013, 11:30
Сообщение #18


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(petrov @ Oct 16 2013, 12:18) *
Хотите точно амплитуду синуса мерить, используйте фильтры с плоскими вершинами АЧХ перекрывающимися, так называемые flat top window, в общем обсуждалось уже на форуме.

У меня есть окно FlatTop. Для 16-точечного БПФ тоже сильно врет.
Go to the top of the page
 
+Quote Post
petrov
сообщение Oct 16 2013, 11:45
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Цитата(ViKo @ Oct 16 2013, 15:30) *
У меня есть окно FlatTop. Для 16-точечного БПФ тоже сильно врет.


Ну так всё в ваших руках, в один фильтр попадает несколько гармоник, имеем соответствующий результат, амплитудой отдельной гармоники это не является.
Go to the top of the page
 
+Quote Post
Alex11
сообщение Oct 17 2013, 15:33
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Чтобы получать правильный ответ с окнами, нужно брать корень из суммы квадратов некоторой части отсчетов около рассчитываемой гармоники. Если хвосты от гармоник перекрываются, то точный расчет невозможен. Сколько брать отсчетов - зависит от формы окна и требуемой точности.
Go to the top of the page
 
+Quote Post
Tiro
сообщение Oct 17 2013, 21:59
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Маленькое примечание. Есть некоторые методические тонкости, которые почему-то все забывают.

1) ПФ от сигнала конечной длительности вычисляется в предположении, что это и был период образа сигнала. Это не так, это первое. Склейте хотя бы имеющуюся выборку с собой и увидите, от чего берете ПФ.

2) Наложение окна во временной области приводит к свертке ПФ сигнала и окна в спектральной. Но это не означает, что мы просто отфильтровали целиком все ПФ сигнала при помощи некоего фильтра. ПФ это расчет по каждой частотной компоненте и именно каждая компонента фильтруется оконной функцией, вычисленной для данной компоненты. Иначе окна не улучшали бы ПФ в полосе сигнала.

Типа резюме: способы с наложением окон хороши, но только для выборок статистически определенных сигналов. На детерминированных сигналах они тоже работают, но совсем иначе.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 18 2013, 10:43
Сообщение #22


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Я именно на целом количестве периодов и экспериментировал (вместо нулей подставлял числа - амплитуды). Окна для того и нужны, чтобы уменьшить последствия непериодичности.
Код
void Sig_load(void) {
  volatile float *pSig = Sig;
  for (uint32_t i = 0; i < FFT_N; i++) {
    *pSig++ = 1
            + 0 * sin(1 * i * 2 * PI / FFT_N)
            + 0 * sin(2 * i * 2 * PI / FFT_N + 3 * PI / 4)
            + 0 * sin(4 * i * 2 * PI / FFT_N);
  }
}
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 22 2014, 09:58
Сообщение #23


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(ViKo @ Oct 4 2013, 14:59) *
Сделал, что мог. Использую Matlab. Окна по умолчанию получаются симметричными, что мне нравится. Результат расчетов выводится в файл, который включу в проект. Только запятую лишнюю в конце каждого массива нужно удалить.
Код
FFT_N = 8;
...
fid = fopen('FFT_Windows.h', 'w');

fprintf(fid, '/* Hann Window */\n');
fprintf(fid, 'static const float WindHann[] = {\n');
fprintf(fid, '  %E, %E, %E, %E,\n', WindHann);
fprintf(fid, '};\n\n');
...
fprintf(fid, '};\n\n');
fclose(fid);

Поможите, люди добрые, убрать запятую в конце массива в текстовом файле, созданном этим скриптом! В языке C она лишняя.
Если сложно, то не надо. rolleyes.gif Руками удалю. Но, может, есть элегантный способ?

Сам придумал.
Код
fseek(fid, -2, 0);
fprintf(fid, '\n};\n');
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:47
Рейтинг@Mail.ru


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