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

Хочу задать несколько разных оконных функций при вычислении БПФ в своем устройстве. И уже на треугольном озадачился. Возьмем для простоты БПФ по 8 точкам. Трегольное окно спадает от 1 в середине до 0 на краях. Какой отсчет будет умножен на 1 - 3-й, 4-й, оба, никакой? Ведь вершина треугольника попадает между отсчетами - слева 4 и справа 4. Понятно, что при 1024 точках это почти не важно, но все равно напрягает. Тот же вопрос распространяется и на все остальные окна.

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


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

Я так думаю что вот так -> 0 1 2 3 4 3 2 1 или так -> 1 2 3 4 3 2 1 0 будет правильно.

Изменено пользователем ivan219

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


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

Вот здесь что-то пишут, но не могу понять, что. :rolleyes:

http://en.wikipedia.org/wiki/Window_function

Симметричное окно мне нравится больше.

И на 0 крайнюю точку умножать... жалко.

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


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

На ноль умножать и не надо.

 

Для этих целей всегда пользуюсь Матлабом.

Например, для 8-точечного окна матлаб-функция triang(8) выдаёт следующие коэффициенты:

0.1250

0.3750

0.6250

0.8750

0.8750

0.6250

0.3750

0.1250.

 

Там же, в справке есть и формулы для всех окон. Для треугольного, кстати, они разные для чётного и нечётного количества точек.

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


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

2 ViKo:

Вам точно нужно именно БПФ? Дело в том, что БПФ становится "быстрым" в сравнении с классическим ДПФ при числе точек > 64.

Зачем вообще вычислять спектр (через ДПФ или БПФ) по 8 точкам?

А если точек много, то умножать на 0 по краям не жалко.

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


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

V_G:

Дело в том, что БПФ становится "быстрым" в сравнении с классическим ДПФ при числе точек > 64.

 

Это вы погорячились...

Даже для 4-х точек бпф быстрое в сравнении с явным дпф.

Вообще-то для любого числа точек >2 можно построить алгоритм, который будет быстрее явного дпф.

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


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

БПФ быстрее ДПФ. 8 точек - это только для примера. Делаю на 1024 (в принципе, #define пределяет).

 

Для этих целей всегда пользуюсь Матлабом.

Например, для 8-точечного окна матлаб-функция triang(8) выдаёт следующие коэффициенты:

...

Там же, в справке есть и формулы для всех окон. Для треугольного, кстати, они разные для чётного и нечётного количества точек.

Такие коэффициенты и выбрал, симметричные. Мне не нужно их в виде таблицы иметь. Пусть микроконтроллер сам вычисляет по формуле (уже вычисляет, но я еще не смотрел результаты).

 

Возникает вопрос, какой же коэффициент (как он там называется, ослабления?) получается при использовании окон.

upd. Ага, сложить все к-ты и поделить на размер БПФ. Так, похоже...

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


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

Вот готовая формула, которую использует Матлаб, для расчёта треугольного окна:

 

http://www.mathworks.com/help/signal/ref/t...ighlight=triang

 

Здесь можно найти формулы для других окон:

 

http://www.mathworks.com/help/signal/windows.html

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


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

По поводу коэффициента при использовании окна. там, поскольку энергия, как я помню, cумма квадратов коэффициентов окна должна быть равна 1, чтобы окно не влияло. Если не получится - напишите в личку, я в свое время это делал точно, посмотрю материалы старинные.

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


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

Я вот такое использую. Коэффициент альфа и форму окна подбирал в матлабе во время анализа реальных данных, характерных для исследуемого сигнала. Думаю, принцип понятен.

 

%% windowing

alpha = 4.05

for i=1:FFT_N_SAMPLES

%Gaussian:

tmp_n = abs(i - (FFT_N_SAMPLES)/2);

tmp = alpha * tmp_n / (FFT_N_SAMPLES/2);

coeff = exp(-0.5 * tmp*tmp);

data_win(i) = data_in(i) * coeff;

end

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


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

Сделал, что мог. Использую Matlab. Окна по умолчанию получаются симметричными, что мне нравится. Результат расчетов выводится в файл, который включу в проект. Только запятую лишнюю в конце каждого массива нужно удалить.

FFT_N = 8;
WindHann = hann(FFT_N);
WindHamm = hamming(FFT_N);
WindBart = bartlett(FFT_N);

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, '/* Hamming Window */\n');
fprintf(fid, 'static const float WindHamm[] = {\n');
fprintf(fid, '  %E, %E, %E, %E,\n', WindHamm);
fprintf(fid, '};\n\n');

fprintf(fid, '/* Bartlett Window */\n');
fprintf(fid, 'static const float WindBart[] = {\n');
fprintf(fid, '  %E, %E, %E, %E,\n', WindBart);
fprintf(fid, '};\n\n');

fclose(fid);

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


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

Можно отказаться от правильного использования MATLAB и сделать явный цикл по выводу каждого элемента массива или в строку нескольких элементов. И проверку на открытие файлов лучше делать.

 

Рабочий порезаный пример вывода:

clc
clear

DataLength = 64;

fdirstr = 'C:\\tmp\\';
filestr = 'data';
fileextstr = '.h';

datafname = strcat(fdirstr,filestr,fileextstr);
[fid1,message] = fopen(datafname,'w');
if fid1 == -1
errordlg(message,'FILE OPEN ERROR');
else
fprintf(fid1,'/***********************************************************/');
fprintf(fid1,'\n/* Date: %s*/',datestr(now,0));
fprintf(fid1,'\n/***********************************************************/\n');
str = strcat(filestr,'_H_');
fprintf(fid1,'\n#ifndef %s',upper(str));
fprintf(fid1,'\n#define %s\n',upper(str));

fprintf(fid1,'\nconst uint32_t data[%i] = \n\t{',DataLength);
for i=1:DataLength
% здесь вывод того, что требуется, для примера поэлементно.
fprintf(fid1,'\n\t\t0x%04X',i);
% немного сложнее будет с расчетом необходимых индексов и форматом при выводе нескольких элементов массива в одной строке
if i ~= DataLength
fprintf(fid1,',');
end
end
fprintf(fid1,'\n\t};\n\n');
fprintf(fid1,'#endif /* %s */\n',upper(str));
end

if fid1 ~= -1
status = fclose(fid1);
if status == -1
errstr = strcat('Can not close file: ',datafname);
errordlg(errstr,'FILE CLOSE ERROR');
end
end

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


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

Трегольное окно спадает от 1 в середине до 0 на краях. Какой отсчет будет умножен на 1 - 3-й, 4-й, оба, никакой? Ведь вершина треугольника попадает между отсчетами - слева 4 и справа 4. Понятно, что при 1024 точках это почти не важно, но все равно напрягает. Тот же вопрос распространяется и на все остальные окна.
Hi there :)

 

Это писофкейк! :) Симметричная функция, по определению, обладает свойством f(x) = f(-x), для сдвинутого на (N-1)/2 интервала и целых x это свойство симметрии станет просто f(k) = f(N-k-1). Отсюда, при N=8, следует что f(3) = f(4), а в случае нечётного N есть единственный индекс без пары, k = (N-1)/2.

 

Оконная функции вовсе не обязательно должна обнуляться на границе интервала; достаточно быть нормированной, что бы мощность сигнала не менялясь, т.е. SUM(k=0, N-1) w(k) = 1.

 

 

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


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

Оконная функции вовсе не обязательно должна обнуляться на границе интервала; достаточно быть нормированной, что бы мощность сигнала не менялясь, т.е. SUM(k=0, N-1) w(k) = 1.

Все оконные функции БПФ приближаются к 1 в середине диапазона, и к 0 на краях (чтобы ослабить разрывы). Почему сразу не нормируются, как вы предлагаете? - видимо, из-за того, что числа слишком малыми становятся. Сейчас, для плавающей запятой это уже не важно...

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


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

Все оконные функции БПФ приближаются к 1 в середине диапазона, и к 0 на краях (чтобы ослабить разрывы). Почему сразу не нормируются, как вы предлагаете? - видимо, из-за того, что числа слишком малыми становятся. Сейчас, для плавающей запятой это уже не важно...
К нулю по краям - для ослабления боковых лепестков, задавить sinc() от прямоугольного окна.

 

Формула нормировки - я её в математическом смысле имел, а так, при работе с фиксированной точкой, конечно, имеет смысл сохранять как можно больше битиков в промежуточных числах, а нормировать и округлять в самом конце. Консенсус. :)

 

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


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

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

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

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

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

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

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

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

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

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