Перейти к содержанию
    

Окна имеют коэффициент ослабления, показывающий, во сколько раз при БПФ будет отличаться постоянная составляющая, по сравнению с прямоугольным окном. Но при этом значения всех остальных спектральных составляющих тоже изменяются. Как можно верить этим окнам? И, вообще, ДПФ?

Я, правда, экспериментировал с 16-точечным БПФ. Подал точно рассчитанный по формуле сигнал, с частотами, точно укладывающимися в размер БПФ. Поэтому прямоугольное окно дает мне точные амплитуды спектральных составляющих. Остальные же окна выдают амплитуды, отличающиеся в несколько раз от поданных.

Может, при размере БПФ 1024 такого явления не будет? Сомневаюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Окна имеют коэффициент ослабления, показывающий, во сколько раз при БПФ будет отличаться постоянная составляющая, по сравнению с прямоугольным окном. Но при этом значения всех остальных спектральных составляющих тоже изменяются. Как можно верить этим окнам? И, вообще, ДПФ?

Я, правда, экспериментировал с 16-точечным БПФ. Подал точно рассчитанный по формуле сигнал, с частотами, точно укладывающимися в размер БПФ. Поэтому прямоугольное окно дает мне точные амплитуды спектральных составляющих. Остальные же окна выдают амплитуды, отличающиеся в несколько раз от поданных.

Может, при размере БПФ 1024 такого явления не будет? Сомневаюсь.

 

FFT c окнами это всего лишь банк фильтров на картинке по ссылке

https://ccrma.stanford.edu/~jos/sasp/Downsa...ilter_Bank.html

Окно - ИХ КИХ ФНЧ. Хотите точно амплитуду синуса мерить, используйте фильтры с плоскими вершинами АЧХ перекрывающимися, так называемые flat top window, в общем обсуждалось уже на форуме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотите точно амплитуду синуса мерить, используйте фильтры с плоскими вершинами АЧХ перекрывающимися, так называемые flat top window, в общем обсуждалось уже на форуме.

У меня есть окно FlatTop. Для 16-точечного БПФ тоже сильно врет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня есть окно FlatTop. Для 16-точечного БПФ тоже сильно врет.

 

Ну так всё в ваших руках, в один фильтр попадает несколько гармоник, имеем соответствующий результат, амплитудой отдельной гармоники это не является.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы получать правильный ответ с окнами, нужно брать корень из суммы квадратов некоторой части отсчетов около рассчитываемой гармоники. Если хвосты от гармоник перекрываются, то точный расчет невозможен. Сколько брать отсчетов - зависит от формы окна и требуемой точности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Типа резюме: способы с наложением окон хороши, но только для выборок статистически определенных сигналов. На детерминированных сигналах они тоже работают, но совсем иначе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я именно на целом количестве периодов и экспериментировал (вместо нулей подставлял числа - амплитуды). Окна для того и нужны, чтобы уменьшить последствия непериодичности.

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);
  }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал, что мог. Использую 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: Руками удалю. Но, может, есть элегантный способ?

 

Сам придумал.

fseek(fid, -2, 0);
fprintf(fid, '\n};\n');

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...